@agimon-ai/po-team 0.0.0-alpha.0 → 0.0.0-alpha.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/README.md +10 -11
  2. package/dist/apiContracts.cjs +10 -3
  3. package/dist/apiContracts.cjs.map +1 -1
  4. package/dist/apiContracts.d.mts.map +1 -1
  5. package/dist/apiContracts.mjs +10 -3
  6. package/dist/apiContracts.mjs.map +1 -1
  7. package/dist/{capabilityCeiling-CF7kAS18.mjs → capabilityCeiling-BaHT9v9S.mjs} +3 -3
  8. package/dist/capabilityCeiling-BaHT9v9S.mjs.map +1 -0
  9. package/dist/{capabilityCeiling-C-Y7H8oC.cjs → capabilityCeiling-CO3ZjYmY.cjs} +3 -3
  10. package/dist/capabilityCeiling-CO3ZjYmY.cjs.map +1 -0
  11. package/dist/capabilityCeiling.cjs +2 -2
  12. package/dist/capabilityCeiling.d.mts +2 -2
  13. package/dist/capabilityCeiling.mjs +2 -2
  14. package/dist/delegation.cjs +1 -1
  15. package/dist/delegation.cjs.map +1 -1
  16. package/dist/delegation.d.mts +1 -1
  17. package/dist/delegation.mjs +1 -1
  18. package/dist/delegation.mjs.map +1 -1
  19. package/dist/delegationApi.cjs +30 -30
  20. package/dist/delegationApi.d.mts +2 -2
  21. package/dist/delegationApi.mjs +1 -2
  22. package/dist/env.cjs +1 -1
  23. package/dist/env.d.mts +1 -1
  24. package/dist/env.mjs +1 -2
  25. package/dist/{environment-DrqhrxG_.mjs → environment-BtvJI2S-.mjs} +3 -3
  26. package/dist/environment-BtvJI2S-.mjs.map +1 -0
  27. package/dist/{environment-ma5oQ7uM.d.mts → environment-Bz1OlWIT.d.mts} +2 -2
  28. package/dist/{environment-ma5oQ7uM.d.mts.map → environment-Bz1OlWIT.d.mts.map} +1 -1
  29. package/dist/{environment-CaCW3SgT.cjs → environment-Cqs7vHJL.cjs} +3 -3
  30. package/dist/environment-Cqs7vHJL.cjs.map +1 -0
  31. package/dist/extensions/native.mjs +766 -0
  32. package/dist/extensions/native.mjs.map +1 -0
  33. package/dist/extensions/server.cjs +634 -668
  34. package/dist/extensions/server.cjs.map +1 -1
  35. package/dist/extensions/server.d.mts +1 -1
  36. package/dist/extensions/server.d.mts.map +1 -1
  37. package/dist/extensions/server.mjs +643 -677
  38. package/dist/extensions/server.mjs.map +1 -1
  39. package/dist/extensions/web.mjs +788 -693
  40. package/dist/extensions/web.mjs.map +1 -1
  41. package/dist/{externalProcessIpc-ojE0pvw0.cjs → externalProcessIpc-D3wxzrWU.cjs} +6 -16
  42. package/dist/externalProcessIpc-D3wxzrWU.cjs.map +1 -0
  43. package/dist/{externalProcessIpc-C-15lJrB.mjs → externalProcessIpc-MeW3WxD5.mjs} +7 -11
  44. package/dist/externalProcessIpc-MeW3WxD5.mjs.map +1 -0
  45. package/dist/fablePlan.cjs +3 -3
  46. package/dist/fablePlan.d.mts +2 -2
  47. package/dist/fablePlan.mjs +1 -2
  48. package/dist/{fablePlanApi-CZ3uUcMi.d.mts → fablePlanApi-BTNKjLni.d.mts} +6 -6
  49. package/dist/{fablePlanApi-CZ3uUcMi.d.mts.map → fablePlanApi-BTNKjLni.d.mts.map} +1 -1
  50. package/dist/{fablePlanApi-wBu9bRXU.cjs → fablePlanApi-BhI4jnDP.cjs} +12 -12
  51. package/dist/fablePlanApi-BhI4jnDP.cjs.map +1 -0
  52. package/dist/{fablePlanApi-BsHhgVFV.mjs → fablePlanApi-DuMg43Hu.mjs} +5 -5
  53. package/dist/fablePlanApi-DuMg43Hu.mjs.map +1 -0
  54. package/dist/fablePlanApi.cjs +3 -3
  55. package/dist/fablePlanApi.d.mts +2 -2
  56. package/dist/fablePlanApi.mjs +1 -2
  57. package/dist/index.cjs +1 -1
  58. package/dist/index.cjs.map +1 -1
  59. package/dist/index.d.mts +1 -1
  60. package/dist/index.mjs +1 -1
  61. package/dist/index.mjs.map +1 -1
  62. package/dist/runs/background/cliRunnerEntry.cjs +12 -11
  63. package/dist/runs/background/cliRunnerEntry.cjs.map +1 -1
  64. package/dist/runs/background/cliRunnerEntry.mjs +13 -12
  65. package/dist/runs/background/cliRunnerEntry.mjs.map +1 -1
  66. package/dist/runtimeSubagentPolicy.cjs +3 -3
  67. package/dist/runtimeSubagentPolicy.d.mts +2 -2
  68. package/dist/runtimeSubagentPolicy.mjs +1 -2
  69. package/dist/runtimeSubagentTool.cjs +7 -2
  70. package/dist/runtimeSubagentTool.d.mts +1 -1
  71. package/dist/runtimeSubagentTool.mjs +1 -2
  72. package/dist/{subagentPolicy-ALJam4GN.d.mts → subagentPolicy-BE-OZoa-.d.mts} +6 -6
  73. package/dist/subagentPolicy-BE-OZoa-.d.mts.map +1 -0
  74. package/dist/{subagentPolicy-DQRyKDH-.cjs → subagentPolicy-DIpaKHO8.cjs} +8 -8
  75. package/dist/subagentPolicy-DIpaKHO8.cjs.map +1 -0
  76. package/dist/{subagentPolicy-DxjsKeyj.mjs → subagentPolicy-LfcXuqO5.mjs} +5 -5
  77. package/dist/subagentPolicy-LfcXuqO5.mjs.map +1 -0
  78. package/dist/subagentPolicy.cjs +3 -3
  79. package/dist/subagentPolicy.d.mts +2 -2
  80. package/dist/subagentPolicy.mjs +1 -2
  81. package/dist/{subagentTool-Ca2zQXKw.cjs → subagentTool-BueNPGHo.cjs} +5 -16
  82. package/dist/subagentTool-BueNPGHo.cjs.map +1 -0
  83. package/dist/{subagentTool-BTssGLw8.d.mts → subagentTool-UdB3s6Mn.d.mts} +2 -11
  84. package/dist/subagentTool-UdB3s6Mn.d.mts.map +1 -0
  85. package/dist/{subagentTool-WOYrjxgT.mjs → subagentTool-a2oh2v5B.mjs} +5 -16
  86. package/dist/subagentTool-a2oh2v5B.mjs.map +1 -0
  87. package/dist/subagentTool.cjs +7 -2
  88. package/dist/subagentTool.d.mts +1 -1
  89. package/dist/subagentTool.mjs +1 -2
  90. package/dist/teamSnapshot.d.mts +1 -0
  91. package/dist/teamSnapshot.d.mts.map +1 -1
  92. package/dist/teamSnapshot.mjs +1 -2
  93. package/package.json +40 -21
  94. package/dist/capabilityCeiling-C-Y7H8oC.cjs.map +0 -1
  95. package/dist/capabilityCeiling-CF7kAS18.mjs.map +0 -1
  96. package/dist/environment-CaCW3SgT.cjs.map +0 -1
  97. package/dist/environment-DrqhrxG_.mjs.map +0 -1
  98. package/dist/externalProcessIpc-C-15lJrB.mjs.map +0 -1
  99. package/dist/externalProcessIpc-ojE0pvw0.cjs.map +0 -1
  100. package/dist/fablePlanApi-BsHhgVFV.mjs.map +0 -1
  101. package/dist/fablePlanApi-wBu9bRXU.cjs.map +0 -1
  102. package/dist/subagentPolicy-ALJam4GN.d.mts.map +0 -1
  103. package/dist/subagentPolicy-DQRyKDH-.cjs.map +0 -1
  104. package/dist/subagentPolicy-DxjsKeyj.mjs.map +0 -1
  105. package/dist/subagentTool-BTssGLw8.d.mts.map +0 -1
  106. package/dist/subagentTool-Ca2zQXKw.cjs.map +0 -1
  107. package/dist/subagentTool-WOYrjxgT.mjs.map +0 -1
package/README.md CHANGED
@@ -58,7 +58,7 @@ Use `/run` for one agent and `/parallel` for several. `/subagents-doctor` report
58
58
  `/subagents-steer` sends guidance to a running agent, and `/subagents-stop` requests a stop.
59
59
  `/subagents-list` shows available agents, and `/subagents-fleet` shows current runs.
60
60
 
61
- The `subagent` tool exposes `agents`, `run`, `status`, `steer`, `stop`, `suspended`, and `restore`.
61
+ The `subagent` tool exposes `agents`, `run`, `status`, `steer`, and `stop`.
62
62
  The `intercom` tool exposes `members`, `send`, `ask`, `pending`, and `reply`.
63
63
 
64
64
  `ask` is asynchronous in every direction (child to main, main to child, child to sibling). It
@@ -71,9 +71,10 @@ replying, the asker is told right away.
71
71
  ## Run lifecycle
72
72
 
73
73
  Runs are asynchronous. The parent receives a run identifier and later completion or failure rather
74
- than an inline child transcript. A shutdown requests suspension and writes restorable state. A later
75
- session can list suspended work and explicitly restore it. Reopening does not automatically restart
76
- children, and Team does not promise that every run continues after its parent exits.
74
+ than an inline child transcript. A native child is a conversation in its parent session's own
75
+ storage, so it survives a restart: when the session reopens, the child resumes where it stopped and
76
+ its completion still reaches the parent once. An external runtime is a separate process, and a
77
+ session that ends stops it.
77
78
 
78
79
  ## Agent identity
79
80
 
@@ -90,12 +91,10 @@ intercom({ action: "send", to: "alan-reviewer-3", message: "..." })
90
91
  subagent({ action: "status", id: "alan-reviewer-3" })
91
92
  ```
92
93
 
93
- Run ids keep working everywhere, and they win when a name and an id collide. A restored run keeps the
94
- identity its peers already know rather than being renamed. Identities are unique within one root
95
- session and are not reused when a run ends.
96
- The root session scopes run results, transcripts, control inboxes, membership, intercom, and
97
- suspended records. State is stored in private, per-user temporary directories with per-session
98
- subdirectories. Suspended records are recoverable only while those temporary files remain. Launch
94
+ Run ids keep working everywhere, and they win when a name and an id collide. Identities are unique
95
+ within one root session and are not reused when a run ends.
96
+ The root session scopes run results, transcripts, control inboxes, membership, and intercom. State
97
+ is stored in private, per-user temporary directories with per-session subdirectories. Launch
99
98
  contracts can contain full prompts and are written with private permissions, then removed after
100
99
  handoff. Intercom messages expire after 24 hours; liveness checks remove stale membership and run
101
100
  state.
@@ -121,7 +120,7 @@ With Task installed:
121
120
  4. Task records the terminal result on its own task.
122
121
 
123
122
  This is a named Cordis service relationship, not shared persistence. Team provides
124
- `doom/delegation`, `doom/background-work`, `doom/subagent-policy`, and `doom/fable-plan` for the
123
+ `po/delegation`, `po/background-work`, `po/subagent-policy`, and `po/fable-plan` for the
125
124
  active session. Consumers disconnect and reconnect automatically when that provider changes.
126
125
 
127
126
  ## Public API
@@ -34,6 +34,10 @@ const TeamCatalogSchema = typebox.Type.Object({
34
34
  const TeamRunsSchema = typebox.Type.Object({ runs: typebox.Type.Array(typebox.Type.Object({
35
35
  runId: S,
36
36
  agent: S,
37
+ identity: O(S),
38
+ inline: O(typebox.Type.Boolean()),
39
+ agentDescription: O(S),
40
+ agentFilePath: O(S),
37
41
  state: literals([
38
42
  "queued",
39
43
  "running",
@@ -43,10 +47,13 @@ const TeamRunsSchema = typebox.Type.Object({ runs: typebox.Type.Array(typebox.Ty
43
47
  ]),
44
48
  rawState: S,
45
49
  task: S,
50
+ promptWithheld: O(typebox.Type.Boolean()),
46
51
  taskRef: O(S),
47
52
  model: O(S),
53
+ modelSource: O(S),
54
+ thinking: O(S),
55
+ canSteer: O(typebox.Type.Boolean()),
48
56
  cwd: S,
49
- sessionFile: O(S),
50
57
  startedAt: N,
51
58
  endedAt: O(N),
52
59
  lastUpdate: N,
@@ -138,7 +145,7 @@ const apiContracts = (0, _agimon_ai_po_core_apiContracts.defineApiContract)({
138
145
  sockets: ["global", "workspace"].flatMap((scope) => [{
139
146
  id: "team.runs",
140
147
  scope,
141
- service: "po.hub.v1",
148
+ service: "po.hub",
142
149
  member: "subagent_runs",
143
150
  kind: "channel",
144
151
  direction: "server-to-client",
@@ -147,7 +154,7 @@ const apiContracts = (0, _agimon_ai_po_core_apiContracts.defineApiContract)({
147
154
  }, {
148
155
  id: "team.catalog.channel",
149
156
  scope,
150
- service: "po.hub.v1",
157
+ service: "po.hub",
151
158
  member: "subagent_catalog",
152
159
  kind: "channel",
153
160
  direction: "server-to-client",
@@ -1 +1 @@
1
- {"version":3,"file":"apiContracts.cjs","names":["Type","defineApiContract","jsonApiResponses"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/po-core/apiContracts';\nimport { Type } from 'typebox';\n\nconst S = Type.String();\nconst N = Type.Number();\nconst O = Type.Optional;\nconst literals = <T extends string>(values: T[]) => Type.Union(values.map((value) => Type.Literal(value)));\nexport const TeamCatalogSchema = Type.Object({\n cwd: S,\n models: Type.Array(S),\n warning: O(S),\n agents: Type.Array(\n Type.Object({\n name: S,\n source: literals(['project', 'user', 'plugin']),\n packageName: O(S),\n description: S,\n model: O(S),\n fallbackModels: Type.Array(S),\n tools: Type.Array(S),\n skills: Type.Array(S),\n extensions: Type.Array(S),\n defaultContext: literals(['fresh', 'fork']),\n filePath: S,\n }),\n ),\n});\nexport const TeamRunsSchema = Type.Object({\n runs: Type.Array(\n Type.Object({\n runId: S,\n agent: S,\n state: literals(['queued', 'running', 'done', 'failed', 'stopped']),\n rawState: S,\n task: S,\n taskRef: O(S),\n model: O(S),\n cwd: S,\n sessionFile: O(S),\n startedAt: N,\n endedAt: O(N),\n lastUpdate: N,\n currentTool: O(S),\n toolCount: O(N),\n tokens: O(N),\n cost: O(N),\n summary: O(S),\n error: O(S),\n tail: Type.Array(S),\n }),\n ),\n});\nexport const apiContracts = defineApiContract({\n version: 1,\n dynamic: [],\n http: [\n {\n id: 'team.catalog',\n scope: 'session',\n basePath: 'team',\n path: '/catalog',\n method: 'GET',\n authentication: 'owner',\n description: 'Discover the active session agent catalog.',\n responses: jsonApiResponses(TeamCatalogSchema),\n },\n {\n id: 'team.run',\n scope: 'session',\n basePath: 'team',\n path: '/run',\n method: 'POST',\n authentication: 'owner',\n description: 'Launch an agent in the selected headless session.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({\n agent: Type.String({ minLength: 1 }),\n task: S,\n fork: Type.Boolean(),\n model: O(Type.String({ minLength: 1 })),\n }),\n },\n responses: jsonApiResponses(Type.Object({ runId: S }), 201),\n },\n {\n id: 'team.steer',\n scope: 'session',\n basePath: 'team',\n path: '/steer',\n method: 'POST',\n authentication: 'owner',\n description: 'Send guidance straight to one running agent, without a parent prompt.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ runId: Type.String({ minLength: 1 }), message: Type.String({ minLength: 1 }) }),\n },\n responses: jsonApiResponses(\n Type.Object({ requestId: S, index: N, state: literals(['delivered', 'failed', 'pending']), message: S }),\n ),\n },\n {\n id: 'team.stop',\n scope: 'session',\n basePath: 'team',\n path: '/stop',\n method: 'POST',\n authentication: 'owner',\n description: 'Ask the runtime to stop one running agent, without a parent prompt.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ runId: Type.String({ minLength: 1 }) }),\n },\n responses: jsonApiResponses(Type.Object({ requestId: S })),\n },\n ],\n sockets: (['global', 'workspace'] as const).flatMap((scope) => [\n {\n id: 'team.runs',\n scope,\n service: 'po.hub.v1',\n member: 'subagent_runs',\n kind: 'channel',\n direction: 'server-to-client',\n description: 'Subagent run channel payload.',\n input: TeamRunsSchema,\n },\n {\n id: 'team.catalog.channel',\n scope,\n service: 'po.hub.v1',\n member: 'subagent_catalog',\n kind: 'channel',\n direction: 'server-to-client',\n description: 'Subagent catalog channel payload.',\n input: TeamCatalogSchema,\n },\n ]),\n});\nexport default apiContracts;\n"],"mappings":"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"}
1
+ {"version":3,"file":"apiContracts.cjs","names":["Type","defineApiContract","jsonApiResponses"],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/po-core/apiContracts';\nimport { Type } from 'typebox';\n\nconst S = Type.String();\nconst N = Type.Number();\nconst O = Type.Optional;\nconst literals = <T extends string>(values: T[]) => Type.Union(values.map((value) => Type.Literal(value)));\nexport const TeamCatalogSchema = Type.Object({\n cwd: S,\n models: Type.Array(S),\n warning: O(S),\n agents: Type.Array(\n Type.Object({\n name: S,\n source: literals(['project', 'user', 'plugin']),\n packageName: O(S),\n description: S,\n model: O(S),\n fallbackModels: Type.Array(S),\n tools: Type.Array(S),\n skills: Type.Array(S),\n extensions: Type.Array(S),\n defaultContext: literals(['fresh', 'fork']),\n filePath: S,\n }),\n ),\n});\nexport const TeamRunsSchema = Type.Object({\n runs: Type.Array(\n Type.Object({\n runId: S,\n agent: S,\n identity: O(S),\n inline: O(Type.Boolean()),\n agentDescription: O(S),\n agentFilePath: O(S),\n state: literals(['queued', 'running', 'done', 'failed', 'stopped']),\n rawState: S,\n task: S,\n promptWithheld: O(Type.Boolean()),\n taskRef: O(S),\n model: O(S),\n modelSource: O(S),\n thinking: O(S),\n canSteer: O(Type.Boolean()),\n cwd: S,\n startedAt: N,\n endedAt: O(N),\n lastUpdate: N,\n currentTool: O(S),\n toolCount: O(N),\n tokens: O(N),\n cost: O(N),\n summary: O(S),\n error: O(S),\n tail: Type.Array(S),\n }),\n ),\n});\nexport const apiContracts = defineApiContract({\n version: 1,\n dynamic: [],\n http: [\n {\n id: 'team.catalog',\n scope: 'session',\n basePath: 'team',\n path: '/catalog',\n method: 'GET',\n authentication: 'owner',\n description: 'Discover the active session agent catalog.',\n responses: jsonApiResponses(TeamCatalogSchema),\n },\n {\n id: 'team.run',\n scope: 'session',\n basePath: 'team',\n path: '/run',\n method: 'POST',\n authentication: 'owner',\n description: 'Launch an agent in the selected headless session.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({\n agent: Type.String({ minLength: 1 }),\n task: S,\n fork: Type.Boolean(),\n model: O(Type.String({ minLength: 1 })),\n }),\n },\n responses: jsonApiResponses(Type.Object({ runId: S }), 201),\n },\n {\n id: 'team.steer',\n scope: 'session',\n basePath: 'team',\n path: '/steer',\n method: 'POST',\n authentication: 'owner',\n description: 'Send guidance straight to one running agent, without a parent prompt.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ runId: Type.String({ minLength: 1 }), message: Type.String({ minLength: 1 }) }),\n },\n responses: jsonApiResponses(\n Type.Object({ requestId: S, index: N, state: literals(['delivered', 'failed', 'pending']), message: S }),\n ),\n },\n {\n id: 'team.stop',\n scope: 'session',\n basePath: 'team',\n path: '/stop',\n method: 'POST',\n authentication: 'owner',\n description: 'Ask the runtime to stop one running agent, without a parent prompt.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ runId: Type.String({ minLength: 1 }) }),\n },\n responses: jsonApiResponses(Type.Object({ requestId: S })),\n },\n ],\n sockets: (['global', 'workspace'] as const).flatMap((scope) => [\n {\n id: 'team.runs',\n scope,\n service: 'po.hub',\n member: 'subagent_runs',\n kind: 'channel',\n direction: 'server-to-client',\n description: 'Subagent run channel payload.',\n input: TeamRunsSchema,\n },\n {\n id: 'team.catalog.channel',\n scope,\n service: 'po.hub',\n member: 'subagent_catalog',\n kind: 'channel',\n direction: 'server-to-client',\n description: 'Subagent catalog channel payload.',\n input: TeamCatalogSchema,\n },\n ]),\n});\nexport default apiContracts;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../src/schemas/apiContracts.ts"],"mappings":";;qBAoDa"}
1
+ {"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../src/schemas/apiContracts.ts"],"mappings":";;qBA2Da"}
@@ -30,6 +30,10 @@ const TeamCatalogSchema = Type.Object({
30
30
  const TeamRunsSchema = Type.Object({ runs: Type.Array(Type.Object({
31
31
  runId: S,
32
32
  agent: S,
33
+ identity: O(S),
34
+ inline: O(Type.Boolean()),
35
+ agentDescription: O(S),
36
+ agentFilePath: O(S),
33
37
  state: literals([
34
38
  "queued",
35
39
  "running",
@@ -39,10 +43,13 @@ const TeamRunsSchema = Type.Object({ runs: Type.Array(Type.Object({
39
43
  ]),
40
44
  rawState: S,
41
45
  task: S,
46
+ promptWithheld: O(Type.Boolean()),
42
47
  taskRef: O(S),
43
48
  model: O(S),
49
+ modelSource: O(S),
50
+ thinking: O(S),
51
+ canSteer: O(Type.Boolean()),
44
52
  cwd: S,
45
- sessionFile: O(S),
46
53
  startedAt: N,
47
54
  endedAt: O(N),
48
55
  lastUpdate: N,
@@ -134,7 +141,7 @@ const apiContracts = defineApiContract({
134
141
  sockets: ["global", "workspace"].flatMap((scope) => [{
135
142
  id: "team.runs",
136
143
  scope,
137
- service: "po.hub.v1",
144
+ service: "po.hub",
138
145
  member: "subagent_runs",
139
146
  kind: "channel",
140
147
  direction: "server-to-client",
@@ -143,7 +150,7 @@ const apiContracts = defineApiContract({
143
150
  }, {
144
151
  id: "team.catalog.channel",
145
152
  scope,
146
- service: "po.hub.v1",
153
+ service: "po.hub",
147
154
  member: "subagent_catalog",
148
155
  kind: "channel",
149
156
  direction: "server-to-client",
@@ -1 +1 @@
1
- {"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/po-core/apiContracts';\nimport { Type } from 'typebox';\n\nconst S = Type.String();\nconst N = Type.Number();\nconst O = Type.Optional;\nconst literals = <T extends string>(values: T[]) => Type.Union(values.map((value) => Type.Literal(value)));\nexport const TeamCatalogSchema = Type.Object({\n cwd: S,\n models: Type.Array(S),\n warning: O(S),\n agents: Type.Array(\n Type.Object({\n name: S,\n source: literals(['project', 'user', 'plugin']),\n packageName: O(S),\n description: S,\n model: O(S),\n fallbackModels: Type.Array(S),\n tools: Type.Array(S),\n skills: Type.Array(S),\n extensions: Type.Array(S),\n defaultContext: literals(['fresh', 'fork']),\n filePath: S,\n }),\n ),\n});\nexport const TeamRunsSchema = Type.Object({\n runs: Type.Array(\n Type.Object({\n runId: S,\n agent: S,\n state: literals(['queued', 'running', 'done', 'failed', 'stopped']),\n rawState: S,\n task: S,\n taskRef: O(S),\n model: O(S),\n cwd: S,\n sessionFile: O(S),\n startedAt: N,\n endedAt: O(N),\n lastUpdate: N,\n currentTool: O(S),\n toolCount: O(N),\n tokens: O(N),\n cost: O(N),\n summary: O(S),\n error: O(S),\n tail: Type.Array(S),\n }),\n ),\n});\nexport const apiContracts = defineApiContract({\n version: 1,\n dynamic: [],\n http: [\n {\n id: 'team.catalog',\n scope: 'session',\n basePath: 'team',\n path: '/catalog',\n method: 'GET',\n authentication: 'owner',\n description: 'Discover the active session agent catalog.',\n responses: jsonApiResponses(TeamCatalogSchema),\n },\n {\n id: 'team.run',\n scope: 'session',\n basePath: 'team',\n path: '/run',\n method: 'POST',\n authentication: 'owner',\n description: 'Launch an agent in the selected headless session.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({\n agent: Type.String({ minLength: 1 }),\n task: S,\n fork: Type.Boolean(),\n model: O(Type.String({ minLength: 1 })),\n }),\n },\n responses: jsonApiResponses(Type.Object({ runId: S }), 201),\n },\n {\n id: 'team.steer',\n scope: 'session',\n basePath: 'team',\n path: '/steer',\n method: 'POST',\n authentication: 'owner',\n description: 'Send guidance straight to one running agent, without a parent prompt.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ runId: Type.String({ minLength: 1 }), message: Type.String({ minLength: 1 }) }),\n },\n responses: jsonApiResponses(\n Type.Object({ requestId: S, index: N, state: literals(['delivered', 'failed', 'pending']), message: S }),\n ),\n },\n {\n id: 'team.stop',\n scope: 'session',\n basePath: 'team',\n path: '/stop',\n method: 'POST',\n authentication: 'owner',\n description: 'Ask the runtime to stop one running agent, without a parent prompt.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ runId: Type.String({ minLength: 1 }) }),\n },\n responses: jsonApiResponses(Type.Object({ requestId: S })),\n },\n ],\n sockets: (['global', 'workspace'] as const).flatMap((scope) => [\n {\n id: 'team.runs',\n scope,\n service: 'po.hub.v1',\n member: 'subagent_runs',\n kind: 'channel',\n direction: 'server-to-client',\n description: 'Subagent run channel payload.',\n input: TeamRunsSchema,\n },\n {\n id: 'team.catalog.channel',\n scope,\n service: 'po.hub.v1',\n member: 'subagent_catalog',\n kind: 'channel',\n direction: 'server-to-client',\n description: 'Subagent catalog channel payload.',\n input: TeamCatalogSchema,\n },\n ]),\n});\nexport default apiContracts;\n"],"mappings":"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"}
1
+ {"version":3,"file":"apiContracts.mjs","names":[],"sources":["../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses } from '@agimon-ai/po-core/apiContracts';\nimport { Type } from 'typebox';\n\nconst S = Type.String();\nconst N = Type.Number();\nconst O = Type.Optional;\nconst literals = <T extends string>(values: T[]) => Type.Union(values.map((value) => Type.Literal(value)));\nexport const TeamCatalogSchema = Type.Object({\n cwd: S,\n models: Type.Array(S),\n warning: O(S),\n agents: Type.Array(\n Type.Object({\n name: S,\n source: literals(['project', 'user', 'plugin']),\n packageName: O(S),\n description: S,\n model: O(S),\n fallbackModels: Type.Array(S),\n tools: Type.Array(S),\n skills: Type.Array(S),\n extensions: Type.Array(S),\n defaultContext: literals(['fresh', 'fork']),\n filePath: S,\n }),\n ),\n});\nexport const TeamRunsSchema = Type.Object({\n runs: Type.Array(\n Type.Object({\n runId: S,\n agent: S,\n identity: O(S),\n inline: O(Type.Boolean()),\n agentDescription: O(S),\n agentFilePath: O(S),\n state: literals(['queued', 'running', 'done', 'failed', 'stopped']),\n rawState: S,\n task: S,\n promptWithheld: O(Type.Boolean()),\n taskRef: O(S),\n model: O(S),\n modelSource: O(S),\n thinking: O(S),\n canSteer: O(Type.Boolean()),\n cwd: S,\n startedAt: N,\n endedAt: O(N),\n lastUpdate: N,\n currentTool: O(S),\n toolCount: O(N),\n tokens: O(N),\n cost: O(N),\n summary: O(S),\n error: O(S),\n tail: Type.Array(S),\n }),\n ),\n});\nexport const apiContracts = defineApiContract({\n version: 1,\n dynamic: [],\n http: [\n {\n id: 'team.catalog',\n scope: 'session',\n basePath: 'team',\n path: '/catalog',\n method: 'GET',\n authentication: 'owner',\n description: 'Discover the active session agent catalog.',\n responses: jsonApiResponses(TeamCatalogSchema),\n },\n {\n id: 'team.run',\n scope: 'session',\n basePath: 'team',\n path: '/run',\n method: 'POST',\n authentication: 'owner',\n description: 'Launch an agent in the selected headless session.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({\n agent: Type.String({ minLength: 1 }),\n task: S,\n fork: Type.Boolean(),\n model: O(Type.String({ minLength: 1 })),\n }),\n },\n responses: jsonApiResponses(Type.Object({ runId: S }), 201),\n },\n {\n id: 'team.steer',\n scope: 'session',\n basePath: 'team',\n path: '/steer',\n method: 'POST',\n authentication: 'owner',\n description: 'Send guidance straight to one running agent, without a parent prompt.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ runId: Type.String({ minLength: 1 }), message: Type.String({ minLength: 1 }) }),\n },\n responses: jsonApiResponses(\n Type.Object({ requestId: S, index: N, state: literals(['delivered', 'failed', 'pending']), message: S }),\n ),\n },\n {\n id: 'team.stop',\n scope: 'session',\n basePath: 'team',\n path: '/stop',\n method: 'POST',\n authentication: 'owner',\n description: 'Ask the runtime to stop one running agent, without a parent prompt.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({ runId: Type.String({ minLength: 1 }) }),\n },\n responses: jsonApiResponses(Type.Object({ requestId: S })),\n },\n ],\n sockets: (['global', 'workspace'] as const).flatMap((scope) => [\n {\n id: 'team.runs',\n scope,\n service: 'po.hub',\n member: 'subagent_runs',\n kind: 'channel',\n direction: 'server-to-client',\n description: 'Subagent run channel payload.',\n input: TeamRunsSchema,\n },\n {\n id: 'team.catalog.channel',\n scope,\n service: 'po.hub',\n member: 'subagent_catalog',\n kind: 'channel',\n direction: 'server-to-client',\n description: 'Subagent catalog channel payload.',\n input: TeamCatalogSchema,\n },\n ]),\n});\nexport default apiContracts;\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- import "./environment-DrqhrxG_.mjs";
1
+ import "./environment-BtvJI2S-.mjs";
2
2
  import { Buffer } from "node:buffer";
3
3
  //#region src/schemas/team/capabilityCeiling.ts
4
4
  /**
5
5
  * Capability-ceiling values, intersection, and the child-process codec.
6
6
  *
7
- * Live extension contributions enter through Team's `doom/subagent-policy`
7
+ * Live extension contributions enter through Team's `po/subagent-policy`
8
8
  * Cordis service. Only the resolved ceiling crosses a process boundary, through
9
9
  * the versioned environment value encoded here.
10
10
  */
@@ -153,4 +153,4 @@ function decodeSubagentCapabilityCeiling(value) {
153
153
  //#endregion
154
154
  export { intersectSubagentCapabilityCeilings as a, encodeSubagentCapabilityCeiling as i, SubagentCapabilityPolicyStore as n, parseSubagentCapabilityCeiling as o, decodeSubagentCapabilityCeiling as r, SUBAGENT_CAPABILITY_CEILING_VERSION as t };
155
155
 
156
- //# sourceMappingURL=capabilityCeiling-CF7kAS18.mjs.map
156
+ //# sourceMappingURL=capabilityCeiling-BaHT9v9S.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilityCeiling-BaHT9v9S.mjs","names":[],"sources":["../src/schemas/team/capabilityCeiling.ts"],"sourcesContent":["/**\n * Capability-ceiling values, intersection, and the child-process codec.\n *\n * Live extension contributions enter through Team's `po/subagent-policy`\n * Cordis service. Only the resolved ceiling crosses a process boundary, through\n * the versioned environment value encoded here.\n */\n\nimport { Buffer } from 'node:buffer';\n\nimport type { SubagentPolicy } from '../../schemas/subagentPolicy';\nimport { SUBAGENT_CAPABILITY_CEILING_ENV } from '../../types/environment';\n\nexport const SUBAGENT_CAPABILITY_CEILING_VERSION = 2 as const;\nexport { SUBAGENT_CAPABILITY_CEILING_ENV };\n\nconst MAX_TEXT_BYTES = 256;\nconst MAX_TOOL_NAME_BYTES = 128;\nconst MAX_ALLOWED_TOOLS = 256;\nconst MAX_ALLOWED_EXTERNAL_PROFILES = 32;\nconst MAX_EXTERNAL_PROFILE_NAME_BYTES = 128;\nconst EXTERNAL_PROFILE_PATTERN = /^[A-Za-z0-9][A-Za-z0-9/_.:-]+$/u;\nconst TOOL_NAME_PATTERN = /^[A-Za-z0-9_.:-]+$/u;\nconst LAST_C0_CONTROL_CODE = 0x1f;\nconst DELETE_CODE = 0x7f;\n\n/**\n * Ceiling text crosses a process boundary and is rendered in the TUI, so control\n * characters are rejected. Scanning code points avoids a control-character\n * regex, which lints as a hazard even when the escapes are explicit.\n */\nfunction hasControlCharacter(value: string): boolean {\n for (const character of value) {\n const code = character.codePointAt(0);\n if (code !== undefined && (code <= LAST_C0_CONTROL_CODE || code === DELETE_CODE)) return true;\n }\n return false;\n}\n\nexport type SubagentCapabilityCeiling = {\n allowedTools?: readonly string[];\n requiredTools?: readonly string[];\n allowMcpTools?: boolean;\n allowedExternalProfiles?: readonly string[];\n denyExtensions?: boolean;\n};\n\nexport interface ResolvedSubagentCapabilityCeiling {\n version: typeof SUBAGENT_CAPABILITY_CEILING_VERSION;\n allowedTools?: string[];\n requiredTools?: string[];\n allowMcpTools?: boolean;\n allowedExternalProfiles: string[];\n denyExtensions: boolean;\n sources: string[];\n}\n\nexport interface SubagentCapabilityAudit {\n ceiling: ResolvedSubagentCapabilityCeiling;\n requestedTools?: string[];\n effectiveTools: string[];\n removedTools: string[];\n internalTools: string[];\n extensionsDenied: boolean;\n removedExtensionCount: number;\n requestedMcpToolCount: number;\n effectiveMcpTools: string[];\n}\n\ninterface TypedPolicyRegistration {\n generation: string;\n ceiling: ResolvedSubagentCapabilityCeiling;\n}\n\nexport class SubagentCapabilityPolicyStore {\n private readonly policies = new Map<string, TypedPolicyRegistration>();\n\n register(policy: SubagentPolicy, generation: string): void {\n const ceiling = normalizeCeiling({\n ...(policy.allowedTools ? { allowedTools: policy.allowedTools } : {}),\n ...(policy.requiredTools ? { requiredTools: policy.requiredTools } : {}),\n ...(policy.allowMcpTools === true ? { allowMcpTools: true } : {}),\n ...(policy.allowedExternalProfiles ? { allowedExternalProfiles: policy.allowedExternalProfiles } : {}),\n denyExtensions: policy.denyExtensions === true,\n });\n ceiling.sources = [policy.owner];\n this.policies.set(policy.owner, { generation, ceiling });\n }\n\n update(policy: SubagentPolicy, generation: string): void {\n if (this.policies.get(policy.owner)?.generation !== generation) return;\n this.register(policy, generation);\n }\n\n remove(owner: string, generation: string): void {\n if (this.policies.get(owner)?.generation === generation) this.policies.delete(owner);\n }\n\n clear(): void {\n this.policies.clear();\n }\n\n resolve(inherited?: ResolvedSubagentCapabilityCeiling): ResolvedSubagentCapabilityCeiling | undefined {\n return intersectSubagentCapabilityCeilings(inherited, ...[...this.policies.values()].map(({ ceiling }) => ceiling));\n }\n}\n\nfunction validateText(value: unknown, field: string): string {\n if (\n typeof value !== 'string' ||\n !value.trim() ||\n hasControlCharacter(value) ||\n Buffer.byteLength(value.trim(), 'utf8') > MAX_TEXT_BYTES\n ) {\n throw new Error(\n `Invalid capability ceiling ${field}; expected a non-empty string without control characters (max ${MAX_TEXT_BYTES} UTF-8 bytes).`,\n );\n }\n return value.trim();\n}\n\nfunction normalizeCeiling(ceiling: SubagentCapabilityCeiling): ResolvedSubagentCapabilityCeiling {\n if (!ceiling || typeof ceiling !== 'object' || Array.isArray(ceiling)) {\n throw new Error('Invalid capability ceiling; expected an object.');\n }\n const hasAllowedTools = Object.hasOwn(ceiling, 'allowedTools');\n const hasRequiredTools = Object.hasOwn(ceiling, 'requiredTools');\n const hasAllowMcpTools = Object.hasOwn(ceiling, 'allowMcpTools');\n const hasAllowedExternalProfiles = Object.hasOwn(ceiling, 'allowedExternalProfiles');\n const hasDenyExtensions = Object.hasOwn(ceiling, 'denyExtensions');\n if (!hasAllowedTools && !hasRequiredTools && !hasAllowMcpTools && !hasAllowedExternalProfiles && !hasDenyExtensions) {\n throw new Error(\n 'Invalid capability ceiling; expected allowedTools, requiredTools, allowMcpTools, allowedExternalProfiles, or denyExtensions.',\n );\n }\n if (hasAllowMcpTools && typeof ceiling.allowMcpTools !== 'boolean') {\n throw new Error('Invalid capability ceiling allowMcpTools; expected a boolean.');\n }\n if (hasDenyExtensions && typeof ceiling.denyExtensions !== 'boolean') {\n throw new Error('Invalid capability ceiling denyExtensions; expected a boolean.');\n }\n const normalizeTools = (value: readonly string[] | undefined, field: 'allowedTools' | 'requiredTools') => {\n if (!Array.isArray(value)) throw new Error(`Invalid capability ceiling ${field}; expected an array.`);\n if (value.length > MAX_ALLOWED_TOOLS) {\n throw new Error(`Invalid capability ceiling ${field}; expected at most ${MAX_ALLOWED_TOOLS} names.`);\n }\n return [\n ...new Set(\n value.map((tool) => {\n const name = validateText(tool, `${field} entry`);\n if (!TOOL_NAME_PATTERN.test(name)) {\n throw new Error(`Invalid capability ceiling ${field} entry '${name}'.`);\n }\n if (Buffer.byteLength(name, 'utf8') > MAX_TOOL_NAME_BYTES) {\n throw new Error(\n `Invalid capability ceiling ${field} entry '${name}'; max ${MAX_TOOL_NAME_BYTES} UTF-8 bytes.`,\n );\n }\n return name;\n }),\n ),\n ].sort((left, right) => left.localeCompare(right));\n };\n const allowedTools = hasAllowedTools ? normalizeTools(ceiling.allowedTools, 'allowedTools') : undefined;\n const requiredTools = hasRequiredTools ? normalizeTools(ceiling.requiredTools, 'requiredTools') : undefined;\n let allowedExternalProfiles: string[] = [];\n if (Object.hasOwn(ceiling, 'allowedExternalProfiles')) {\n if (!Array.isArray(ceiling.allowedExternalProfiles)) {\n throw new Error('Invalid capability ceiling allowedExternalProfiles; expected an array.');\n }\n if (ceiling.allowedExternalProfiles.length > MAX_ALLOWED_EXTERNAL_PROFILES) {\n throw new Error(\n `Invalid capability ceiling allowedExternalProfiles; expected at most ${MAX_ALLOWED_EXTERNAL_PROFILES} names.`,\n );\n }\n allowedExternalProfiles = [\n ...new Set(\n ceiling.allowedExternalProfiles.map((profile) => {\n const name = validateText(profile, 'allowedExternalProfiles entry');\n if (\n !EXTERNAL_PROFILE_PATTERN.test(name) ||\n Buffer.byteLength(name, 'utf8') > MAX_EXTERNAL_PROFILE_NAME_BYTES\n ) {\n throw new Error(`Invalid capability ceiling allowedExternalProfiles entry '${name}'.`);\n }\n return name;\n }),\n ),\n ].sort((left, right) => left.localeCompare(right));\n }\n return {\n version: SUBAGENT_CAPABILITY_CEILING_VERSION,\n ...(allowedTools ? { allowedTools } : {}),\n ...(requiredTools?.length ? { requiredTools } : {}),\n ...(ceiling.allowMcpTools === true ? { allowMcpTools: true } : {}),\n allowedExternalProfiles,\n denyExtensions: ceiling.denyExtensions === true,\n sources: [],\n };\n}\n\nexport function parseSubagentCapabilityCeiling(\n value: unknown,\n field = 'capability ceiling',\n): ResolvedSubagentCapabilityCeiling {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`Invalid ${field}; expected an object.`);\n }\n const record = value as Record<string, unknown>;\n if (record.version !== SUBAGENT_CAPABILITY_CEILING_VERSION) throw new Error(`Invalid ${field} version.`);\n const normalized = normalizeCeiling(record as SubagentCapabilityCeiling);\n const sources = record.sources;\n if (!Array.isArray(sources) || sources.some((source) => typeof source !== 'string')) {\n throw new Error(`Invalid ${field} sources; expected an array of strings.`);\n }\n normalized.sources = [...new Set(sources.map((source) => validateText(source, `${field} source`)))].sort();\n return normalized;\n}\n\nexport function intersectSubagentCapabilityCeilings(\n ...ceilings: Array<ResolvedSubagentCapabilityCeiling | undefined>\n): ResolvedSubagentCapabilityCeiling | undefined {\n const active = ceilings.filter((ceiling): ceiling is ResolvedSubagentCapabilityCeiling => ceiling !== undefined);\n if (active.length === 0) return undefined;\n const definedLists = active\n .filter((ceiling) => ceiling.allowedTools !== undefined)\n .map((ceiling) => new Set(ceiling.allowedTools));\n let allowedTools: string[] | undefined;\n if (definedLists.length > 0) {\n allowedTools = [...definedLists[0]!].filter((tool) => definedLists.every((list) => list.has(tool))).sort();\n }\n const requiredTools = [...new Set(active.flatMap((ceiling) => ceiling.requiredTools ?? []))]\n .filter((tool) => !allowedTools || allowedTools.includes(tool))\n .sort((left, right) => left.localeCompare(right));\n const profileSets = active.map((ceiling) => new Set(ceiling.allowedExternalProfiles));\n const allowedExternalProfiles = [...profileSets[0]!]\n .filter((profile) => profileSets.every((profiles) => profiles.has(profile)))\n .sort((left, right) => left.localeCompare(right));\n return {\n version: SUBAGENT_CAPABILITY_CEILING_VERSION,\n ...(allowedTools ? { allowedTools } : {}),\n ...(requiredTools.length ? { requiredTools } : {}),\n ...(active.every((ceiling) => ceiling.allowMcpTools === true) ? { allowMcpTools: true } : {}),\n allowedExternalProfiles,\n denyExtensions: active.some((ceiling) => ceiling.denyExtensions),\n sources: [...new Set(active.flatMap((ceiling) => ceiling.sources))].sort(),\n };\n}\n\nexport function encodeSubagentCapabilityCeiling(\n ceiling: ResolvedSubagentCapabilityCeiling | undefined,\n): string | undefined {\n if (!ceiling) return undefined;\n return Buffer.from(JSON.stringify(ceiling), 'utf8').toString('base64url');\n}\n\nexport function decodeSubagentCapabilityCeiling(\n value: string | undefined,\n): ResolvedSubagentCapabilityCeiling | undefined {\n if (value === undefined || value === '') return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(Buffer.from(value, 'base64url').toString('utf8'));\n } catch (error) {\n throw new Error(`Invalid inherited capability ceiling: ${error instanceof Error ? error.message : String(error)}`);\n }\n if (\n !parsed ||\n typeof parsed !== 'object' ||\n Array.isArray(parsed) ||\n (parsed as { version?: unknown }).version !== SUBAGENT_CAPABILITY_CEILING_VERSION\n ) {\n throw new Error('Invalid inherited capability ceiling version.');\n }\n return parseSubagentCapabilityCeiling(parsed, 'inherited capability ceiling');\n}\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- require("./environment-CaCW3SgT.cjs");
1
+ require("./environment-Cqs7vHJL.cjs");
2
2
  let node_buffer = require("node:buffer");
3
3
  //#region src/schemas/team/capabilityCeiling.ts
4
4
  /**
5
5
  * Capability-ceiling values, intersection, and the child-process codec.
6
6
  *
7
- * Live extension contributions enter through Team's `doom/subagent-policy`
7
+ * Live extension contributions enter through Team's `po/subagent-policy`
8
8
  * Cordis service. Only the resolved ceiling crosses a process boundary, through
9
9
  * the versioned environment value encoded here.
10
10
  */
@@ -188,4 +188,4 @@ Object.defineProperty(exports, "parseSubagentCapabilityCeiling", {
188
188
  }
189
189
  });
190
190
 
191
- //# sourceMappingURL=capabilityCeiling-C-Y7H8oC.cjs.map
191
+ //# sourceMappingURL=capabilityCeiling-CO3ZjYmY.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilityCeiling-CO3ZjYmY.cjs","names":["Buffer"],"sources":["../src/schemas/team/capabilityCeiling.ts"],"sourcesContent":["/**\n * Capability-ceiling values, intersection, and the child-process codec.\n *\n * Live extension contributions enter through Team's `po/subagent-policy`\n * Cordis service. Only the resolved ceiling crosses a process boundary, through\n * the versioned environment value encoded here.\n */\n\nimport { Buffer } from 'node:buffer';\n\nimport type { SubagentPolicy } from '../../schemas/subagentPolicy';\nimport { SUBAGENT_CAPABILITY_CEILING_ENV } from '../../types/environment';\n\nexport const SUBAGENT_CAPABILITY_CEILING_VERSION = 2 as const;\nexport { SUBAGENT_CAPABILITY_CEILING_ENV };\n\nconst MAX_TEXT_BYTES = 256;\nconst MAX_TOOL_NAME_BYTES = 128;\nconst MAX_ALLOWED_TOOLS = 256;\nconst MAX_ALLOWED_EXTERNAL_PROFILES = 32;\nconst MAX_EXTERNAL_PROFILE_NAME_BYTES = 128;\nconst EXTERNAL_PROFILE_PATTERN = /^[A-Za-z0-9][A-Za-z0-9/_.:-]+$/u;\nconst TOOL_NAME_PATTERN = /^[A-Za-z0-9_.:-]+$/u;\nconst LAST_C0_CONTROL_CODE = 0x1f;\nconst DELETE_CODE = 0x7f;\n\n/**\n * Ceiling text crosses a process boundary and is rendered in the TUI, so control\n * characters are rejected. Scanning code points avoids a control-character\n * regex, which lints as a hazard even when the escapes are explicit.\n */\nfunction hasControlCharacter(value: string): boolean {\n for (const character of value) {\n const code = character.codePointAt(0);\n if (code !== undefined && (code <= LAST_C0_CONTROL_CODE || code === DELETE_CODE)) return true;\n }\n return false;\n}\n\nexport type SubagentCapabilityCeiling = {\n allowedTools?: readonly string[];\n requiredTools?: readonly string[];\n allowMcpTools?: boolean;\n allowedExternalProfiles?: readonly string[];\n denyExtensions?: boolean;\n};\n\nexport interface ResolvedSubagentCapabilityCeiling {\n version: typeof SUBAGENT_CAPABILITY_CEILING_VERSION;\n allowedTools?: string[];\n requiredTools?: string[];\n allowMcpTools?: boolean;\n allowedExternalProfiles: string[];\n denyExtensions: boolean;\n sources: string[];\n}\n\nexport interface SubagentCapabilityAudit {\n ceiling: ResolvedSubagentCapabilityCeiling;\n requestedTools?: string[];\n effectiveTools: string[];\n removedTools: string[];\n internalTools: string[];\n extensionsDenied: boolean;\n removedExtensionCount: number;\n requestedMcpToolCount: number;\n effectiveMcpTools: string[];\n}\n\ninterface TypedPolicyRegistration {\n generation: string;\n ceiling: ResolvedSubagentCapabilityCeiling;\n}\n\nexport class SubagentCapabilityPolicyStore {\n private readonly policies = new Map<string, TypedPolicyRegistration>();\n\n register(policy: SubagentPolicy, generation: string): void {\n const ceiling = normalizeCeiling({\n ...(policy.allowedTools ? { allowedTools: policy.allowedTools } : {}),\n ...(policy.requiredTools ? { requiredTools: policy.requiredTools } : {}),\n ...(policy.allowMcpTools === true ? { allowMcpTools: true } : {}),\n ...(policy.allowedExternalProfiles ? { allowedExternalProfiles: policy.allowedExternalProfiles } : {}),\n denyExtensions: policy.denyExtensions === true,\n });\n ceiling.sources = [policy.owner];\n this.policies.set(policy.owner, { generation, ceiling });\n }\n\n update(policy: SubagentPolicy, generation: string): void {\n if (this.policies.get(policy.owner)?.generation !== generation) return;\n this.register(policy, generation);\n }\n\n remove(owner: string, generation: string): void {\n if (this.policies.get(owner)?.generation === generation) this.policies.delete(owner);\n }\n\n clear(): void {\n this.policies.clear();\n }\n\n resolve(inherited?: ResolvedSubagentCapabilityCeiling): ResolvedSubagentCapabilityCeiling | undefined {\n return intersectSubagentCapabilityCeilings(inherited, ...[...this.policies.values()].map(({ ceiling }) => ceiling));\n }\n}\n\nfunction validateText(value: unknown, field: string): string {\n if (\n typeof value !== 'string' ||\n !value.trim() ||\n hasControlCharacter(value) ||\n Buffer.byteLength(value.trim(), 'utf8') > MAX_TEXT_BYTES\n ) {\n throw new Error(\n `Invalid capability ceiling ${field}; expected a non-empty string without control characters (max ${MAX_TEXT_BYTES} UTF-8 bytes).`,\n );\n }\n return value.trim();\n}\n\nfunction normalizeCeiling(ceiling: SubagentCapabilityCeiling): ResolvedSubagentCapabilityCeiling {\n if (!ceiling || typeof ceiling !== 'object' || Array.isArray(ceiling)) {\n throw new Error('Invalid capability ceiling; expected an object.');\n }\n const hasAllowedTools = Object.hasOwn(ceiling, 'allowedTools');\n const hasRequiredTools = Object.hasOwn(ceiling, 'requiredTools');\n const hasAllowMcpTools = Object.hasOwn(ceiling, 'allowMcpTools');\n const hasAllowedExternalProfiles = Object.hasOwn(ceiling, 'allowedExternalProfiles');\n const hasDenyExtensions = Object.hasOwn(ceiling, 'denyExtensions');\n if (!hasAllowedTools && !hasRequiredTools && !hasAllowMcpTools && !hasAllowedExternalProfiles && !hasDenyExtensions) {\n throw new Error(\n 'Invalid capability ceiling; expected allowedTools, requiredTools, allowMcpTools, allowedExternalProfiles, or denyExtensions.',\n );\n }\n if (hasAllowMcpTools && typeof ceiling.allowMcpTools !== 'boolean') {\n throw new Error('Invalid capability ceiling allowMcpTools; expected a boolean.');\n }\n if (hasDenyExtensions && typeof ceiling.denyExtensions !== 'boolean') {\n throw new Error('Invalid capability ceiling denyExtensions; expected a boolean.');\n }\n const normalizeTools = (value: readonly string[] | undefined, field: 'allowedTools' | 'requiredTools') => {\n if (!Array.isArray(value)) throw new Error(`Invalid capability ceiling ${field}; expected an array.`);\n if (value.length > MAX_ALLOWED_TOOLS) {\n throw new Error(`Invalid capability ceiling ${field}; expected at most ${MAX_ALLOWED_TOOLS} names.`);\n }\n return [\n ...new Set(\n value.map((tool) => {\n const name = validateText(tool, `${field} entry`);\n if (!TOOL_NAME_PATTERN.test(name)) {\n throw new Error(`Invalid capability ceiling ${field} entry '${name}'.`);\n }\n if (Buffer.byteLength(name, 'utf8') > MAX_TOOL_NAME_BYTES) {\n throw new Error(\n `Invalid capability ceiling ${field} entry '${name}'; max ${MAX_TOOL_NAME_BYTES} UTF-8 bytes.`,\n );\n }\n return name;\n }),\n ),\n ].sort((left, right) => left.localeCompare(right));\n };\n const allowedTools = hasAllowedTools ? normalizeTools(ceiling.allowedTools, 'allowedTools') : undefined;\n const requiredTools = hasRequiredTools ? normalizeTools(ceiling.requiredTools, 'requiredTools') : undefined;\n let allowedExternalProfiles: string[] = [];\n if (Object.hasOwn(ceiling, 'allowedExternalProfiles')) {\n if (!Array.isArray(ceiling.allowedExternalProfiles)) {\n throw new Error('Invalid capability ceiling allowedExternalProfiles; expected an array.');\n }\n if (ceiling.allowedExternalProfiles.length > MAX_ALLOWED_EXTERNAL_PROFILES) {\n throw new Error(\n `Invalid capability ceiling allowedExternalProfiles; expected at most ${MAX_ALLOWED_EXTERNAL_PROFILES} names.`,\n );\n }\n allowedExternalProfiles = [\n ...new Set(\n ceiling.allowedExternalProfiles.map((profile) => {\n const name = validateText(profile, 'allowedExternalProfiles entry');\n if (\n !EXTERNAL_PROFILE_PATTERN.test(name) ||\n Buffer.byteLength(name, 'utf8') > MAX_EXTERNAL_PROFILE_NAME_BYTES\n ) {\n throw new Error(`Invalid capability ceiling allowedExternalProfiles entry '${name}'.`);\n }\n return name;\n }),\n ),\n ].sort((left, right) => left.localeCompare(right));\n }\n return {\n version: SUBAGENT_CAPABILITY_CEILING_VERSION,\n ...(allowedTools ? { allowedTools } : {}),\n ...(requiredTools?.length ? { requiredTools } : {}),\n ...(ceiling.allowMcpTools === true ? { allowMcpTools: true } : {}),\n allowedExternalProfiles,\n denyExtensions: ceiling.denyExtensions === true,\n sources: [],\n };\n}\n\nexport function parseSubagentCapabilityCeiling(\n value: unknown,\n field = 'capability ceiling',\n): ResolvedSubagentCapabilityCeiling {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(`Invalid ${field}; expected an object.`);\n }\n const record = value as Record<string, unknown>;\n if (record.version !== SUBAGENT_CAPABILITY_CEILING_VERSION) throw new Error(`Invalid ${field} version.`);\n const normalized = normalizeCeiling(record as SubagentCapabilityCeiling);\n const sources = record.sources;\n if (!Array.isArray(sources) || sources.some((source) => typeof source !== 'string')) {\n throw new Error(`Invalid ${field} sources; expected an array of strings.`);\n }\n normalized.sources = [...new Set(sources.map((source) => validateText(source, `${field} source`)))].sort();\n return normalized;\n}\n\nexport function intersectSubagentCapabilityCeilings(\n ...ceilings: Array<ResolvedSubagentCapabilityCeiling | undefined>\n): ResolvedSubagentCapabilityCeiling | undefined {\n const active = ceilings.filter((ceiling): ceiling is ResolvedSubagentCapabilityCeiling => ceiling !== undefined);\n if (active.length === 0) return undefined;\n const definedLists = active\n .filter((ceiling) => ceiling.allowedTools !== undefined)\n .map((ceiling) => new Set(ceiling.allowedTools));\n let allowedTools: string[] | undefined;\n if (definedLists.length > 0) {\n allowedTools = [...definedLists[0]!].filter((tool) => definedLists.every((list) => list.has(tool))).sort();\n }\n const requiredTools = [...new Set(active.flatMap((ceiling) => ceiling.requiredTools ?? []))]\n .filter((tool) => !allowedTools || allowedTools.includes(tool))\n .sort((left, right) => left.localeCompare(right));\n const profileSets = active.map((ceiling) => new Set(ceiling.allowedExternalProfiles));\n const allowedExternalProfiles = [...profileSets[0]!]\n .filter((profile) => profileSets.every((profiles) => profiles.has(profile)))\n .sort((left, right) => left.localeCompare(right));\n return {\n version: SUBAGENT_CAPABILITY_CEILING_VERSION,\n ...(allowedTools ? { allowedTools } : {}),\n ...(requiredTools.length ? { requiredTools } : {}),\n ...(active.every((ceiling) => ceiling.allowMcpTools === true) ? { allowMcpTools: true } : {}),\n allowedExternalProfiles,\n denyExtensions: active.some((ceiling) => ceiling.denyExtensions),\n sources: [...new Set(active.flatMap((ceiling) => ceiling.sources))].sort(),\n };\n}\n\nexport function encodeSubagentCapabilityCeiling(\n ceiling: ResolvedSubagentCapabilityCeiling | undefined,\n): string | undefined {\n if (!ceiling) return undefined;\n return Buffer.from(JSON.stringify(ceiling), 'utf8').toString('base64url');\n}\n\nexport function decodeSubagentCapabilityCeiling(\n value: string | undefined,\n): ResolvedSubagentCapabilityCeiling | undefined {\n if (value === undefined || value === '') return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(Buffer.from(value, 'base64url').toString('utf8'));\n } catch (error) {\n throw new Error(`Invalid inherited capability ceiling: ${error instanceof Error ? error.message : String(error)}`);\n }\n if (\n !parsed ||\n typeof parsed !== 'object' ||\n Array.isArray(parsed) ||\n (parsed as { version?: unknown }).version !== SUBAGENT_CAPABILITY_CEILING_VERSION\n ) {\n throw new Error('Invalid inherited capability ceiling version.');\n }\n return parseSubagentCapabilityCeiling(parsed, 'inherited capability ceiling');\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_environment = require("./environment-CaCW3SgT.cjs");
3
- const require_capabilityCeiling = require("./capabilityCeiling-C-Y7H8oC.cjs");
2
+ const require_environment = require("./environment-Cqs7vHJL.cjs");
3
+ const require_capabilityCeiling = require("./capabilityCeiling-CO3ZjYmY.cjs");
4
4
  exports.SUBAGENT_CAPABILITY_CEILING_ENV = require_environment.SUBAGENT_CAPABILITY_CEILING_ENV;
5
5
  exports.SUBAGENT_CAPABILITY_CEILING_VERSION = require_capabilityCeiling.SUBAGENT_CAPABILITY_CEILING_VERSION;
6
6
  exports.SubagentCapabilityPolicyStore = require_capabilityCeiling.SubagentCapabilityPolicyStore;
@@ -1,5 +1,5 @@
1
- import { r as SubagentPolicy } from "./subagentPolicy-ALJam4GN.mjs";
2
- import { y as SUBAGENT_CAPABILITY_CEILING_ENV } from "./environment-ma5oQ7uM.mjs";
1
+ import { r as SubagentPolicy } from "./subagentPolicy-BE-OZoa-.mjs";
2
+ import { y as SUBAGENT_CAPABILITY_CEILING_ENV } from "./environment-Bz1OlWIT.mjs";
3
3
  //#region src/schemas/team/capabilityCeiling.d.ts
4
4
  export declare const SUBAGENT_CAPABILITY_CEILING_VERSION: 2;
5
5
  export type SubagentCapabilityCeiling = {
@@ -1,3 +1,3 @@
1
- import { y as SUBAGENT_CAPABILITY_CEILING_ENV } from "./environment-DrqhrxG_.mjs";
2
- import { a as intersectSubagentCapabilityCeilings, i as encodeSubagentCapabilityCeiling, n as SubagentCapabilityPolicyStore, o as parseSubagentCapabilityCeiling, r as decodeSubagentCapabilityCeiling, t as SUBAGENT_CAPABILITY_CEILING_VERSION } from "./capabilityCeiling-CF7kAS18.mjs";
1
+ import { y as SUBAGENT_CAPABILITY_CEILING_ENV } from "./environment-BtvJI2S-.mjs";
2
+ import { a as intersectSubagentCapabilityCeilings, i as encodeSubagentCapabilityCeiling, n as SubagentCapabilityPolicyStore, o as parseSubagentCapabilityCeiling, r as decodeSubagentCapabilityCeiling, t as SUBAGENT_CAPABILITY_CEILING_VERSION } from "./capabilityCeiling-BaHT9v9S.mjs";
3
3
  export { SUBAGENT_CAPABILITY_CEILING_ENV, SUBAGENT_CAPABILITY_CEILING_VERSION, SubagentCapabilityPolicyStore, decodeSubagentCapabilityCeiling, encodeSubagentCapabilityCeiling, intersectSubagentCapabilityCeilings, parseSubagentCapabilityCeiling };
@@ -13,7 +13,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
13
13
  *
14
14
  * PROTOCOL COMPATIBILITY (do not change):
15
15
  * The event names and version numbers below are shared with po-subagents
16
- * and with doom-task and agiflow-pi-extension, which speak this protocol today.
16
+ * and with po-task and agiflow-pi-extension, which speak this protocol today.
17
17
  * The event names deliberately keep their `prompt-template:` prefix: that is the
18
18
  * established transport, and renaming it would silently stop delivery. Pinned by
19
19
  * contract tests.
@@ -1 +1 @@
1
- {"version":3,"file":"delegation.cjs","names":[],"sources":["../src/schemas/team/delegation.ts"],"sourcesContent":["/**\n * Subagent delegation - a cross-extension event protocol.\n *\n * Delegation lets another extension ask this runtime to run a subagent without\n * depending on its internals: the requester emits a request event and receives\n * started/update/response events back over the host event bus.\n *\n * Two generations coexist. V1 correlates purely by `requestId`. V2 adds\n * `ownerRunId` and `nodeId` so one owner can fan out to many nodes and have each\n * reply routed back, and it carries a typed `result` request.\n *\n * PROTOCOL COMPATIBILITY (do not change):\n * The event names and version numbers below are shared with po-subagents\n * and with doom-task and agiflow-pi-extension, which speak this protocol today.\n * The event names deliberately keep their `prompt-template:` prefix: that is the\n * established transport, and renaming it would silently stop delivery. Pinned by\n * contract tests.\n *\n * AVOID:\n * - Adding a required field to an existing version; add a version instead\n */\n\nexport const SUBAGENT_DELEGATION_PROTOCOL_VERSION = 1 as const;\nexport const SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION = 2 as const;\n\n// This is the established extension-to-extension transport. The public API\n// intentionally reuses it instead of adding a second event protocol.\nexport const SUBAGENT_DELEGATION_REQUEST_EVENT = 'prompt-template:subagent:request';\nexport const SUBAGENT_DELEGATION_STARTED_EVENT = 'prompt-template:subagent:started';\nexport const SUBAGENT_DELEGATION_UPDATE_EVENT = 'prompt-template:subagent:update';\nexport const SUBAGENT_DELEGATION_RESPONSE_EVENT = 'prompt-template:subagent:response';\nexport const SUBAGENT_DELEGATION_CANCEL_EVENT = 'prompt-template:subagent:cancel';\n\nexport interface SubagentDelegationTurnBudget {\n maxTurns: number;\n graceTurns?: number;\n}\n\nexport interface SubagentDelegationToolBudget {\n soft?: number;\n hard: number;\n block?: string[] | '*';\n}\n\nexport interface SubagentDelegationAgentContract {\n version: 1;\n}\n\nexport type SubagentDelegationJsonSchemaObject = Record<string, unknown>;\n\nexport interface SubagentDelegationExecutionResult {\n status: 'completed' | 'failed' | 'paused' | 'stopped' | 'detached';\n success: boolean;\n exitCode: number;\n error?: string;\n interrupted?: boolean;\n timedOut?: boolean;\n stopped?: boolean;\n detached?: boolean;\n}\n\nexport interface SubagentDelegationReviewResult {\n status: 'not-requested' | 'review-required' | 'reviewed' | 'blockers';\n findings?: Array<{ severity: 'blocker' | 'non-blocking'; file?: string; issue: string; rationale: string }>;\n}\n\nexport interface SubagentDelegationEffectsResult {\n fileMutation?: {\n status: 'not-requested' | 'not-applicable' | 'observed' | 'missing';\n expected: boolean;\n attempted: boolean;\n message?: string;\n };\n}\n\nexport type SubagentDelegationAcceptanceEvidence =\n | 'changed-files'\n | 'tests-added'\n | 'commands-run'\n | 'validation-output'\n | 'residual-risks'\n | 'no-staged-files'\n | 'diff-summary'\n | 'review-findings'\n | 'manual-notes';\n\nexport interface SubagentDelegationAcceptanceCriterion {\n id: string;\n must: string;\n evidence?: SubagentDelegationAcceptanceEvidence[];\n severity?: 'required' | 'recommended';\n}\n\nexport interface SubagentDelegationAcceptanceVerifyCommand {\n id: string;\n command: string;\n timeoutMs?: number;\n cwd?: string;\n env?: Record<string, string>;\n allowFailure?: boolean;\n}\n\nexport interface SubagentDelegationAcceptanceReview {\n agent?: string;\n focus?: string;\n required?: boolean;\n}\n\ninterface SubagentDelegationAcceptanceFields {\n criteria?: Array<string | SubagentDelegationAcceptanceCriterion>;\n evidence?: SubagentDelegationAcceptanceEvidence[];\n verify?: SubagentDelegationAcceptanceVerifyCommand[];\n review?: SubagentDelegationAcceptanceReview | false;\n stopRules?: string[];\n}\n\nexport type SubagentDelegationAcceptanceConfig = SubagentDelegationAcceptanceFields &\n ({ level: 'none'; reason: string } | { level?: 'auto' | 'attested' | 'checked' | 'verified'; reason?: string });\n\nexport type SubagentDelegationAcceptance =\n | 'auto'\n | 'attested'\n | 'checked'\n | 'verified'\n | false\n | SubagentDelegationAcceptanceConfig;\n\nexport interface SubagentDelegationRequest {\n version: typeof SUBAGENT_DELEGATION_PROTOCOL_VERSION;\n requestId: string;\n agent: string;\n task: string;\n context: 'fresh' | 'fork';\n cwd: string;\n model?: string;\n timeoutMs?: number;\n turnBudget?: SubagentDelegationTurnBudget;\n toolBudget?: SubagentDelegationToolBudget;\n skill?: string | string[] | boolean;\n output?: string | boolean;\n outputMode?: 'inline' | 'file-only';\n outputSchema?: SubagentDelegationJsonSchemaObject;\n agentContract?: SubagentDelegationAgentContract;\n acceptance?: SubagentDelegationAcceptance;\n artifacts?: boolean;\n /** Foreground remains the compatibility default. */\n runMode?: 'foreground' | 'detached';\n /** Optional task identity shown to active root-session teammates. */\n teamTask?: { id: string; subject: string };\n}\n\nexport interface SubagentDelegationStarted {\n version: typeof SUBAGENT_DELEGATION_PROTOCOL_VERSION;\n requestId: string;\n runId?: string;\n}\n\nexport interface SubagentDelegationUpdate extends SubagentDelegationStarted {\n runId?: string;\n currentTool?: string;\n currentToolArgs?: string;\n recentOutput?: string;\n recentOutputLines?: string[];\n recentTools?: Array<{ tool: string; args: string }>;\n model?: string;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n}\n\nexport type SubagentDelegationStatus =\n | 'completed'\n | 'failed'\n | 'timed_out'\n | 'cancelled'\n | 'interrupted'\n | 'turn_budget_exhausted'\n | 'tool_budget_exhausted'\n | 'structured_output_failed'\n | 'acceptance_failed'\n | 'invalid_request'\n | 'unavailable_context';\n\nexport type SubagentDelegationAcceptanceStatus =\n | 'pending'\n | 'not-required'\n | 'claimed'\n | 'attested'\n | 'checked'\n | 'verified'\n | 'review-required'\n | 'reviewed'\n | 'accepted'\n | 'rejected';\n\nexport interface SubagentDelegationAcceptanceResult {\n status: SubagentDelegationAcceptanceStatus;\n evidenceStatus: Exclude<SubagentDelegationAcceptanceStatus, 'review-required' | 'reviewed' | 'accepted'>;\n explicit: boolean;\n}\n\nexport interface SubagentDelegationResponse extends SubagentDelegationStarted {\n status: SubagentDelegationStatus;\n error?: string;\n runId?: string;\n childIndex?: number;\n agent?: string;\n model?: string;\n exitCode?: number;\n execution?: SubagentDelegationExecutionResult;\n output?: string;\n outputPath?: string;\n sessionFile?: string;\n acceptance?: SubagentDelegationAcceptanceResult;\n review?: SubagentDelegationReviewResult;\n effects?: SubagentDelegationEffectsResult;\n turns?: number;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n warnings?: string[];\n}\n\nexport interface SubagentDelegationCancel extends SubagentDelegationStarted {}\n\nexport type SubagentDelegationV2Thinking = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n\nexport type SubagentDelegationV2ResultRequest =\n | { kind: 'text' }\n | { kind: 'structured'; schema: SubagentDelegationJsonSchemaObject };\n\nexport interface SubagentDelegationV2Request {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId: string;\n nodeId: string;\n agent: string;\n task: string;\n context: 'fresh' | 'fork';\n cwd: string;\n model?: string;\n thinking?: SubagentDelegationV2Thinking;\n timeoutMs?: number;\n turnBudget?: SubagentDelegationTurnBudget;\n toolBudget?: SubagentDelegationToolBudget;\n skill?: string | string[] | boolean;\n artifacts?: boolean;\n result: SubagentDelegationV2ResultRequest;\n}\n\nexport interface SubagentDelegationV2Started {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId: string;\n nodeId: string;\n}\n\nexport interface SubagentDelegationV2Update extends SubagentDelegationV2Started {\n runId?: string;\n currentTool?: string;\n currentToolArgs?: string;\n recentOutput?: string;\n recentOutputLines?: string[];\n recentTools?: Array<{ tool: string; args: string }>;\n model?: string;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n}\n\nexport type SubagentDelegationV2Status = SubagentDelegationStatus | 'duplicate_node';\n\nexport type SubagentDelegationV2Value = { kind: 'text'; text: string } | { kind: 'structured'; value: unknown };\n\nexport interface SubagentDelegationV2Usage {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n turns: number;\n toolCalls: number;\n durationMs: number;\n}\n\nexport interface SubagentDelegationV2TerminalResponse extends SubagentDelegationV2Started {\n status: Exclude<SubagentDelegationV2Status, 'invalid_request'>;\n error?: string;\n runId?: string;\n agent?: string;\n model?: string;\n thinking?: string;\n exitCode?: number;\n launchContractDigest?: string;\n result?: SubagentDelegationV2Value;\n usage?: SubagentDelegationV2Usage;\n}\n\n/** A malformed V2 request can only be correlated by the valid identity fields it supplied. */\nexport interface SubagentDelegationV2InvalidResponse {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId?: string;\n nodeId?: string;\n status: 'invalid_request';\n error?: string;\n}\n\nexport type SubagentDelegationV2Response = SubagentDelegationV2TerminalResponse | SubagentDelegationV2InvalidResponse;\n\nexport interface SubagentDelegationV2Cancel extends SubagentDelegationV2Started {}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAsBA,MAAa,uCAAuC;AACpD,MAAa,0CAA0C;AAIvD,MAAa,oCAAoC;AACjD,MAAa,oCAAoC;AACjD,MAAa,mCAAmC;AAChD,MAAa,qCAAqC;AAClD,MAAa,mCAAmC"}
1
+ {"version":3,"file":"delegation.cjs","names":[],"sources":["../src/schemas/team/delegation.ts"],"sourcesContent":["/**\n * Subagent delegation - a cross-extension event protocol.\n *\n * Delegation lets another extension ask this runtime to run a subagent without\n * depending on its internals: the requester emits a request event and receives\n * started/update/response events back over the host event bus.\n *\n * Two generations coexist. V1 correlates purely by `requestId`. V2 adds\n * `ownerRunId` and `nodeId` so one owner can fan out to many nodes and have each\n * reply routed back, and it carries a typed `result` request.\n *\n * PROTOCOL COMPATIBILITY (do not change):\n * The event names and version numbers below are shared with po-subagents\n * and with po-task and agiflow-pi-extension, which speak this protocol today.\n * The event names deliberately keep their `prompt-template:` prefix: that is the\n * established transport, and renaming it would silently stop delivery. Pinned by\n * contract tests.\n *\n * AVOID:\n * - Adding a required field to an existing version; add a version instead\n */\n\nexport const SUBAGENT_DELEGATION_PROTOCOL_VERSION = 1 as const;\nexport const SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION = 2 as const;\n\n// This is the established extension-to-extension transport. The public API\n// intentionally reuses it instead of adding a second event protocol.\nexport const SUBAGENT_DELEGATION_REQUEST_EVENT = 'prompt-template:subagent:request';\nexport const SUBAGENT_DELEGATION_STARTED_EVENT = 'prompt-template:subagent:started';\nexport const SUBAGENT_DELEGATION_UPDATE_EVENT = 'prompt-template:subagent:update';\nexport const SUBAGENT_DELEGATION_RESPONSE_EVENT = 'prompt-template:subagent:response';\nexport const SUBAGENT_DELEGATION_CANCEL_EVENT = 'prompt-template:subagent:cancel';\n\nexport interface SubagentDelegationTurnBudget {\n maxTurns: number;\n graceTurns?: number;\n}\n\nexport interface SubagentDelegationToolBudget {\n soft?: number;\n hard: number;\n block?: string[] | '*';\n}\n\nexport interface SubagentDelegationAgentContract {\n version: 1;\n}\n\nexport type SubagentDelegationJsonSchemaObject = Record<string, unknown>;\n\nexport interface SubagentDelegationExecutionResult {\n status: 'completed' | 'failed' | 'paused' | 'stopped' | 'detached';\n success: boolean;\n exitCode: number;\n error?: string;\n interrupted?: boolean;\n timedOut?: boolean;\n stopped?: boolean;\n detached?: boolean;\n}\n\nexport interface SubagentDelegationReviewResult {\n status: 'not-requested' | 'review-required' | 'reviewed' | 'blockers';\n findings?: Array<{ severity: 'blocker' | 'non-blocking'; file?: string; issue: string; rationale: string }>;\n}\n\nexport interface SubagentDelegationEffectsResult {\n fileMutation?: {\n status: 'not-requested' | 'not-applicable' | 'observed' | 'missing';\n expected: boolean;\n attempted: boolean;\n message?: string;\n };\n}\n\nexport type SubagentDelegationAcceptanceEvidence =\n | 'changed-files'\n | 'tests-added'\n | 'commands-run'\n | 'validation-output'\n | 'residual-risks'\n | 'no-staged-files'\n | 'diff-summary'\n | 'review-findings'\n | 'manual-notes';\n\nexport interface SubagentDelegationAcceptanceCriterion {\n id: string;\n must: string;\n evidence?: SubagentDelegationAcceptanceEvidence[];\n severity?: 'required' | 'recommended';\n}\n\nexport interface SubagentDelegationAcceptanceVerifyCommand {\n id: string;\n command: string;\n timeoutMs?: number;\n cwd?: string;\n env?: Record<string, string>;\n allowFailure?: boolean;\n}\n\nexport interface SubagentDelegationAcceptanceReview {\n agent?: string;\n focus?: string;\n required?: boolean;\n}\n\ninterface SubagentDelegationAcceptanceFields {\n criteria?: Array<string | SubagentDelegationAcceptanceCriterion>;\n evidence?: SubagentDelegationAcceptanceEvidence[];\n verify?: SubagentDelegationAcceptanceVerifyCommand[];\n review?: SubagentDelegationAcceptanceReview | false;\n stopRules?: string[];\n}\n\nexport type SubagentDelegationAcceptanceConfig = SubagentDelegationAcceptanceFields &\n ({ level: 'none'; reason: string } | { level?: 'auto' | 'attested' | 'checked' | 'verified'; reason?: string });\n\nexport type SubagentDelegationAcceptance =\n | 'auto'\n | 'attested'\n | 'checked'\n | 'verified'\n | false\n | SubagentDelegationAcceptanceConfig;\n\nexport interface SubagentDelegationRequest {\n version: typeof SUBAGENT_DELEGATION_PROTOCOL_VERSION;\n requestId: string;\n agent: string;\n task: string;\n context: 'fresh' | 'fork';\n cwd: string;\n model?: string;\n timeoutMs?: number;\n turnBudget?: SubagentDelegationTurnBudget;\n toolBudget?: SubagentDelegationToolBudget;\n skill?: string | string[] | boolean;\n output?: string | boolean;\n outputMode?: 'inline' | 'file-only';\n outputSchema?: SubagentDelegationJsonSchemaObject;\n agentContract?: SubagentDelegationAgentContract;\n acceptance?: SubagentDelegationAcceptance;\n artifacts?: boolean;\n /** Foreground remains the compatibility default. */\n runMode?: 'foreground' | 'detached';\n /** Optional task identity shown to active root-session teammates. */\n teamTask?: { id: string; subject: string };\n}\n\nexport interface SubagentDelegationStarted {\n version: typeof SUBAGENT_DELEGATION_PROTOCOL_VERSION;\n requestId: string;\n runId?: string;\n}\n\nexport interface SubagentDelegationUpdate extends SubagentDelegationStarted {\n runId?: string;\n currentTool?: string;\n currentToolArgs?: string;\n recentOutput?: string;\n recentOutputLines?: string[];\n recentTools?: Array<{ tool: string; args: string }>;\n model?: string;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n}\n\nexport type SubagentDelegationStatus =\n | 'completed'\n | 'failed'\n | 'timed_out'\n | 'cancelled'\n | 'interrupted'\n | 'turn_budget_exhausted'\n | 'tool_budget_exhausted'\n | 'structured_output_failed'\n | 'acceptance_failed'\n | 'invalid_request'\n | 'unavailable_context';\n\nexport type SubagentDelegationAcceptanceStatus =\n | 'pending'\n | 'not-required'\n | 'claimed'\n | 'attested'\n | 'checked'\n | 'verified'\n | 'review-required'\n | 'reviewed'\n | 'accepted'\n | 'rejected';\n\nexport interface SubagentDelegationAcceptanceResult {\n status: SubagentDelegationAcceptanceStatus;\n evidenceStatus: Exclude<SubagentDelegationAcceptanceStatus, 'review-required' | 'reviewed' | 'accepted'>;\n explicit: boolean;\n}\n\nexport interface SubagentDelegationResponse extends SubagentDelegationStarted {\n status: SubagentDelegationStatus;\n error?: string;\n runId?: string;\n childIndex?: number;\n agent?: string;\n model?: string;\n exitCode?: number;\n execution?: SubagentDelegationExecutionResult;\n output?: string;\n outputPath?: string;\n sessionFile?: string;\n acceptance?: SubagentDelegationAcceptanceResult;\n review?: SubagentDelegationReviewResult;\n effects?: SubagentDelegationEffectsResult;\n turns?: number;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n warnings?: string[];\n}\n\nexport interface SubagentDelegationCancel extends SubagentDelegationStarted {}\n\nexport type SubagentDelegationV2Thinking = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n\nexport type SubagentDelegationV2ResultRequest =\n | { kind: 'text' }\n | { kind: 'structured'; schema: SubagentDelegationJsonSchemaObject };\n\nexport interface SubagentDelegationV2Request {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId: string;\n nodeId: string;\n agent: string;\n task: string;\n context: 'fresh' | 'fork';\n cwd: string;\n model?: string;\n thinking?: SubagentDelegationV2Thinking;\n timeoutMs?: number;\n turnBudget?: SubagentDelegationTurnBudget;\n toolBudget?: SubagentDelegationToolBudget;\n skill?: string | string[] | boolean;\n artifacts?: boolean;\n result: SubagentDelegationV2ResultRequest;\n}\n\nexport interface SubagentDelegationV2Started {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId: string;\n nodeId: string;\n}\n\nexport interface SubagentDelegationV2Update extends SubagentDelegationV2Started {\n runId?: string;\n currentTool?: string;\n currentToolArgs?: string;\n recentOutput?: string;\n recentOutputLines?: string[];\n recentTools?: Array<{ tool: string; args: string }>;\n model?: string;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n}\n\nexport type SubagentDelegationV2Status = SubagentDelegationStatus | 'duplicate_node';\n\nexport type SubagentDelegationV2Value = { kind: 'text'; text: string } | { kind: 'structured'; value: unknown };\n\nexport interface SubagentDelegationV2Usage {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n turns: number;\n toolCalls: number;\n durationMs: number;\n}\n\nexport interface SubagentDelegationV2TerminalResponse extends SubagentDelegationV2Started {\n status: Exclude<SubagentDelegationV2Status, 'invalid_request'>;\n error?: string;\n runId?: string;\n agent?: string;\n model?: string;\n thinking?: string;\n exitCode?: number;\n launchContractDigest?: string;\n result?: SubagentDelegationV2Value;\n usage?: SubagentDelegationV2Usage;\n}\n\n/** A malformed V2 request can only be correlated by the valid identity fields it supplied. */\nexport interface SubagentDelegationV2InvalidResponse {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId?: string;\n nodeId?: string;\n status: 'invalid_request';\n error?: string;\n}\n\nexport type SubagentDelegationV2Response = SubagentDelegationV2TerminalResponse | SubagentDelegationV2InvalidResponse;\n\nexport interface SubagentDelegationV2Cancel extends SubagentDelegationV2Started {}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAsBA,MAAa,uCAAuC;AACpD,MAAa,0CAA0C;AAIvD,MAAa,oCAAoC;AACjD,MAAa,oCAAoC;AACjD,MAAa,mCAAmC;AAChD,MAAa,qCAAqC;AAClD,MAAa,mCAAmC"}
@@ -13,7 +13,7 @@ export * from "@agimon-ai/po-core/delegation";
13
13
  *
14
14
  * PROTOCOL COMPATIBILITY (do not change):
15
15
  * The event names and version numbers below are shared with po-subagents
16
- * and with doom-task and agiflow-pi-extension, which speak this protocol today.
16
+ * and with po-task and agiflow-pi-extension, which speak this protocol today.
17
17
  * The event names deliberately keep their `prompt-template:` prefix: that is the
18
18
  * established transport, and renaming it would silently stop delivery. Pinned by
19
19
  * contract tests.
@@ -13,7 +13,7 @@ export * from "@agimon-ai/po-core/delegation";
13
13
  *
14
14
  * PROTOCOL COMPATIBILITY (do not change):
15
15
  * The event names and version numbers below are shared with po-subagents
16
- * and with doom-task and agiflow-pi-extension, which speak this protocol today.
16
+ * and with po-task and agiflow-pi-extension, which speak this protocol today.
17
17
  * The event names deliberately keep their `prompt-template:` prefix: that is the
18
18
  * established transport, and renaming it would silently stop delivery. Pinned by
19
19
  * contract tests.
@@ -1 +1 @@
1
- {"version":3,"file":"delegation.mjs","names":[],"sources":["../src/schemas/team/delegation.ts"],"sourcesContent":["/**\n * Subagent delegation - a cross-extension event protocol.\n *\n * Delegation lets another extension ask this runtime to run a subagent without\n * depending on its internals: the requester emits a request event and receives\n * started/update/response events back over the host event bus.\n *\n * Two generations coexist. V1 correlates purely by `requestId`. V2 adds\n * `ownerRunId` and `nodeId` so one owner can fan out to many nodes and have each\n * reply routed back, and it carries a typed `result` request.\n *\n * PROTOCOL COMPATIBILITY (do not change):\n * The event names and version numbers below are shared with po-subagents\n * and with doom-task and agiflow-pi-extension, which speak this protocol today.\n * The event names deliberately keep their `prompt-template:` prefix: that is the\n * established transport, and renaming it would silently stop delivery. Pinned by\n * contract tests.\n *\n * AVOID:\n * - Adding a required field to an existing version; add a version instead\n */\n\nexport const SUBAGENT_DELEGATION_PROTOCOL_VERSION = 1 as const;\nexport const SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION = 2 as const;\n\n// This is the established extension-to-extension transport. The public API\n// intentionally reuses it instead of adding a second event protocol.\nexport const SUBAGENT_DELEGATION_REQUEST_EVENT = 'prompt-template:subagent:request';\nexport const SUBAGENT_DELEGATION_STARTED_EVENT = 'prompt-template:subagent:started';\nexport const SUBAGENT_DELEGATION_UPDATE_EVENT = 'prompt-template:subagent:update';\nexport const SUBAGENT_DELEGATION_RESPONSE_EVENT = 'prompt-template:subagent:response';\nexport const SUBAGENT_DELEGATION_CANCEL_EVENT = 'prompt-template:subagent:cancel';\n\nexport interface SubagentDelegationTurnBudget {\n maxTurns: number;\n graceTurns?: number;\n}\n\nexport interface SubagentDelegationToolBudget {\n soft?: number;\n hard: number;\n block?: string[] | '*';\n}\n\nexport interface SubagentDelegationAgentContract {\n version: 1;\n}\n\nexport type SubagentDelegationJsonSchemaObject = Record<string, unknown>;\n\nexport interface SubagentDelegationExecutionResult {\n status: 'completed' | 'failed' | 'paused' | 'stopped' | 'detached';\n success: boolean;\n exitCode: number;\n error?: string;\n interrupted?: boolean;\n timedOut?: boolean;\n stopped?: boolean;\n detached?: boolean;\n}\n\nexport interface SubagentDelegationReviewResult {\n status: 'not-requested' | 'review-required' | 'reviewed' | 'blockers';\n findings?: Array<{ severity: 'blocker' | 'non-blocking'; file?: string; issue: string; rationale: string }>;\n}\n\nexport interface SubagentDelegationEffectsResult {\n fileMutation?: {\n status: 'not-requested' | 'not-applicable' | 'observed' | 'missing';\n expected: boolean;\n attempted: boolean;\n message?: string;\n };\n}\n\nexport type SubagentDelegationAcceptanceEvidence =\n | 'changed-files'\n | 'tests-added'\n | 'commands-run'\n | 'validation-output'\n | 'residual-risks'\n | 'no-staged-files'\n | 'diff-summary'\n | 'review-findings'\n | 'manual-notes';\n\nexport interface SubagentDelegationAcceptanceCriterion {\n id: string;\n must: string;\n evidence?: SubagentDelegationAcceptanceEvidence[];\n severity?: 'required' | 'recommended';\n}\n\nexport interface SubagentDelegationAcceptanceVerifyCommand {\n id: string;\n command: string;\n timeoutMs?: number;\n cwd?: string;\n env?: Record<string, string>;\n allowFailure?: boolean;\n}\n\nexport interface SubagentDelegationAcceptanceReview {\n agent?: string;\n focus?: string;\n required?: boolean;\n}\n\ninterface SubagentDelegationAcceptanceFields {\n criteria?: Array<string | SubagentDelegationAcceptanceCriterion>;\n evidence?: SubagentDelegationAcceptanceEvidence[];\n verify?: SubagentDelegationAcceptanceVerifyCommand[];\n review?: SubagentDelegationAcceptanceReview | false;\n stopRules?: string[];\n}\n\nexport type SubagentDelegationAcceptanceConfig = SubagentDelegationAcceptanceFields &\n ({ level: 'none'; reason: string } | { level?: 'auto' | 'attested' | 'checked' | 'verified'; reason?: string });\n\nexport type SubagentDelegationAcceptance =\n | 'auto'\n | 'attested'\n | 'checked'\n | 'verified'\n | false\n | SubagentDelegationAcceptanceConfig;\n\nexport interface SubagentDelegationRequest {\n version: typeof SUBAGENT_DELEGATION_PROTOCOL_VERSION;\n requestId: string;\n agent: string;\n task: string;\n context: 'fresh' | 'fork';\n cwd: string;\n model?: string;\n timeoutMs?: number;\n turnBudget?: SubagentDelegationTurnBudget;\n toolBudget?: SubagentDelegationToolBudget;\n skill?: string | string[] | boolean;\n output?: string | boolean;\n outputMode?: 'inline' | 'file-only';\n outputSchema?: SubagentDelegationJsonSchemaObject;\n agentContract?: SubagentDelegationAgentContract;\n acceptance?: SubagentDelegationAcceptance;\n artifacts?: boolean;\n /** Foreground remains the compatibility default. */\n runMode?: 'foreground' | 'detached';\n /** Optional task identity shown to active root-session teammates. */\n teamTask?: { id: string; subject: string };\n}\n\nexport interface SubagentDelegationStarted {\n version: typeof SUBAGENT_DELEGATION_PROTOCOL_VERSION;\n requestId: string;\n runId?: string;\n}\n\nexport interface SubagentDelegationUpdate extends SubagentDelegationStarted {\n runId?: string;\n currentTool?: string;\n currentToolArgs?: string;\n recentOutput?: string;\n recentOutputLines?: string[];\n recentTools?: Array<{ tool: string; args: string }>;\n model?: string;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n}\n\nexport type SubagentDelegationStatus =\n | 'completed'\n | 'failed'\n | 'timed_out'\n | 'cancelled'\n | 'interrupted'\n | 'turn_budget_exhausted'\n | 'tool_budget_exhausted'\n | 'structured_output_failed'\n | 'acceptance_failed'\n | 'invalid_request'\n | 'unavailable_context';\n\nexport type SubagentDelegationAcceptanceStatus =\n | 'pending'\n | 'not-required'\n | 'claimed'\n | 'attested'\n | 'checked'\n | 'verified'\n | 'review-required'\n | 'reviewed'\n | 'accepted'\n | 'rejected';\n\nexport interface SubagentDelegationAcceptanceResult {\n status: SubagentDelegationAcceptanceStatus;\n evidenceStatus: Exclude<SubagentDelegationAcceptanceStatus, 'review-required' | 'reviewed' | 'accepted'>;\n explicit: boolean;\n}\n\nexport interface SubagentDelegationResponse extends SubagentDelegationStarted {\n status: SubagentDelegationStatus;\n error?: string;\n runId?: string;\n childIndex?: number;\n agent?: string;\n model?: string;\n exitCode?: number;\n execution?: SubagentDelegationExecutionResult;\n output?: string;\n outputPath?: string;\n sessionFile?: string;\n acceptance?: SubagentDelegationAcceptanceResult;\n review?: SubagentDelegationReviewResult;\n effects?: SubagentDelegationEffectsResult;\n turns?: number;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n warnings?: string[];\n}\n\nexport interface SubagentDelegationCancel extends SubagentDelegationStarted {}\n\nexport type SubagentDelegationV2Thinking = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n\nexport type SubagentDelegationV2ResultRequest =\n | { kind: 'text' }\n | { kind: 'structured'; schema: SubagentDelegationJsonSchemaObject };\n\nexport interface SubagentDelegationV2Request {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId: string;\n nodeId: string;\n agent: string;\n task: string;\n context: 'fresh' | 'fork';\n cwd: string;\n model?: string;\n thinking?: SubagentDelegationV2Thinking;\n timeoutMs?: number;\n turnBudget?: SubagentDelegationTurnBudget;\n toolBudget?: SubagentDelegationToolBudget;\n skill?: string | string[] | boolean;\n artifacts?: boolean;\n result: SubagentDelegationV2ResultRequest;\n}\n\nexport interface SubagentDelegationV2Started {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId: string;\n nodeId: string;\n}\n\nexport interface SubagentDelegationV2Update extends SubagentDelegationV2Started {\n runId?: string;\n currentTool?: string;\n currentToolArgs?: string;\n recentOutput?: string;\n recentOutputLines?: string[];\n recentTools?: Array<{ tool: string; args: string }>;\n model?: string;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n}\n\nexport type SubagentDelegationV2Status = SubagentDelegationStatus | 'duplicate_node';\n\nexport type SubagentDelegationV2Value = { kind: 'text'; text: string } | { kind: 'structured'; value: unknown };\n\nexport interface SubagentDelegationV2Usage {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n turns: number;\n toolCalls: number;\n durationMs: number;\n}\n\nexport interface SubagentDelegationV2TerminalResponse extends SubagentDelegationV2Started {\n status: Exclude<SubagentDelegationV2Status, 'invalid_request'>;\n error?: string;\n runId?: string;\n agent?: string;\n model?: string;\n thinking?: string;\n exitCode?: number;\n launchContractDigest?: string;\n result?: SubagentDelegationV2Value;\n usage?: SubagentDelegationV2Usage;\n}\n\n/** A malformed V2 request can only be correlated by the valid identity fields it supplied. */\nexport interface SubagentDelegationV2InvalidResponse {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId?: string;\n nodeId?: string;\n status: 'invalid_request';\n error?: string;\n}\n\nexport type SubagentDelegationV2Response = SubagentDelegationV2TerminalResponse | SubagentDelegationV2InvalidResponse;\n\nexport interface SubagentDelegationV2Cancel extends SubagentDelegationV2Started {}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAsBA,MAAa,uCAAuC;AACpD,MAAa,0CAA0C;AAIvD,MAAa,oCAAoC;AACjD,MAAa,oCAAoC;AACjD,MAAa,mCAAmC;AAChD,MAAa,qCAAqC;AAClD,MAAa,mCAAmC"}
1
+ {"version":3,"file":"delegation.mjs","names":[],"sources":["../src/schemas/team/delegation.ts"],"sourcesContent":["/**\n * Subagent delegation - a cross-extension event protocol.\n *\n * Delegation lets another extension ask this runtime to run a subagent without\n * depending on its internals: the requester emits a request event and receives\n * started/update/response events back over the host event bus.\n *\n * Two generations coexist. V1 correlates purely by `requestId`. V2 adds\n * `ownerRunId` and `nodeId` so one owner can fan out to many nodes and have each\n * reply routed back, and it carries a typed `result` request.\n *\n * PROTOCOL COMPATIBILITY (do not change):\n * The event names and version numbers below are shared with po-subagents\n * and with po-task and agiflow-pi-extension, which speak this protocol today.\n * The event names deliberately keep their `prompt-template:` prefix: that is the\n * established transport, and renaming it would silently stop delivery. Pinned by\n * contract tests.\n *\n * AVOID:\n * - Adding a required field to an existing version; add a version instead\n */\n\nexport const SUBAGENT_DELEGATION_PROTOCOL_VERSION = 1 as const;\nexport const SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION = 2 as const;\n\n// This is the established extension-to-extension transport. The public API\n// intentionally reuses it instead of adding a second event protocol.\nexport const SUBAGENT_DELEGATION_REQUEST_EVENT = 'prompt-template:subagent:request';\nexport const SUBAGENT_DELEGATION_STARTED_EVENT = 'prompt-template:subagent:started';\nexport const SUBAGENT_DELEGATION_UPDATE_EVENT = 'prompt-template:subagent:update';\nexport const SUBAGENT_DELEGATION_RESPONSE_EVENT = 'prompt-template:subagent:response';\nexport const SUBAGENT_DELEGATION_CANCEL_EVENT = 'prompt-template:subagent:cancel';\n\nexport interface SubagentDelegationTurnBudget {\n maxTurns: number;\n graceTurns?: number;\n}\n\nexport interface SubagentDelegationToolBudget {\n soft?: number;\n hard: number;\n block?: string[] | '*';\n}\n\nexport interface SubagentDelegationAgentContract {\n version: 1;\n}\n\nexport type SubagentDelegationJsonSchemaObject = Record<string, unknown>;\n\nexport interface SubagentDelegationExecutionResult {\n status: 'completed' | 'failed' | 'paused' | 'stopped' | 'detached';\n success: boolean;\n exitCode: number;\n error?: string;\n interrupted?: boolean;\n timedOut?: boolean;\n stopped?: boolean;\n detached?: boolean;\n}\n\nexport interface SubagentDelegationReviewResult {\n status: 'not-requested' | 'review-required' | 'reviewed' | 'blockers';\n findings?: Array<{ severity: 'blocker' | 'non-blocking'; file?: string; issue: string; rationale: string }>;\n}\n\nexport interface SubagentDelegationEffectsResult {\n fileMutation?: {\n status: 'not-requested' | 'not-applicable' | 'observed' | 'missing';\n expected: boolean;\n attempted: boolean;\n message?: string;\n };\n}\n\nexport type SubagentDelegationAcceptanceEvidence =\n | 'changed-files'\n | 'tests-added'\n | 'commands-run'\n | 'validation-output'\n | 'residual-risks'\n | 'no-staged-files'\n | 'diff-summary'\n | 'review-findings'\n | 'manual-notes';\n\nexport interface SubagentDelegationAcceptanceCriterion {\n id: string;\n must: string;\n evidence?: SubagentDelegationAcceptanceEvidence[];\n severity?: 'required' | 'recommended';\n}\n\nexport interface SubagentDelegationAcceptanceVerifyCommand {\n id: string;\n command: string;\n timeoutMs?: number;\n cwd?: string;\n env?: Record<string, string>;\n allowFailure?: boolean;\n}\n\nexport interface SubagentDelegationAcceptanceReview {\n agent?: string;\n focus?: string;\n required?: boolean;\n}\n\ninterface SubagentDelegationAcceptanceFields {\n criteria?: Array<string | SubagentDelegationAcceptanceCriterion>;\n evidence?: SubagentDelegationAcceptanceEvidence[];\n verify?: SubagentDelegationAcceptanceVerifyCommand[];\n review?: SubagentDelegationAcceptanceReview | false;\n stopRules?: string[];\n}\n\nexport type SubagentDelegationAcceptanceConfig = SubagentDelegationAcceptanceFields &\n ({ level: 'none'; reason: string } | { level?: 'auto' | 'attested' | 'checked' | 'verified'; reason?: string });\n\nexport type SubagentDelegationAcceptance =\n | 'auto'\n | 'attested'\n | 'checked'\n | 'verified'\n | false\n | SubagentDelegationAcceptanceConfig;\n\nexport interface SubagentDelegationRequest {\n version: typeof SUBAGENT_DELEGATION_PROTOCOL_VERSION;\n requestId: string;\n agent: string;\n task: string;\n context: 'fresh' | 'fork';\n cwd: string;\n model?: string;\n timeoutMs?: number;\n turnBudget?: SubagentDelegationTurnBudget;\n toolBudget?: SubagentDelegationToolBudget;\n skill?: string | string[] | boolean;\n output?: string | boolean;\n outputMode?: 'inline' | 'file-only';\n outputSchema?: SubagentDelegationJsonSchemaObject;\n agentContract?: SubagentDelegationAgentContract;\n acceptance?: SubagentDelegationAcceptance;\n artifacts?: boolean;\n /** Foreground remains the compatibility default. */\n runMode?: 'foreground' | 'detached';\n /** Optional task identity shown to active root-session teammates. */\n teamTask?: { id: string; subject: string };\n}\n\nexport interface SubagentDelegationStarted {\n version: typeof SUBAGENT_DELEGATION_PROTOCOL_VERSION;\n requestId: string;\n runId?: string;\n}\n\nexport interface SubagentDelegationUpdate extends SubagentDelegationStarted {\n runId?: string;\n currentTool?: string;\n currentToolArgs?: string;\n recentOutput?: string;\n recentOutputLines?: string[];\n recentTools?: Array<{ tool: string; args: string }>;\n model?: string;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n}\n\nexport type SubagentDelegationStatus =\n | 'completed'\n | 'failed'\n | 'timed_out'\n | 'cancelled'\n | 'interrupted'\n | 'turn_budget_exhausted'\n | 'tool_budget_exhausted'\n | 'structured_output_failed'\n | 'acceptance_failed'\n | 'invalid_request'\n | 'unavailable_context';\n\nexport type SubagentDelegationAcceptanceStatus =\n | 'pending'\n | 'not-required'\n | 'claimed'\n | 'attested'\n | 'checked'\n | 'verified'\n | 'review-required'\n | 'reviewed'\n | 'accepted'\n | 'rejected';\n\nexport interface SubagentDelegationAcceptanceResult {\n status: SubagentDelegationAcceptanceStatus;\n evidenceStatus: Exclude<SubagentDelegationAcceptanceStatus, 'review-required' | 'reviewed' | 'accepted'>;\n explicit: boolean;\n}\n\nexport interface SubagentDelegationResponse extends SubagentDelegationStarted {\n status: SubagentDelegationStatus;\n error?: string;\n runId?: string;\n childIndex?: number;\n agent?: string;\n model?: string;\n exitCode?: number;\n execution?: SubagentDelegationExecutionResult;\n output?: string;\n outputPath?: string;\n sessionFile?: string;\n acceptance?: SubagentDelegationAcceptanceResult;\n review?: SubagentDelegationReviewResult;\n effects?: SubagentDelegationEffectsResult;\n turns?: number;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n warnings?: string[];\n}\n\nexport interface SubagentDelegationCancel extends SubagentDelegationStarted {}\n\nexport type SubagentDelegationV2Thinking = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n\nexport type SubagentDelegationV2ResultRequest =\n | { kind: 'text' }\n | { kind: 'structured'; schema: SubagentDelegationJsonSchemaObject };\n\nexport interface SubagentDelegationV2Request {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId: string;\n nodeId: string;\n agent: string;\n task: string;\n context: 'fresh' | 'fork';\n cwd: string;\n model?: string;\n thinking?: SubagentDelegationV2Thinking;\n timeoutMs?: number;\n turnBudget?: SubagentDelegationTurnBudget;\n toolBudget?: SubagentDelegationToolBudget;\n skill?: string | string[] | boolean;\n artifacts?: boolean;\n result: SubagentDelegationV2ResultRequest;\n}\n\nexport interface SubagentDelegationV2Started {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId: string;\n nodeId: string;\n}\n\nexport interface SubagentDelegationV2Update extends SubagentDelegationV2Started {\n runId?: string;\n currentTool?: string;\n currentToolArgs?: string;\n recentOutput?: string;\n recentOutputLines?: string[];\n recentTools?: Array<{ tool: string; args: string }>;\n model?: string;\n toolCount?: number;\n durationMs?: number;\n tokens?: number;\n}\n\nexport type SubagentDelegationV2Status = SubagentDelegationStatus | 'duplicate_node';\n\nexport type SubagentDelegationV2Value = { kind: 'text'; text: string } | { kind: 'structured'; value: unknown };\n\nexport interface SubagentDelegationV2Usage {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n turns: number;\n toolCalls: number;\n durationMs: number;\n}\n\nexport interface SubagentDelegationV2TerminalResponse extends SubagentDelegationV2Started {\n status: Exclude<SubagentDelegationV2Status, 'invalid_request'>;\n error?: string;\n runId?: string;\n agent?: string;\n model?: string;\n thinking?: string;\n exitCode?: number;\n launchContractDigest?: string;\n result?: SubagentDelegationV2Value;\n usage?: SubagentDelegationV2Usage;\n}\n\n/** A malformed V2 request can only be correlated by the valid identity fields it supplied. */\nexport interface SubagentDelegationV2InvalidResponse {\n version: typeof SUBAGENT_DELEGATION_V2_PROTOCOL_VERSION;\n requestId: string;\n ownerRunId?: string;\n nodeId?: string;\n status: 'invalid_request';\n error?: string;\n}\n\nexport type SubagentDelegationV2Response = SubagentDelegationV2TerminalResponse | SubagentDelegationV2InvalidResponse;\n\nexport interface SubagentDelegationV2Cancel extends SubagentDelegationV2Started {}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAsBA,MAAa,uCAAuC;AACpD,MAAa,0CAA0C;AAIvD,MAAa,oCAAoC;AACjD,MAAa,oCAAoC;AACjD,MAAa,mCAAmC;AAChD,MAAa,qCAAqC;AAClD,MAAa,mCAAmC"}