[{"data":1,"prerenderedAt":73},["ShallowReactive",2],{"$f39iyd36owv2kg":3},{"href":4,"title":5,"description":6,"kind":7,"mark":7,"planned":8,"contributors":9,"provenance":7,"html":10,"headings":11},"\u002Fdocs\u002Fmcp\u002Ftools","MCP tools","Every tool the OS's MCP server offers, generated from the tool catalog.",null,false,[],"\u003Cp>\u003Cem>Generated from the MCP tool catalog (\u003Ccode>apps\u002Fmcp\u002Fsrc\u002Ftool-catalog.ts\u003C\u002Fcode>). Do not edit by hand.\u003C\u002Fem>\u003C\u002Fp>\n\u003Ch2 id=\"os-list-runs\">\u003Ccode>os.list_runs\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>List the enterprise's runs, newest first, one page at a time. Each run carries its status, task (id, name, slug), the member it runs as, its input, and when it was created, started and finished. The response is { data, total, page, limit, pages }.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Argument\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>status\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string, one of \u003Ccode>pending\u003C\u002Fcode>, \u003Ccode>queued\u003C\u002Fcode>, \u003Ccode>running\u003C\u002Fcode>, \u003Ccode>waiting_on_gate\u003C\u002Fcode>, \u003Ccode>waiting_on_run\u003C\u002Fcode>, \u003Ccode>paused_spend\u003C\u002Fcode>, \u003Ccode>succeeded\u003C\u002Fcode>, \u003Ccode>failed\u003C\u002Fcode>, \u003Ccode>cancelled\u003C\u002Fcode>, \u003Ccode>skipped_overlap\u003C\u002Fcode>, \u003Ccode>blocked\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>Only runs in this status.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>taskId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>Only runs of this task.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>live\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>boolean\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>true for only runs still in progress: not finished, and not blocked or paused on spend.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>page\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>integer, at least 1\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>The page to read, from 1. Defaults to 1.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>limit\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>integer, 1 to 200\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>Runs per page, up to 200. Defaults to 25.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>GET\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Fruns\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>runs:read\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"os-get-run\">\u003Ccode>os.get_run\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>One run's status, why it stopped (blockedReason, when it is blocked), task id and input, and its last eight events. Not found for another enterprise's run.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Argument\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>runId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The run id.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>GET\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Fruns\u002F:runId\u002Fos-tool\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>runs:read\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"os-list-blockers\">\u003Ccode>os.list_blockers\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>What is stopping work right now, as the Blockers page shows it: failed runs not yet cleared (one page, with failedTotal counting them all), stalled, blocked and spend-paused runs, stopped pipelines, missing model tiers, exhausted LLM capacity, task definition problems, and teams with no lead, no metric or an overdue retro. Read-only: nothing is retried or cleared. Waiting gates are not here; use os.list_open_gates.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Argument\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>failedPage\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>integer, at least 1\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>The page of failed runs to read, from 1. Defaults to 1. A page past the last reads the last.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pageSize\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>integer, 1 to 100\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>Failed runs per page, up to 100. Defaults to 100 in a run, and to 20 over the API.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>GET\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Fblockers\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>blockers:read\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"os-list-open-gates\">\u003Ccode>os.list_open_gates\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Every gate waiting on a decision, oldest first: the run and task it belongs to, the tool call it holds (toolName, payload), its summary when the run wrote one, who owns the decision, when it times out, and whether the run can be sent back with changes requested. Read-only: deciding a gate is not a tool here.\u003C\u002Fp>\n\u003Cp>No arguments.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>GET\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Fgates?status=waiting\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>gates:read\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"os-kpi-board\">\u003Ccode>os.kpi_board\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>The enterprise's KPI board, as HQ shows it: every company KPI the owner has signed off and each team's key KPI with its light (red off target, amber at risk, green on target), its trend (up, down, flat), when it was last read, the cadence it is read on, and whether that reading is overdue. A KPI nobody has read yet has no light (\u003Ccode>rag\u003C\u002Fcode> is null): it is never read and overdue, not green. A KPI still waiting for sign-off is not on the board. A team that has set no key KPI is named with none rather than left out. The response is { enterprise, teams }. Read-only: recording a reading is not a tool here.\u003C\u002Fp>\n\u003Cp>No arguments.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>GET\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Fenterprise\u002Fkpis\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>enterprise:read\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"kpi-record-reading\">\u003Ccode>kpi.record_reading\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Record one reading of a KPI by hand: the value, when it was taken, and who or what took it. Every reading is kept — correcting a wrong one means recording a new reading, never editing or deleting the old one — so a KPI history shows how it got to where it is. The light and the trend are read off the readings, so recording one is what moves them. A KPI nobody has signed off takes no reading: it is refused with 409 kpi_not_signed_off.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Argument\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>kpiId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The KPI the reading belongs to.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>value\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>number\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The number read, in the KPI's own unit.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>takenAt\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>When the reading was taken, as an ISO 8601 timestamp, e.g. 2026-01-08T00:00:00Z.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>recordedBy\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>Who or what took the reading: a member id, or the agent or tool that read it.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>POST\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Fkpis\u002F:kpiId\u002Freadings\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>kpis:write\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"kpi-list-readings\">\u003Ccode>kpi.list_readings\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>One KPI's readings, newest first: the value, when it was taken and who or what took it. This is the whole history behind the KPI's light and its trend, including any reading a later one corrected.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Argument\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>kpiId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The KPI whose readings to list.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>GET\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Fkpis\u002F:kpiId\u002Freadings\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>kpis:read\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"os-get-enterprise-kpis\">\u003Ccode>os.get_enterprise_kpis\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>The company's KPI targets as set: unit, target and direction, AMBER band, cadence and source. A KPI waiting for a target has targetValue null.\u003C\u002Fp>\n\u003Cp>No arguments.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>GET\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Fenterprise\u002Fkpi-targets\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>enterprise:read\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"os-set-enterprise-kpis\">\u003Ccode>os.set_enterprise_kpis\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Replace the company's complete KPI target list. A target needs its unit, direction, cadence and source; a no-target KPI is accepted. Uses the same validation as the portal.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Argument\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>kpis\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>array of objects\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The complete KPI target list. Every item is validated by the API.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>PATCH\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Fenterprise\u002Fkpi-targets\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>enterprise:write\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"os-get-team-kpis\">\u003Ccode>os.get_team_kpis\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>A team's own KPI targets as set, including which one is its key KPI. This is the target list, not the role and task KPI tree.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Argument\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>teamId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The team whose KPI targets are read.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>GET\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Fteams\u002F:teamId\u002Fkpi-targets\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>teams:read\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"os-set-team-kpis\">\u003Ccode>os.set_team_kpis\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Replace a team's complete KPI target list. Two key KPIs are refused; a list with none marked is stored with no key KPI. Uses the same validation as the portal.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Argument\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>teamId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The team whose KPI targets are replaced.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>kpis\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>array of objects\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The complete KPI target list. Every item is validated by the API.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>PATCH\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Fteams\u002F:teamId\u002Fkpi-targets\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>teams:write\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"role-list-kpis\">\u003Ccode>role.list_kpis\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>A role's KPIs, oldest first: each one's target, direction, AMBER band, cadence, source, the team KPI it serves (servesName names it; served is false for one that serves none), whether a person has signed it off, its light and trend (null until it is signed off) and its readings. Not found for a role in another enterprise.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Argument\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>roleId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The role whose KPIs to list.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>GET\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Froles\u002F:roleId\u002Fkpis\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>roles:read\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"role-define-kpi\">\u003Ccode>role.define_kpi\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Propose a KPI on a role, with the same fields as a KPI on any other layer. It waits for a person to sign it off, and until then draws no light and takes no reading. A KPI may serve only a KPI of the role’s own team (400 role_kpi_serves_other_team otherwise); leave servesKpiId out for one that serves none. The response is the role's KPIs after the change.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Argument\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>roleId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The role the KPI belongs to.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>name\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>What is measured, up to 200 characters.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>targetValue\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>number\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>The target, in the KPI’s own unit. Set it with targetDirection, or leave both out for no target.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>targetDirection\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string, one of \u003Ccode>at_least\u003C\u002Fcode>, \u003Ccode>at_most\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>at_least when higher is better, at_most when lower is better.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>amberBand\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>number, at least 0\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>How far past the target still reads AMBER rather than RED.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>onTargetWorseningRule\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>boolean\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>true to read AMBER when on target but worse than the reading before.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cadenceMinutes\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>integer, at least 1\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>How often it is read, in minutes; a reading older than this is overdue.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>servesKpiId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>The KPI of the role’s own team this one serves.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>sourceKind\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string, one of \u003Ccode>task\u003C\u002Fcode>, \u003Ccode>person\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>Where readings come from: task (a task records them) or person (entered by hand).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>sourceRef\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>The task id, or the person’s human-user id, sourceKind names.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>POST\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Froles\u002F:roleId\u002Fkpis\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>roles:write\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"role-edit-kpi\">\u003Ccode>role.edit_kpi\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Change a role KPI's fields; the ones left out keep their value. A KPI a person has signed off is changed only by a person, so this is refused with 403 kpi_signed_off_person_only for it. The response is the role's KPIs after the change.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Argument\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>roleId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The role the KPI belongs to.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>name\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>What is measured, up to 200 characters.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>targetValue\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>number\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>The target, in the KPI’s own unit. Set it with targetDirection, or leave both out for no target.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>targetDirection\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string, one of \u003Ccode>at_least\u003C\u002Fcode>, \u003Ccode>at_most\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>at_least when higher is better, at_most when lower is better.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>amberBand\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>number, at least 0\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>How far past the target still reads AMBER rather than RED.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>onTargetWorseningRule\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>boolean\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>true to read AMBER when on target but worse than the reading before.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cadenceMinutes\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>integer, at least 1\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>How often it is read, in minutes; a reading older than this is overdue.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>servesKpiId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>The KPI of the role’s own team this one serves.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>sourceKind\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string, one of \u003Ccode>task\u003C\u002Fcode>, \u003Ccode>person\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>Where readings come from: task (a task records them) or person (entered by hand).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>sourceRef\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>The task id, or the person’s human-user id, sourceKind names.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>kpiId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The KPI to change.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>PATCH\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Froles\u002F:roleId\u002Fkpis\u002F:kpiId\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>roles:write\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"os-list-built-in-tools\">\u003Ccode>os.list_built_in_tools\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>List every built-in tool a run can call: its name, a one-line summary, and its effect (read or write). A task may declare a built-in tool (os.\u003Cem>, workspace.\u003C\u002Fem>, memory.\u003Cem>, web.\u003C\u002Fem>) only from this list: saving a task that names any other is refused, as a tool that does not exist (tool_unknown) or one only the CEO chat offers (tool_not_run_callable). A row with gate is a tool a task may hold only if it also declares a CEO gate on the tool gate names: saving it without that gate is refused (gate_required_for_tool). Vendor tools are not here: os.list_tool_bindings lists what the enterprise has bound. Takes no arguments.\u003C\u002Fp>\n\u003Cp>No arguments.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>GET\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Ftools\u002Fbuilt-in?callable=run\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>tools:read\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"os-chat-list\">\u003Ccode>os.chat_list\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>List chat threads, most recently active first: each thread’s id, its state (idle, replying or closed), and its last message. In a run these are the threads of the member doing the run, and memberId is ignored. Over the API they are every thread of the enterprise, or only one member’s when you pass memberId. No message bodies beyond the last: read a thread with os.chat_read. A conversation opened for one job, such as designing a task, is never listed.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Argument\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>memberId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>Over the API: only threads with this member. A run always lists its own member’s.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>GET\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Fchats\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>chats:read\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"os-chat-read\">\u003Ccode>os.chat_read\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Read one chat thread: its messages, oldest first, each with who wrote it. Pass id from os.chat_list, and optionally limit to read only the newest messages (up to 200). In a run you get what was said (people’s messages and the member’s), the newest 50 unless you pass limit, and reading does not mark the thread read. Over the API you get every row, tool calls included, and reading marks the thread read, as opening it in the portal does.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Argument\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>id\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>A thread id from os.chat_list\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>limit\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>integer, 1 to 200\u003C\u002Ftd>\n\u003Ctd>no\u003C\u002Ftd>\n\u003Ctd>Only the newest messages, up to 200. In a run it defaults to 50; over the API, to all of them.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>GET\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Fchats\u002F:id\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>chats:read\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"os-chat-write\">\u003Ccode>os.chat_write\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Write one message in a chat thread, as yourself. Pass content: plain text, shown as written with line breaks kept and no formatting. In a run you write as the member doing the run, for the enterprise’s people to read: it shows as unread until someone opens the thread, nobody replies to the run, and the run carries on. Leave id out to write in the member’s open thread (one is opened if there is none), or pass id from os.chat_list. At most 4000 characters in a run. For a question you need answered, use os.ask_ceo. Over the API, id is required, you write as the person or token calling, and the member replies: the response is the thread with that reply in it. Sends no mail and opens no gate. A repeat writes the message again.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Argument\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>id\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The thread, from os.chat_list. A run may leave it out to write in its member’s open thread. Required over the API.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>content\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The message, as plain text\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>POST\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Fchats\u002F:id\u002Fmessages\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>chats:write\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"os-chat-open\">\u003Ccode>os.chat_open\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Open a new, empty chat thread with a member, and get its id to write in with os.chat_write. Pass memberId. Nothing is said and nothing is spent until a message is written. A run cannot call it: a run’s os.chat_write opens its member’s thread when there is none.\u003C\u002Fp>\n\u003Cdiv class=\"prose__table\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Argument\u003C\u002Fth>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Required\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>memberId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>string\u003C\u002Ftd>\n\u003Ctd>yes\u003C\u002Ftd>\n\u003Ctd>The member to talk to\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>POST\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Fchats\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>chats:write\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"os-list-enterprise-kpis\">\u003Ccode>os.list_enterprise_kpis\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>List every KPI of the enterprise, whatever layer owns it and whether or not it has been signed off, ordered by name then id. Each row carries its id (the kpiId the readings tools take), name, owner (layer and id), source (kind and ref), target (value, direction, AMBER band, on-target-worsening rule), cadence, current light, whether it is overdue, when it was signed off (null while it waits for sign-off, when it takes no reading), and its latest reading. The light is null when the KPI has no target or no reading yet. No arguments. Never another enterprise's KPIs.\u003C\u002Fp>\n\u003Cp>No arguments.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Method:\u003C\u002Fstrong> \u003Ccode>GET\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Path:\u003C\u002Fstrong> \u003Ccode>\u002Fv1\u002Fkpis\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Scope:\u003C\u002Fstrong> \u003Ccode>kpis:read\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n",[12,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58,61,64,67,70],{"id":13,"text":14,"level":15,"planned":8},"os-list-runs","os.list_runs",2,{"id":17,"text":18,"level":15,"planned":8},"os-get-run","os.get_run",{"id":20,"text":21,"level":15,"planned":8},"os-list-blockers","os.list_blockers",{"id":23,"text":24,"level":15,"planned":8},"os-list-open-gates","os.list_open_gates",{"id":26,"text":27,"level":15,"planned":8},"os-kpi-board","os.kpi_board",{"id":29,"text":30,"level":15,"planned":8},"kpi-record-reading","kpi.record_reading",{"id":32,"text":33,"level":15,"planned":8},"kpi-list-readings","kpi.list_readings",{"id":35,"text":36,"level":15,"planned":8},"os-get-enterprise-kpis","os.get_enterprise_kpis",{"id":38,"text":39,"level":15,"planned":8},"os-set-enterprise-kpis","os.set_enterprise_kpis",{"id":41,"text":42,"level":15,"planned":8},"os-get-team-kpis","os.get_team_kpis",{"id":44,"text":45,"level":15,"planned":8},"os-set-team-kpis","os.set_team_kpis",{"id":47,"text":48,"level":15,"planned":8},"role-list-kpis","role.list_kpis",{"id":50,"text":51,"level":15,"planned":8},"role-define-kpi","role.define_kpi",{"id":53,"text":54,"level":15,"planned":8},"role-edit-kpi","role.edit_kpi",{"id":56,"text":57,"level":15,"planned":8},"os-list-built-in-tools","os.list_built_in_tools",{"id":59,"text":60,"level":15,"planned":8},"os-chat-list","os.chat_list",{"id":62,"text":63,"level":15,"planned":8},"os-chat-read","os.chat_read",{"id":65,"text":66,"level":15,"planned":8},"os-chat-write","os.chat_write",{"id":68,"text":69,"level":15,"planned":8},"os-chat-open","os.chat_open",{"id":71,"text":72,"level":15,"planned":8},"os-list-enterprise-kpis","os.list_enterprise_kpis",1791124519676]