@agimon-ai/po-team 0.0.0-alpha.2 → 0.0.0-alpha.3
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.
- package/dist/apiContracts.cjs +2 -2
- package/dist/apiContracts.cjs.map +1 -1
- package/dist/apiContracts.mjs +2 -2
- package/dist/apiContracts.mjs.map +1 -1
- package/dist/delegationApi.mjs +1 -2
- package/dist/env.mjs +1 -2
- package/dist/extensions/native.mjs +14 -0
- package/dist/extensions/native.mjs.map +1 -1
- package/dist/extensions/server.cjs +63 -10
- package/dist/extensions/server.cjs.map +1 -1
- package/dist/extensions/server.mjs +64 -11
- package/dist/extensions/server.mjs.map +1 -1
- package/dist/fablePlan.mjs +1 -2
- package/dist/fablePlanApi.mjs +1 -2
- package/dist/runtimeSubagentPolicy.mjs +1 -2
- package/dist/runtimeSubagentTool.cjs +6 -1
- package/dist/runtimeSubagentTool.mjs +1 -2
- package/dist/subagentPolicy.mjs +1 -2
- package/dist/subagentTool.cjs +6 -1
- package/dist/subagentTool.mjs +1 -2
- package/dist/teamSnapshot.d.mts +1 -0
- package/dist/teamSnapshot.mjs +1 -2
- package/package.json +15 -14
package/dist/apiContracts.cjs
CHANGED
|
@@ -138,7 +138,7 @@ const apiContracts = (0, _agimon_ai_po_core_apiContracts.defineApiContract)({
|
|
|
138
138
|
sockets: ["global", "workspace"].flatMap((scope) => [{
|
|
139
139
|
id: "team.runs",
|
|
140
140
|
scope,
|
|
141
|
-
service: "po.hub
|
|
141
|
+
service: "po.hub",
|
|
142
142
|
member: "subagent_runs",
|
|
143
143
|
kind: "channel",
|
|
144
144
|
direction: "server-to-client",
|
|
@@ -147,7 +147,7 @@ const apiContracts = (0, _agimon_ai_po_core_apiContracts.defineApiContract)({
|
|
|
147
147
|
}, {
|
|
148
148
|
id: "team.catalog.channel",
|
|
149
149
|
scope,
|
|
150
|
-
service: "po.hub
|
|
150
|
+
service: "po.hub",
|
|
151
151
|
member: "subagent_catalog",
|
|
152
152
|
kind: "channel",
|
|
153
153
|
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
|
|
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',\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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"}
|
package/dist/apiContracts.mjs
CHANGED
|
@@ -134,7 +134,7 @@ const apiContracts = defineApiContract({
|
|
|
134
134
|
sockets: ["global", "workspace"].flatMap((scope) => [{
|
|
135
135
|
id: "team.runs",
|
|
136
136
|
scope,
|
|
137
|
-
service: "po.hub
|
|
137
|
+
service: "po.hub",
|
|
138
138
|
member: "subagent_runs",
|
|
139
139
|
kind: "channel",
|
|
140
140
|
direction: "server-to-client",
|
|
@@ -143,7 +143,7 @@ const apiContracts = defineApiContract({
|
|
|
143
143
|
}, {
|
|
144
144
|
id: "team.catalog.channel",
|
|
145
145
|
scope,
|
|
146
|
-
service: "po.hub
|
|
146
|
+
service: "po.hub",
|
|
147
147
|
member: "subagent_catalog",
|
|
148
148
|
kind: "channel",
|
|
149
149
|
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
|
|
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',\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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"}
|
package/dist/delegationApi.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { DOOM_DELEGATION_ACCEPTED_EVENT, DOOM_DELEGATION_CANCELLED_EVENT, DOOM_DELEGATION_FINISHED_EVENT, DOOM_DELEGATION_REQUESTED_EVENT, DOOM_DELEGATION_SERVICE, DOOM_DELEGATION_STARTED_EVENT, DOOM_DELEGATION_UPDATED_EVENT, DelegationAcceptedSchema, DelegationCancelSchema, DelegationRequestSchema, DelegationResultSchema, DelegationStartedSchema, DelegationStatusSchema, DelegationUpdateSchema, readDoomDelegationService };
|
|
1
|
+
export { DOOM_DELEGATION_ACCEPTED_EVENT, DOOM_DELEGATION_CANCELLED_EVENT, DOOM_DELEGATION_FINISHED_EVENT, DOOM_DELEGATION_REQUESTED_EVENT, DOOM_DELEGATION_SERVICE, DOOM_DELEGATION_STARTED_EVENT, DOOM_DELEGATION_UPDATED_EVENT, DelegationAcceptedSchema, DelegationCancelSchema, DelegationRequestSchema, DelegationResultSchema, DelegationStartedSchema, DelegationStatusSchema, DelegationUpdateSchema, readDoomDelegationService } from "@agimon-ai/po-core/delegation";
|
package/dist/env.mjs
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
|
|
2
|
-
export { CHILD_TOOL_DIAGNOSTIC_PATH_ENV, EXTRA_AGENT_DIRS_ENV, EXTRA_SKILL_DIRS_ENV, INHERIT_PROJECT_CONTEXT_ENV, INHERIT_SKILLS_ENV, MAX_SPAWNS_PER_SESSION_ENV, MCP_DIRECT_CHILD_TOOLS_ENV, MCP_DIRECT_TOOLS_ENV, PI_CODING_AGENT_PACKAGE_ROOT_ENV, PI_INTERCOM_SESSION_ID_ENV, PI_INTERCOM_STABLE_ID_ENV, PI_RUNTIME_NAME, PI_SUBAGENT_PI_BINARY_ENV, PO_CHILD_EXTENSIONS_ENV, PO_SKILL_DIRS_ENV, REQUIRED_CHILD_TOOLS_ENV, STRUCTURED_OUTPUT_CAPTURE_ENV, STRUCTURED_OUTPUT_SCHEMA_ENV, SUBAGENT_CAPABILITY_CEILING_ENV, SUBAGENT_CHILD_AGENT_ENV, SUBAGENT_CHILD_ENV, SUBAGENT_CHILD_INDEX_ENV, SUBAGENT_FANOUT_CHILD_ENV, SUBAGENT_INTERCOM_SESSION_NAME_ENV, SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV, SUBAGENT_PARENT_CHILD_INDEX_ENV, SUBAGENT_PARENT_CONTROL_INBOX_ENV, SUBAGENT_PARENT_DEPTH_ENV, SUBAGENT_PARENT_EVENT_SINK_ENV, SUBAGENT_PARENT_PATH_ENV, SUBAGENT_PARENT_ROOT_RUN_ID_ENV, SUBAGENT_PARENT_RUN_ID_ENV, SUBAGENT_PARENT_SESSION_ENV, SUBAGENT_PROTECTED_PARENT_PIDS_ENV, SUBAGENT_ROOT_SESSION_ENV, SUBAGENT_RUN_ID_ENV, SUBAGENT_STEER_ACK_DIR_ENV, SUBAGENT_STEER_CAPABILITY_ENV, SUBAGENT_STEER_INBOX_ENV, TOOL_BUDGET_ENV, TOOL_BUDGET_ZERO_AUTH_ENV, WORKTREE_BASE_DIR_ENV, decodeProtectedParentProcessIds, runtimeBinaryEnvVar };
|
|
1
|
+
export { t as CHILD_TOOL_DIAGNOSTIC_PATH_ENV, n as EXTRA_AGENT_DIRS_ENV, r as EXTRA_SKILL_DIRS_ENV, i as INHERIT_PROJECT_CONTEXT_ENV, a as INHERIT_SKILLS_ENV, o as MAX_SPAWNS_PER_SESSION_ENV, s as MCP_DIRECT_CHILD_TOOLS_ENV, c as MCP_DIRECT_TOOLS_ENV, l as PI_CODING_AGENT_PACKAGE_ROOT_ENV, u as PI_INTERCOM_SESSION_ID_ENV, d as PI_INTERCOM_STABLE_ID_ENV, f as PI_RUNTIME_NAME, p as PI_SUBAGENT_PI_BINARY_ENV, m as PO_CHILD_EXTENSIONS_ENV, h as PO_SKILL_DIRS_ENV, g as REQUIRED_CHILD_TOOLS_ENV, _ as STRUCTURED_OUTPUT_CAPTURE_ENV, v as STRUCTURED_OUTPUT_SCHEMA_ENV, y as SUBAGENT_CAPABILITY_CEILING_ENV, b as SUBAGENT_CHILD_AGENT_ENV, x as SUBAGENT_CHILD_ENV, S as SUBAGENT_CHILD_INDEX_ENV, C as SUBAGENT_FANOUT_CHILD_ENV, w as SUBAGENT_INTERCOM_SESSION_NAME_ENV, T as SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV, E as SUBAGENT_PARENT_CHILD_INDEX_ENV, D as SUBAGENT_PARENT_CONTROL_INBOX_ENV, O as SUBAGENT_PARENT_DEPTH_ENV, k as SUBAGENT_PARENT_EVENT_SINK_ENV, A as SUBAGENT_PARENT_PATH_ENV, j as SUBAGENT_PARENT_ROOT_RUN_ID_ENV, M as SUBAGENT_PARENT_RUN_ID_ENV, N as SUBAGENT_PARENT_SESSION_ENV, P as SUBAGENT_PROTECTED_PARENT_PIDS_ENV, F as SUBAGENT_ROOT_SESSION_ENV, I as SUBAGENT_RUN_ID_ENV, L as SUBAGENT_STEER_ACK_DIR_ENV, R as SUBAGENT_STEER_CAPABILITY_ENV, z as SUBAGENT_STEER_INBOX_ENV, B as TOOL_BUDGET_ENV, V as TOOL_BUDGET_ZERO_AUTH_ENV, H as WORKTREE_BASE_DIR_ENV, U as decodeProtectedParentProcessIds, W as runtimeBinaryEnvVar } from "./environment-DrqhrxG_.mjs";
|
|
@@ -6,6 +6,14 @@ import { View } from "react-native-unistyles/components/native/View";
|
|
|
6
6
|
import { Text } from "react-native-unistyles/components/native/Text";
|
|
7
7
|
import { StyleSheet } from "react-native-unistyles";
|
|
8
8
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
//#region src/extensions/workspaces/(frontend)/fill/Team.home.native.ts
|
|
10
|
+
var Team_home_native_default = defineFill({ data: {
|
|
11
|
+
version: 1,
|
|
12
|
+
label: "Team",
|
|
13
|
+
source: "subagent_runs",
|
|
14
|
+
destination: "agents"
|
|
15
|
+
} });
|
|
16
|
+
//#endregion
|
|
9
17
|
//#region src/extensions/workspaces/sessions/(frontend)/_lib/catalog.native.ts
|
|
10
18
|
const routes = defineApiRoutes({
|
|
11
19
|
catalog: {
|
|
@@ -731,6 +739,12 @@ const via = (identity, value) => value === void 0 ? void 0 : {
|
|
|
731
739
|
};
|
|
732
740
|
const nativePlugin = defineNativePlugin({
|
|
733
741
|
id: "subagents",
|
|
742
|
+
workspace: { get fills() {
|
|
743
|
+
return [via({
|
|
744
|
+
slot: "home",
|
|
745
|
+
id: "team"
|
|
746
|
+
}, Team_home_native_default)];
|
|
747
|
+
} },
|
|
734
748
|
session: {
|
|
735
749
|
get activityGroups() {
|
|
736
750
|
return [via({ name: "agents" }, agents_native_default)];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.mjs","names":["isRecord","isRecord","WebPluginSlotProps","Badge","Button","Dot","Input","ListRow","SegmentedControl","Sheet","SheetBody","SheetContent","SheetHeader","SheetTitle","Textarea","useCallback","useEffect","useState","useSyncExternalStore","StyleSheet","SubagentCatalogAgent","SubagentRun","launchAgent","steerRun","catalog","closeCatalog","loadCatalog","openCatalog","agentRunLabel","formatRunDuration","agentMeta","filterCatalog","modelChoices","clearPendingLaunch","dismissRun","isTerminalRun","requestLaunch","requestRunStop","subagents","visibleRuns","useSubagents","sessionId","subscribe","listener","sub","store","unsubscribe","select","state","subagentsTab","Parameters","id","label","panel","SubagentsPanel","agentThreadTab","run","runId","props","AgentRunRow","onPress","detail","error","summary","split","find","line","trim","currentTool","tail","at","styles","body","map","openTransientTab","AgentCatalog","filter","setFilter","agent","setAgent","open","undefined","name","models","task","loading","meta","warning","agents","item","description","AgentLaunch","initialTask","onClose","setTask","fork","setFork","defaultContext","model","setModel","busy","setBusy","setError","launch","cause","Error","message","String","value","choice","selected","AgentThreadPanel","renderThread","runs","guidance","setGuidance","notice","setNotice","confirmClear","setConfirmClear","act","action","Promise","screen","title","Math","max","endedAt","lastUpdate","startedAt","stopRequested","includes","transcript","result","create","theme","flex","backgroundColor","colors","bg","uni__dependencies","padding","spacing","gap","color","hi","fontSize","base","fontWeight","dim","sm","red","WebPluginSlotProps","Button","AgentRunRow","agentThreadTab","subagentsTab","useSubagents","openCatalog","activityRuns","AgentsActivitySection","sessionId","openTransientTab","state","runs","map","run","runId","length","activityGroupAgents","channelSubagentCatalog","channelSubagentRuns","fillAgents"],"sources":["../../src/extensions/workspaces/sessions/(frontend)/_lib/catalog.native.ts","../../src/types/webSubagents.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/catalogStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/format.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/launchCommand.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/subagentsStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/SubagentsPanel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/activity-group/agents.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/subagent-catalog.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/subagent-runs.native.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/AgentsActivitySection.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/Agents.activity.agents.native.tsx","../../generated/native.ts"],"sourcesContent":["import { createApiClient, defineApiRoutes, nativeApiTransport, sessionApiAddress } from '@agimon-ai/po-core/native';\n\nimport type {\n SubagentCatalogAgent,\n SubagentCatalogPayload,\n SubagentSteerResult,\n} from '../../../../../types/webSubagents';\nimport type { LaunchRequest } from './launchCommand';\n\nconst routes = defineApiRoutes({\n catalog: { method: 'GET', path: '/catalog' },\n run: { method: 'POST', path: '/run' },\n steer: { method: 'POST', path: '/steer' },\n stop: { method: 'POST', path: '/stop' },\n});\nconst api = createApiClient(routes, {\n scopes: ['session'],\n basePath: 'team',\n transport: nativeApiTransport,\n sessionAddress: sessionApiAddress,\n});\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isStrings(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === 'string');\n}\n\nfunction isAgent(value: unknown): value is SubagentCatalogAgent {\n return (\n isRecord(value) &&\n typeof value.name === 'string' &&\n typeof value.description === 'string' &&\n typeof value.filePath === 'string' &&\n ['project', 'user', 'plugin'].includes(String(value.source)) &&\n (value.packageName === undefined || typeof value.packageName === 'string') &&\n (value.model === undefined || typeof value.model === 'string') &&\n isStrings(value.fallbackModels) &&\n isStrings(value.tools) &&\n isStrings(value.skills) &&\n isStrings(value.extensions) &&\n (value.defaultContext === 'fresh' || value.defaultContext === 'fork')\n );\n}\n\n/** Read the selected session's catalog through the host's authenticated HTTP transport. */\nexport async function fetchCatalog(sessionId: string, signal: AbortSignal): Promise<SubagentCatalogPayload> {\n const response = await api.session(sessionId).catalog({\n signal,\n });\n const body: unknown = response.data;\n if (!response.ok) {\n throw new Error(\n isRecord(body) && typeof body.error === 'string'\n ? body.error\n : `Agent catalog could not be loaded (${response.status}).`,\n );\n }\n if (\n !isRecord(body) ||\n typeof body.cwd !== 'string' ||\n !Array.isArray(body.agents) ||\n !body.agents.every(isAgent) ||\n !isStrings(body.models)\n ) {\n throw new Error('The server returned an invalid agent catalog.');\n }\n return { cwd: body.cwd, agents: body.agents, models: body.models };\n}\n\n/** Launch on the selected session host, without submitting a parent prompt. */\nexport async function launchAgent(sessionId: string, request: LaunchRequest): Promise<string> {\n const response = await api.session(sessionId).run({\n body: request,\n });\n const body: unknown = response.data;\n if (!response.ok) {\n throw new Error(\n isRecord(body) && typeof body.error === 'string'\n ? body.error\n : `Agent could not be launched (${response.status}).`,\n );\n }\n if (!isRecord(body) || typeof body.runId !== 'string' || body.runId === '')\n throw new Error('The server returned an invalid run ID.');\n return body.runId;\n}\n\nfunction isSteerState(value: unknown): value is SubagentSteerResult['state'] {\n return value === 'delivered' || value === 'failed' || value === 'pending';\n}\n\n/** Steer one run on the selected session host, without submitting a parent prompt. */\nexport async function steerRun(sessionId: string, runId: string, message: string): Promise<SubagentSteerResult> {\n const response = await api.session(sessionId).steer({\n body: { runId, message },\n });\n const body: unknown = response.data;\n if (!response.ok) {\n throw new Error(\n isRecord(body) && typeof body.error === 'string'\n ? body.error\n : `Guidance could not be sent (${response.status}).`,\n );\n }\n if (!isRecord(body) || !isSteerState(body.state) || typeof body.message !== 'string')\n throw new Error('The server returned an invalid steer result.');\n return { state: body.state, message: body.message };\n}\n\n/** Ask the selected session host to stop one run; the run's own status reports when it has. */\nexport async function stopRun(sessionId: string, runId: string): Promise<void> {\n const response = await api.session(sessionId).stop({\n body: { runId },\n });\n const body: unknown = response.data;\n if (!response.ok) {\n throw new Error(\n isRecord(body) && typeof body.error === 'string'\n ? body.error\n : `The run could not be stopped (${response.status}).`,\n );\n }\n}\n","/**\n * Subagent run view types shared by this package's hub channel and its web\n * plugin. The shapes mirror the per-run status files this package's own\n * runtime writes; the cockpit renders them as 'subagent_runs' channel\n * payloads.\n */\n\n/** Coarse run state the cockpit renders; rawState keeps doom-team's exact word. */\nexport type SubagentRunState = 'queued' | 'running' | 'done' | 'failed' | 'stopped';\n\n/**\n * One subagent run of a session, read from doom-team's per-run status file.\n */\nexport interface SubagentRun {\n runId: string;\n agent: string;\n /**\n * Generated addressable identity, for example `alan-reviewer-3`.\n *\n * Additive and optional: a run projected before identities existed, and any\n * run whose claim could not be written, still arrives without one.\n */\n identity?: string;\n /** True when this run came from a one-shot inline agent definition. */\n inline?: boolean;\n state: SubagentRunState;\n rawState: string;\n /** The delegation prompt the main agent gave this run. */\n task: string;\n /** A doom-task binding, when the delegation named one; wins over task in the card. */\n taskRef?: string;\n model?: string;\n cwd: string;\n /** The child transcript path, when the session host exposes one. */\n sessionFile?: string;\n /** Epoch milliseconds, as doom-team writes them. */\n startedAt: number;\n endedAt?: number;\n lastUpdate: number;\n /** Live one-liner of what the run is doing right now. */\n currentTool?: string;\n toolCount?: number;\n tokens?: number;\n cost?: number;\n /** Final report, present once the run finished. */\n summary?: string;\n /** Failure reason, present when the run failed. */\n error?: string;\n /** Recent output lines, oldest first, capped. */\n tail: string[];\n}\n\nexport const SUBAGENT_RUNS_TYPE = 'subagent_runs';\n\n/** How the runtime answered one steer: delivered, refused by the run, or not yet acknowledged. */\nexport interface SubagentSteerResult {\n state: 'delivered' | 'failed' | 'pending';\n message: string;\n}\n/** Where an agent definition came from; the catalog groups by it, nearest first. */\nexport type SubagentCatalogSource = 'project' | 'user' | 'plugin';\n\n/** One launchable agent, as the catalog lists it. */\nexport interface SubagentCatalogAgent {\n name: string;\n source: SubagentCatalogSource;\n /** The package that staged a plugin agent. */\n packageName?: string;\n description: string;\n /** The model the definition pins; absent means the runtime's default. */\n model?: string;\n fallbackModels: string[];\n /** Empty means the definition does not narrow the tool set. */\n tools: string[];\n skills: string[];\n extensions: string[];\n defaultContext: 'fresh' | 'fork';\n filePath: string;\n}\n\n/** The 'subagent_catalog' channel payload: the agents a session's directory can launch. */\nexport interface SubagentCatalogPayload {\n cwd: string;\n agents: SubagentCatalogAgent[];\n /** Model specs the active team package offers, for the launch dialog's picker. */\n models: string[];\n /** Why the list may be incomplete, when discovery failed. */\n warning?: string;\n}\n\nexport const SUBAGENT_CATALOG_TYPE = 'subagent_catalog';\n","import { defineSessionStore } from '@agimon-ai/po-core/native';\n\nimport {\n SUBAGENT_CATALOG_TYPE,\n type SubagentCatalogAgent,\n type SubagentCatalogPayload,\n} from '../../../../../types/webSubagents';\nimport { fetchCatalog } from './catalog.native';\n\n/** One session's catalog: what the hub last reported plus what the drawer is doing with it. */\nexport interface CatalogSession {\n cwd: string;\n agents: SubagentCatalogAgent[];\n models: string[];\n warning: string | undefined;\n loading: boolean;\n requestId: number;\n /** True while the catalog drawer is shown in the subagents tab. */\n open: boolean;\n filter: string;\n /** Task text carried from the surface that opened the catalog. */\n task: string;\n /** The highlighted row, by agent name. */\n selected: string | undefined;\n /** The row whose resources are unfolded. */\n inspected: string | undefined;\n /** The agent the launch dialog is open for, and the context it opened with. */\n launch: { agent: string; fork: boolean } | undefined;\n}\n\nexport const catalog = defineSessionStore<CatalogSession>({\n cwd: '',\n agents: [],\n models: [],\n warning: undefined,\n loading: false,\n requestId: 0,\n open: false,\n filter: '',\n task: '',\n selected: undefined,\n inspected: undefined,\n launch: undefined,\n});\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function openCatalog(sessionId: string, task = ''): void {\n catalog.update(sessionId, (current) => ({ ...current, open: true, task }));\n}\n\nexport function closeCatalog(sessionId: string): void {\n catalog.update(sessionId, (current) => ({ ...current, open: false, task: '', launch: undefined }));\n}\n\nexport function setCatalogFilter(sessionId: string, filter: string): void {\n catalog.update(sessionId, (current) => ({ ...current, filter }));\n}\n\nexport function selectAgent(sessionId: string, name: string | undefined): void {\n catalog.update(sessionId, (current) => ({ ...current, selected: name }));\n}\n\nexport function toggleInspect(sessionId: string, name: string): void {\n catalog.update(sessionId, (current) => ({ ...current, inspected: current.inspected === name ? undefined : name }));\n}\n\nexport function openLaunch(sessionId: string, agent: string, fork: boolean): void {\n catalog.update(sessionId, (current) => ({ ...current, selected: agent, launch: { agent, fork } }));\n}\n\nexport function closeLaunch(sessionId: string): void {\n catalog.update(sessionId, (current) => ({ ...current, launch: undefined }));\n}\n\n/** Each drawer opening owns one request and cancels it when the drawer leaves. */\nexport function loadCatalog(sessionId: string): () => void {\n const controller = new AbortController();\n const requestId = catalog.select(catalog.store.state, sessionId).requestId + 1;\n catalog.update(sessionId, (current) => ({ ...current, requestId, loading: true, warning: undefined }));\n const isCurrent = (): boolean =>\n !controller.signal.aborted && catalog.store.state[sessionId]?.requestId === requestId;\n void fetchCatalog(sessionId, controller.signal)\n .then((payload) => {\n if (isCurrent()) subagentCatalogChannel.apply(sessionId, payload);\n })\n .catch((error: unknown) => {\n if (isCurrent())\n catalog.update(sessionId, (current) => ({\n ...current,\n warning: error instanceof Error ? error.message : String(error),\n }));\n })\n .finally(() => {\n if (isCurrent()) catalog.update(sessionId, (current) => ({ ...current, loading: false }));\n });\n return () => {\n if (isCurrent()) catalog.update(sessionId, (current) => ({ ...current, loading: false }));\n controller.abort();\n };\n}\n\n/** The plugin's catalog channel: 'subagent_catalog' payloads into the store; the drawer's own state survives a refresh. */\nexport const subagentCatalogChannel = catalog.channel<SubagentCatalogPayload>({\n channel: SUBAGENT_CATALOG_TYPE,\n parse(input) {\n if (!isRecord(input) || typeof input.cwd !== 'string' || !Array.isArray(input.agents)) return null;\n const models = Array.isArray(input.models) ? input.models.filter((m): m is string => typeof m === 'string') : [];\n return {\n cwd: input.cwd,\n agents: input.agents.filter(isRecord) as unknown as SubagentCatalogAgent[],\n models,\n ...(typeof input.warning === 'string' ? { warning: input.warning } : {}),\n };\n },\n reduce(current, payload) {\n const names = new Set(payload.agents.map((agent) => agent.name));\n return {\n ...current,\n cwd: payload.cwd,\n agents: payload.agents,\n models: payload.models,\n warning: payload.warning,\n selected: current.selected !== undefined && names.has(current.selected) ? current.selected : undefined,\n inspected: current.inspected !== undefined && names.has(current.inspected) ? current.inspected : undefined,\n launch: current.launch !== undefined && names.has(current.launch.agent) ? current.launch : undefined,\n };\n },\n});\n","/**\n * Local copies of the host cockpit's pure formatters\n * (po-web src/web/lib/sessionSummary.ts): this plugin ships zero host\n * imports so the cockpit's bundler can compile it from any install.\n */\nconst MINUTE_MS = 60 * 1000;\nconst HOUR_MS = 60 * MINUTE_MS;\n\nexport function formatRunDuration(elapsedMs: number): string {\n if (elapsedMs < MINUTE_MS) return '<1m';\n if (elapsedMs < HOUR_MS) return `${Math.floor(elapsedMs / MINUTE_MS)}m`;\n const hours = Math.floor(elapsedMs / HOUR_MS);\n const minutes = Math.floor((elapsedMs % HOUR_MS) / MINUTE_MS);\n return `${hours}h ${String(minutes).padStart(2, '0')}m`;\n}\n\nexport function abbreviateCwd(cwd: string): string {\n const match = /^\\/(?:Users|home)\\/[^/]+/u.exec(cwd);\n if (!match) return cwd;\n return `~${cwd.slice(match[0].length)}`;\n}\n\n/**\n * What to call a run on screen.\n *\n * Prefers the generated identity, because a fan-out of one agent otherwise\n * renders as N rows reading the same word. Falls back to the agent name for a\n * run projected before identities existed. Duplicated rather than imported\n * from `services/agentIdentity`, which reaches for `node:fs` and so cannot be\n * pulled into the browser bundle; that module owns minting, this owns display.\n */\nexport function agentRunLabel(run: { agent: string; identity?: string; inline?: boolean }): string {\n const base = run.identity ?? run.agent;\n return run.inline ? `${base} (inline)` : base;\n}\n","import type { SubagentCatalogAgent, SubagentCatalogSource } from '../../../../../types/webSubagents';\n\nconst META_TOOL_LIMIT = 3;\n\nexport interface LaunchRequest {\n agent: string;\n task: string;\n /** A pinned model overrides the agent's default; absent keeps the agent's own. */\n model?: string;\n fork: boolean;\n}\n\n/** Rows whose name, source, package, description or a tool contains the filter, case-insensitively. */\nexport function filterCatalog(agents: readonly SubagentCatalogAgent[], filter: string): SubagentCatalogAgent[] {\n const needle = filter.trim().toLowerCase();\n if (needle === '') return [...agents];\n return agents.filter((agent) =>\n [agent.name, agent.source, agent.packageName ?? '', agent.description, ...agent.tools].some((field) =>\n field.toLowerCase().includes(needle),\n ),\n );\n}\n\nexport interface CatalogSection {\n source: SubagentCatalogSource;\n label: string;\n agents: SubagentCatalogAgent[];\n}\n\nconst SECTION_LABEL: Readonly<Record<SubagentCatalogSource, string>> = {\n project: 'PROJECT',\n user: 'USER',\n plugin: 'PACKAGES',\n};\n\n/** The catalog's sections, nearest source first, keeping the payload's order inside each; empty ones are left out. */\nexport function groupCatalog(agents: readonly SubagentCatalogAgent[]): CatalogSection[] {\n const sections: CatalogSection[] = [];\n for (const source of ['project', 'user', 'plugin'] as const) {\n const members = agents.filter((agent) => agent.source === source);\n if (members.length > 0) sections.push({ source, label: SECTION_LABEL[source], agents: members });\n }\n return sections;\n}\n\n/** What the picker offers: the agent's own model and fallbacks first, then the team's, without repeats. */\nexport function modelChoices(agent: SubagentCatalogAgent, models: readonly string[]): string[] {\n const seen = new Set<string>();\n const choices: string[] = [];\n for (const model of [agent.model ?? '', ...agent.fallbackModels, ...models]) {\n if (model === '' || seen.has(model)) continue;\n seen.add(model);\n choices.push(model);\n }\n return choices;\n}\n\n/** The row's one-liner: what tools it may use, how many skills, and how it starts. */\nexport function agentMeta(agent: SubagentCatalogAgent): string {\n const tools =\n agent.tools.length === 0\n ? 'all tools'\n : `tools ${agent.tools.slice(0, META_TOOL_LIMIT).join(', ')}${\n agent.tools.length > META_TOOL_LIMIT ? ` +${agent.tools.length - META_TOOL_LIMIT}` : ''\n }`;\n const skills =\n agent.skills.length > 0 ? ` · ${agent.skills.length} skill${agent.skills.length === 1 ? '' : 's'}` : '';\n return `${tools}${skills} · ${agent.defaultContext === 'fork' ? 'forks the session' : 'fresh context'}`;\n}\n","import { defineSessionStore } from '@agimon-ai/po-core/native';\n\nimport { SUBAGENT_RUNS_TYPE, type SubagentRun } from '../../../../../types/webSubagents';\nimport { stopRun } from './catalog.native';\nconst TERMINAL_STATES: ReadonlySet<SubagentRun['state']> = new Set(['done', 'failed', 'stopped']);\n\nexport function isTerminalRun(run: SubagentRun): boolean {\n return TERMINAL_STATES.has(run.state);\n}\n\n/** One session's record: the fleet the hub last reported plus what this page did with it. */\nexport interface SubagentsSession {\n /** The fleet the hub last reported; presented order preserved. */\n runs: SubagentRun[];\n /** Finished runs the reader cleared from the grid; they stay on disk and in the hub's feed. */\n dismissed: string[];\n /** Runs a stop was asked for and that have not yet reported a final state. */\n stopRequested: string[];\n /** The run whose detail sheet the subagents tab shows. */\n openRunId: string | undefined;\n /** A launch this page asked for, until a run of that agent it had not seen shows up. */\n pendingLaunch: { agent: string; knownRunIds: string[] } | undefined;\n /** The run a launch produced, for the tab to open once and forget. */\n autoOpenRunId: string | undefined;\n}\n\nexport const subagents = defineSessionStore<SubagentsSession>({\n runs: [],\n dismissed: [],\n stopRequested: [],\n openRunId: undefined,\n pendingLaunch: undefined,\n autoOpenRunId: undefined,\n});\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction without(list: readonly string[], runId: string): string[] {\n return list.filter((id) => id !== runId);\n}\n\n/** The full Subagents tab's runs minus the ones the reader dismissed. */\nexport function visibleRuns(session: SubagentsSession): SubagentRun[] {\n return session.dismissed.length === 0\n ? session.runs\n : session.runs.filter((run) => !session.dismissed.includes(run.runId));\n}\n\n/** Only runs that can still be doing work belong in the activity group. */\nexport function activityRuns(session: SubagentsSession): SubagentRun[] {\n return visibleRuns(session).filter((run) => run.state === 'queued' || run.state === 'running');\n}\n\n/**\n * Asks the session host to stop a run over the Team API, never as a parent\n * prompt: the web host does not know Team's slash commands and refuses\n * prompts mid-turn. Marked at once so the control reads \"stopping\"; rolled\n * back and rethrown if the host refuses. Once accepted, the request stands\n * until the run reports a final state.\n */\nexport async function requestRunStop(sessionId: string, runId: string): Promise<void> {\n subagents.update(sessionId, (current) => ({\n ...current,\n stopRequested: [...without(current.stopRequested, runId), runId],\n }));\n try {\n await stopRun(sessionId, runId);\n } catch (error) {\n subagents.update(sessionId, (current) => ({ ...current, stopRequested: without(current.stopRequested, runId) }));\n throw error;\n }\n}\n\n/** Hides a finished run from this page; nothing is deleted. */\nexport function dismissRun(sessionId: string, runId: string): void {\n subagents.update(sessionId, (current) => ({\n ...current,\n dismissed: [...without(current.dismissed, runId), runId],\n openRunId: current.openRunId === runId ? undefined : current.openRunId,\n }));\n}\n\n/** Remember the fleet before the server launch so its first update can open the new run. */\nexport function requestLaunch(sessionId: string, agent: string): void {\n subagents.update(sessionId, (current) => ({\n ...current,\n pendingLaunch: { agent, knownRunIds: current.runs.map((run) => run.runId) },\n }));\n}\n\nexport function clearPendingLaunch(sessionId: string): void {\n subagents.update(sessionId, (current) => ({ ...current, pendingLaunch: undefined }));\n}\n\nexport function clearAutoOpen(sessionId: string): void {\n subagents.update(sessionId, (current) => ({ ...current, autoOpenRunId: undefined }));\n}\n\nexport function openRun(sessionId: string, runId: string | undefined): void {\n subagents.update(sessionId, (current) => ({ ...current, openRunId: runId }));\n}\n\nexport interface SubagentRunsPayload {\n runs: SubagentRun[];\n}\n\n/** The plugin's session data channel: 'subagent_runs' payloads into the store. */\nexport const subagentRunsChannel = subagents.channel<SubagentRunsPayload>({\n channel: SUBAGENT_RUNS_TYPE,\n parse(input) {\n if (!isRecord(input) || !Array.isArray(input.runs)) return null;\n return { runs: input.runs.filter(isRecord) as unknown as SubagentRun[] };\n },\n reduce(current, { runs }) {\n const present = new Map(runs.map((run) => [run.runId, run]));\n // A stop request is spent once the run reports a final state or leaves\n // the feed; a dismissal is forgotten once the run is gone from the feed.\n const stopRequested = current.stopRequested.filter((runId) => {\n const run = present.get(runId);\n return run !== undefined && !isTerminalRun(run);\n });\n const dismissed = current.dismissed.filter((runId) => present.has(runId));\n // The run a launch asked for is the first of that agent the page had not seen.\n const arrived =\n current.pendingLaunch === undefined\n ? undefined\n : runs.find(\n (run) =>\n run.agent === current.pendingLaunch?.agent && !current.pendingLaunch.knownRunIds.includes(run.runId),\n );\n return {\n ...current,\n runs,\n stopRequested,\n dismissed,\n pendingLaunch: arrived === undefined ? current.pendingLaunch : undefined,\n autoOpenRunId: arrived === undefined ? current.autoOpenRunId : arrived.runId,\n };\n },\n});\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport {\n Badge,\n Button,\n Dot,\n Input,\n ListRow,\n SegmentedControl,\n Sheet,\n SheetBody,\n SheetContent,\n SheetHeader,\n SheetTitle,\n Textarea,\n} from '@agimon-ai/po-native-components';\nimport { useCallback, useEffect, useState, useSyncExternalStore } from 'react';\nimport { Text, View, ScrollView } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { SubagentCatalogAgent, SubagentRun } from '../../../../../types/webSubagents';\nimport { launchAgent, steerRun } from '../_lib/catalog.native';\nimport { catalog, closeCatalog, loadCatalog, openCatalog } from '../_lib/catalogStore.native';\nimport { agentRunLabel, formatRunDuration } from '../_lib/format';\nimport { agentMeta, filterCatalog, modelChoices } from '../_lib/launchCommand';\nimport {\n clearPendingLaunch,\n dismissRun,\n isTerminalRun,\n requestLaunch,\n requestRunStop,\n subagents,\n visibleRuns,\n} from '../_lib/subagentsStore.native';\n\nexport function useSubagents(sessionId: string | null) {\n const subscribe = useCallback((listener: () => void) => {\n const sub = subagents.store.subscribe(listener);\n return () => sub.unsubscribe();\n }, []);\n return useSyncExternalStore(subscribe, () => subagents.select(subagents.store.state, sessionId));\n}\n\nexport function subagentsTab(): Parameters<WebPluginSlotProps['openTransientTab']>[0] {\n return { id: 'subagents', label: 'agents', panel: SubagentsPanel };\n}\n\nexport function agentThreadTab(run: SubagentRun): Parameters<WebPluginSlotProps['openTransientTab']>[0] {\n const runId = run.runId;\n return {\n id: `subagents-run-${runId}`,\n label: agentRunLabel(run),\n panel: (props) => <AgentThreadPanel {...props} runId={runId} />,\n };\n}\n\nexport function AgentRunRow({ run, onPress }: { run: SubagentRun; onPress: () => void }) {\n const detail =\n run.error ??\n run.summary?.split('\\n').find((line) => line.trim() !== '') ??\n run.currentTool ??\n run.tail.at(-1) ??\n run.state;\n return (\n <ListRow\n leading={\n <Dot\n tone={\n run.state === 'failed'\n ? 'red'\n : run.state === 'running'\n ? 'yellow'\n : run.state === 'done'\n ? 'green'\n : 'muted'\n }\n />\n }\n title={\n <Button variant=\"ghost\" onPress={onPress} testID={`activity-run-${run.runId}`}>\n {agentRunLabel(run)}\n </Button>\n }\n description={detail}\n trailing={<Badge>{run.state}</Badge>}\n />\n );\n}\n\nexport function SubagentsPanel(props: WebPluginSlotProps) {\n const state = useSubagents(props.sessionId);\n return (\n <ScrollView contentContainerStyle={styles.body}>\n <Button\n testID=\"activity-agents-launch\"\n onPress={() => {\n if (props.sessionId !== null) openCatalog(props.sessionId);\n }}\n >\n Launch an agent\n </Button>\n {visibleRuns(state).map((run) => (\n <AgentRunRow key={run.runId} run={run} onPress={() => props.openTransientTab(agentThreadTab(run))} />\n ))}\n <AgentCatalog {...props} />\n </ScrollView>\n );\n}\n\nfunction AgentCatalog({ sessionId }: WebPluginSlotProps) {\n const subscribe = useCallback((listener: () => void) => {\n const sub = catalog.store.subscribe(listener);\n return () => sub.unsubscribe();\n }, []);\n const state = useSyncExternalStore(subscribe, () => catalog.select(catalog.store.state, sessionId));\n const [filter, setFilter] = useState('');\n const [agent, setAgent] = useState<SubagentCatalogAgent>();\n useEffect(() => {\n if (sessionId !== null && state.open) return loadCatalog(sessionId);\n return undefined;\n }, [sessionId, state.open]);\n if (sessionId === null || !state.open) return null;\n return (\n <Sheet\n open\n onOpenChange={(open) => {\n if (!open) {\n closeCatalog(sessionId);\n setAgent(undefined);\n }\n }}\n >\n <SheetContent>\n <SheetHeader>\n <SheetTitle>{agent ? `Launch ${agent.name}` : 'Launch an agent'}</SheetTitle>\n </SheetHeader>\n <SheetBody>\n {agent ? (\n <AgentLaunch\n key={agent.name}\n sessionId={sessionId}\n agent={agent}\n models={state.models}\n initialTask={state.task}\n onClose={() => {\n closeCatalog(sessionId);\n setAgent(undefined);\n }}\n />\n ) : (\n <View style={styles.body}>\n <Input\n accessibilityLabel=\"Filter agents\"\n placeholder=\"Find an agent\"\n value={filter}\n onChangeText={setFilter}\n />\n {state.loading ? <Text style={styles.meta}>Loading agents…</Text> : null}\n {state.warning ? <Text style={styles.error}>{state.warning}</Text> : null}\n {filterCatalog(state.agents, filter).map((item) => (\n <ListRow\n key={item.name}\n title={\n <Button variant=\"ghost\" onPress={() => setAgent(item)}>\n {item.name}\n </Button>\n }\n description={`${item.description}\\n${agentMeta(item)}`}\n />\n ))}\n </View>\n )}\n </SheetBody>\n </SheetContent>\n </Sheet>\n );\n}\n\nfunction AgentLaunch({\n sessionId,\n agent,\n models,\n initialTask,\n onClose,\n}: {\n sessionId: string;\n agent: SubagentCatalogAgent;\n models: string[];\n initialTask: string;\n onClose: () => void;\n}) {\n const [task, setTask] = useState(initialTask);\n const [fork, setFork] = useState(agent.defaultContext === 'fork');\n const [model, setModel] = useState('');\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string>();\n const launch = async () => {\n if (busy) return;\n setBusy(true);\n setError(undefined);\n requestLaunch(sessionId, agent.name);\n try {\n await launchAgent(sessionId, { agent: agent.name, task, fork, ...(model === '' ? {} : { model }) });\n onClose();\n } catch (cause) {\n clearPendingLaunch(sessionId);\n setError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setBusy(false);\n }\n };\n return (\n <View style={styles.body}>\n <Text style={styles.meta}>{agent.description}</Text>\n <Textarea\n accessibilityLabel=\"Task\"\n value={task}\n onChangeText={setTask}\n placeholder=\"What should the agent do? Empty runs its own prompt\"\n />\n <SegmentedControl\n value={fork ? 'fork' : 'fresh'}\n onValueChange={(value) => setFork(value === 'fork')}\n options={[\n { value: 'fresh', label: 'Fresh' },\n { value: 'fork', label: 'Fork this session' },\n ]}\n />\n <Text style={styles.meta}>Model</Text>\n <Button variant={model === '' ? 'primary' : 'outline'} onPress={() => setModel('')}>\n Agent default{agent.model ? ` · ${agent.model}` : ''}\n </Button>\n {modelChoices(agent, models).map((choice) => (\n <Button\n key={choice}\n variant=\"outline\"\n onPress={() => setModel(choice)}\n accessibilityState={{ selected: model === choice }}\n >\n {choice}\n </Button>\n ))}\n {error ? <Text style={styles.error}>{error}</Text> : null}\n <Button testID=\"launch-agent-submit\" disabled={busy} onPress={() => void launch()}>\n {busy ? 'Launching…' : 'Launch'}\n </Button>\n </View>\n );\n}\n\nexport function AgentThreadPanel({ sessionId, runId, renderThread }: WebPluginSlotProps & { runId: string }) {\n const state = useSubagents(sessionId);\n const run = state.runs.find((item) => item.runId === runId);\n const [guidance, setGuidance] = useState('');\n const [busy, setBusy] = useState(false);\n const [notice, setNotice] = useState<string>();\n const [confirmClear, setConfirmClear] = useState(false);\n const act = async (action: () => Promise<void>) => {\n setBusy(true);\n setNotice(undefined);\n try {\n await action();\n } catch (cause) {\n setNotice(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setBusy(false);\n }\n };\n return (\n <View style={styles.screen}>\n {run ? (\n <View style={styles.body}>\n <Text style={styles.title}>\n {agentRunLabel(run)} · {run.state}\n </Text>\n <Text style={styles.meta}>\n {run.model}\\n{run.task}\\n{formatRunDuration(Math.max(0, (run.endedAt ?? run.lastUpdate) - run.startedAt))}\n </Text>\n {sessionId !== null ? (\n isTerminalRun(run) ? (\n <Button variant=\"outline\" onPress={() => setConfirmClear(true)}>\n Clear run\n </Button>\n ) : (\n <Button\n variant=\"danger-outline\"\n disabled={busy || state.stopRequested.includes(runId)}\n onPress={() => void act(() => requestRunStop(sessionId, runId))}\n >\n {state.stopRequested.includes(runId) ? 'Stopping…' : 'Stop'}\n </Button>\n )\n ) : null}\n </View>\n ) : (\n <Text style={styles.meta}>This run is no longer listed; its transcript stays readable.</Text>\n )}\n <View style={styles.transcript}>{renderThread(runId)}</View>\n {run && sessionId !== null && !isTerminalRun(run) ? (\n <View style={styles.body}>\n <Textarea\n accessibilityLabel=\"Steering guidance\"\n value={guidance}\n onChangeText={setGuidance}\n placeholder=\"Guide this agent…\"\n />\n <Button\n disabled={busy || guidance.trim() === ''}\n onPress={() =>\n void act(async () => {\n const result = await steerRun(sessionId, runId, guidance.trim());\n setNotice(result.message);\n if (result.state !== 'failed') setGuidance('');\n })\n }\n >\n Send guidance\n </Button>\n </View>\n ) : null}\n {notice ? <Text style={styles.meta}>{notice}</Text> : null}\n <Sheet open={confirmClear} onOpenChange={setConfirmClear}>\n <SheetContent>\n <SheetHeader>\n <SheetTitle>Clear this run?</SheetTitle>\n </SheetHeader>\n <SheetBody>\n <Text style={styles.meta}>This hides the finished run. Its transcript stays on disk.</Text>\n <Button\n variant=\"danger-outline\"\n onPress={() => {\n if (sessionId !== null) dismissRun(sessionId, runId);\n setConfirmClear(false);\n }}\n >\n Clear\n </Button>\n </SheetBody>\n </SheetContent>\n </Sheet>\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n screen: { flex: 1, backgroundColor: theme.colors.bg },\n transcript: { flex: 1 },\n body: { padding: theme.spacing(3), gap: theme.spacing(2) },\n title: { color: theme.colors.hi, fontSize: theme.fontSize.base, fontWeight: '600' },\n meta: { color: theme.colors.dim, fontSize: theme.fontSize.sm },\n error: { color: theme.colors.red, fontSize: theme.fontSize.sm },\n}));\n","import { defineActivityGroup } from '@agimon-ai/po-core/native';\nimport { UsersIcon } from '@agimon-ai/po-native-components';\nimport { createElement } from 'react';\n\nimport { subagentsTab } from '../_components/SubagentsPanel.native';\nimport { activityRuns, subagents } from '../_lib/subagentsStore.native';\nexport default defineActivityGroup({\n keys: 'a r',\n icon: () => createElement(UsersIcon),\n statusKey: 'doom-team-agents',\n order: 10,\n transientTab: subagentsTab,\n activeSource: {\n subscribe(listener) {\n const subscription = subagents.store.subscribe(listener);\n return () => subscription.unsubscribe();\n },\n isActive(sessionId) {\n return activityRuns(subagents.select(subagents.store.state, sessionId)).length > 0;\n },\n },\n});\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { subagentCatalogChannel } from '../_lib/catalogStore.native';\nexport default defineChannelFile(subagentCatalogChannel);\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { subagentRunsChannel } from '../_lib/subagentsStore.native';\nexport default defineChannelFile(subagentRunsChannel);\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport { Button } from '@agimon-ai/po-native-components';\nimport { View } from 'react-native';\n\nimport { AgentRunRow, agentThreadTab, subagentsTab, useSubagents } from '../../_components/SubagentsPanel.native';\nimport { openCatalog } from '../../_lib/catalogStore.native';\nimport { activityRuns } from '../../_lib/subagentsStore.native';\n\nexport function AgentsActivitySection({ sessionId, openTransientTab }: WebPluginSlotProps) {\n const state = useSubagents(sessionId);\n const runs = activityRuns(state);\n return (\n <View>\n {runs.map((run) => (\n <AgentRunRow key={run.runId} run={run} onPress={() => openTransientTab(agentThreadTab(run))} />\n ))}\n {runs.length === 0 ? (\n <Button\n variant=\"ghost\"\n testID=\"activity-agents-launch\"\n disabled={sessionId === null}\n onPress={() => {\n if (sessionId !== null) {\n openCatalog(sessionId);\n openTransientTab(subagentsTab());\n }\n }}\n >\n Launch an agent\n </Button>\n ) : null}\n </View>\n );\n}\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { AgentsActivitySection } from './_components/AgentsActivitySection.native';\nexport default defineFill({ component: AgentsActivitySection });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport activityGroupAgents from '../src/extensions/workspaces/sessions/(frontend)/activity-group/agents.native';\nimport channelSubagentCatalog from '../src/extensions/workspaces/sessions/(frontend)/channel/subagent-catalog.native';\nimport channelSubagentRuns from '../src/extensions/workspaces/sessions/(frontend)/channel/subagent-runs.native';\nimport fillAgents from '../src/extensions/workspaces/sessions/(frontend)/fill/Agents.activity.agents.native';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const nativePlugin = defineNativePlugin({\n id: 'subagents',\n session: {\n get activityGroups(): WebPluginContributions['activityGroups'] { return [via({ name: 'agents' }, activityGroupAgents)]; },\n get channels(): WebPluginContributions['channels'] { return [via({ channel: 'subagent_catalog' }, channelSubagentCatalog), via({ channel: 'subagent_runs' }, channelSubagentRuns)]; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'activity.agents', id: 'agents' }, fillAgents)]; },\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"native.mjs","names":["isRecord","isRecord","WebPluginSlotProps","Badge","Button","Dot","Input","ListRow","SegmentedControl","Sheet","SheetBody","SheetContent","SheetHeader","SheetTitle","Textarea","useCallback","useEffect","useState","useSyncExternalStore","StyleSheet","SubagentCatalogAgent","SubagentRun","launchAgent","steerRun","catalog","closeCatalog","loadCatalog","openCatalog","agentRunLabel","formatRunDuration","agentMeta","filterCatalog","modelChoices","clearPendingLaunch","dismissRun","isTerminalRun","requestLaunch","requestRunStop","subagents","visibleRuns","useSubagents","sessionId","subscribe","listener","sub","store","unsubscribe","select","state","subagentsTab","Parameters","id","label","panel","SubagentsPanel","agentThreadTab","run","runId","props","AgentRunRow","onPress","detail","error","summary","split","find","line","trim","currentTool","tail","at","styles","body","map","openTransientTab","AgentCatalog","filter","setFilter","agent","setAgent","open","undefined","name","models","task","loading","meta","warning","agents","item","description","AgentLaunch","initialTask","onClose","setTask","fork","setFork","defaultContext","model","setModel","busy","setBusy","setError","launch","cause","Error","message","String","value","choice","selected","AgentThreadPanel","renderThread","runs","guidance","setGuidance","notice","setNotice","confirmClear","setConfirmClear","act","action","Promise","screen","title","Math","max","endedAt","lastUpdate","startedAt","stopRequested","includes","transcript","result","create","theme","flex","backgroundColor","colors","bg","uni__dependencies","padding","spacing","gap","color","hi","fontSize","base","fontWeight","dim","sm","red","WebPluginSlotProps","Button","AgentRunRow","agentThreadTab","subagentsTab","useSubagents","openCatalog","activityRuns","AgentsActivitySection","sessionId","openTransientTab","state","runs","map","run","runId","length","fillTeam","activityGroupAgents","channelSubagentCatalog","channelSubagentRuns","fillAgents"],"sources":["../../src/extensions/workspaces/(frontend)/fill/Team.home.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/catalog.native.ts","../../src/types/webSubagents.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/catalogStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/format.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/launchCommand.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/subagentsStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/SubagentsPanel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/activity-group/agents.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/subagent-catalog.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/subagent-runs.native.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/AgentsActivitySection.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/Agents.activity.agents.native.tsx","../../generated/native.ts"],"sourcesContent":["import { defineFill } from '@agimon-ai/po-core/native';\n\nexport default defineFill({ data: { version: 1, label: 'Team', source: 'subagent_runs', destination: 'agents' } });\n","import { createApiClient, defineApiRoutes, nativeApiTransport, sessionApiAddress } from '@agimon-ai/po-core/native';\n\nimport type {\n SubagentCatalogAgent,\n SubagentCatalogPayload,\n SubagentSteerResult,\n} from '../../../../../types/webSubagents';\nimport type { LaunchRequest } from './launchCommand';\n\nconst routes = defineApiRoutes({\n catalog: { method: 'GET', path: '/catalog' },\n run: { method: 'POST', path: '/run' },\n steer: { method: 'POST', path: '/steer' },\n stop: { method: 'POST', path: '/stop' },\n});\nconst api = createApiClient(routes, {\n scopes: ['session'],\n basePath: 'team',\n transport: nativeApiTransport,\n sessionAddress: sessionApiAddress,\n});\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isStrings(value: unknown): value is string[] {\n return Array.isArray(value) && value.every((item) => typeof item === 'string');\n}\n\nfunction isAgent(value: unknown): value is SubagentCatalogAgent {\n return (\n isRecord(value) &&\n typeof value.name === 'string' &&\n typeof value.description === 'string' &&\n typeof value.filePath === 'string' &&\n ['project', 'user', 'plugin'].includes(String(value.source)) &&\n (value.packageName === undefined || typeof value.packageName === 'string') &&\n (value.model === undefined || typeof value.model === 'string') &&\n isStrings(value.fallbackModels) &&\n isStrings(value.tools) &&\n isStrings(value.skills) &&\n isStrings(value.extensions) &&\n (value.defaultContext === 'fresh' || value.defaultContext === 'fork')\n );\n}\n\n/** Read the selected session's catalog through the host's authenticated HTTP transport. */\nexport async function fetchCatalog(sessionId: string, signal: AbortSignal): Promise<SubagentCatalogPayload> {\n const response = await api.session(sessionId).catalog({\n signal,\n });\n const body: unknown = response.data;\n if (!response.ok) {\n throw new Error(\n isRecord(body) && typeof body.error === 'string'\n ? body.error\n : `Agent catalog could not be loaded (${response.status}).`,\n );\n }\n if (\n !isRecord(body) ||\n typeof body.cwd !== 'string' ||\n !Array.isArray(body.agents) ||\n !body.agents.every(isAgent) ||\n !isStrings(body.models)\n ) {\n throw new Error('The server returned an invalid agent catalog.');\n }\n return { cwd: body.cwd, agents: body.agents, models: body.models };\n}\n\n/** Launch on the selected session host, without submitting a parent prompt. */\nexport async function launchAgent(sessionId: string, request: LaunchRequest): Promise<string> {\n const response = await api.session(sessionId).run({\n body: request,\n });\n const body: unknown = response.data;\n if (!response.ok) {\n throw new Error(\n isRecord(body) && typeof body.error === 'string'\n ? body.error\n : `Agent could not be launched (${response.status}).`,\n );\n }\n if (!isRecord(body) || typeof body.runId !== 'string' || body.runId === '')\n throw new Error('The server returned an invalid run ID.');\n return body.runId;\n}\n\nfunction isSteerState(value: unknown): value is SubagentSteerResult['state'] {\n return value === 'delivered' || value === 'failed' || value === 'pending';\n}\n\n/** Steer one run on the selected session host, without submitting a parent prompt. */\nexport async function steerRun(sessionId: string, runId: string, message: string): Promise<SubagentSteerResult> {\n const response = await api.session(sessionId).steer({\n body: { runId, message },\n });\n const body: unknown = response.data;\n if (!response.ok) {\n throw new Error(\n isRecord(body) && typeof body.error === 'string'\n ? body.error\n : `Guidance could not be sent (${response.status}).`,\n );\n }\n if (!isRecord(body) || !isSteerState(body.state) || typeof body.message !== 'string')\n throw new Error('The server returned an invalid steer result.');\n return { state: body.state, message: body.message };\n}\n\n/** Ask the selected session host to stop one run; the run's own status reports when it has. */\nexport async function stopRun(sessionId: string, runId: string): Promise<void> {\n const response = await api.session(sessionId).stop({\n body: { runId },\n });\n const body: unknown = response.data;\n if (!response.ok) {\n throw new Error(\n isRecord(body) && typeof body.error === 'string'\n ? body.error\n : `The run could not be stopped (${response.status}).`,\n );\n }\n}\n","/**\n * Subagent run view types shared by this package's hub channel and its web\n * plugin. The shapes mirror the per-run status files this package's own\n * runtime writes; the cockpit renders them as 'subagent_runs' channel\n * payloads.\n */\n\n/** Coarse run state the cockpit renders; rawState keeps doom-team's exact word. */\nexport type SubagentRunState = 'queued' | 'running' | 'done' | 'failed' | 'stopped';\n\n/**\n * One subagent run of a session, read from doom-team's per-run status file.\n */\nexport interface SubagentRun {\n runId: string;\n agent: string;\n /**\n * Generated addressable identity, for example `alan-reviewer-3`.\n *\n * Additive and optional: a run projected before identities existed, and any\n * run whose claim could not be written, still arrives without one.\n */\n identity?: string;\n /** True when this run came from a one-shot inline agent definition. */\n inline?: boolean;\n state: SubagentRunState;\n rawState: string;\n /** The delegation prompt the main agent gave this run. */\n task: string;\n /** A doom-task binding, when the delegation named one; wins over task in the card. */\n taskRef?: string;\n model?: string;\n cwd: string;\n /** The child transcript path, when the session host exposes one. */\n sessionFile?: string;\n /** Epoch milliseconds, as doom-team writes them. */\n startedAt: number;\n endedAt?: number;\n lastUpdate: number;\n /** Live one-liner of what the run is doing right now. */\n currentTool?: string;\n toolCount?: number;\n tokens?: number;\n cost?: number;\n /** Final report, present once the run finished. */\n summary?: string;\n /** Failure reason, present when the run failed. */\n error?: string;\n /** Recent output lines, oldest first, capped. */\n tail: string[];\n}\n\nexport const SUBAGENT_RUNS_TYPE = 'subagent_runs';\n\n/** How the runtime answered one steer: delivered, refused by the run, or not yet acknowledged. */\nexport interface SubagentSteerResult {\n state: 'delivered' | 'failed' | 'pending';\n message: string;\n}\n/** Where an agent definition came from; the catalog groups by it, nearest first. */\nexport type SubagentCatalogSource = 'project' | 'user' | 'plugin';\n\n/** One launchable agent, as the catalog lists it. */\nexport interface SubagentCatalogAgent {\n name: string;\n source: SubagentCatalogSource;\n /** The package that staged a plugin agent. */\n packageName?: string;\n description: string;\n /** The model the definition pins; absent means the runtime's default. */\n model?: string;\n fallbackModels: string[];\n /** Empty means the definition does not narrow the tool set. */\n tools: string[];\n skills: string[];\n extensions: string[];\n defaultContext: 'fresh' | 'fork';\n filePath: string;\n}\n\n/** The 'subagent_catalog' channel payload: the agents a session's directory can launch. */\nexport interface SubagentCatalogPayload {\n cwd: string;\n agents: SubagentCatalogAgent[];\n /** Model specs the active team package offers, for the launch dialog's picker. */\n models: string[];\n /** Why the list may be incomplete, when discovery failed. */\n warning?: string;\n}\n\nexport const SUBAGENT_CATALOG_TYPE = 'subagent_catalog';\n","import { defineSessionStore } from '@agimon-ai/po-core/native';\n\nimport {\n SUBAGENT_CATALOG_TYPE,\n type SubagentCatalogAgent,\n type SubagentCatalogPayload,\n} from '../../../../../types/webSubagents';\nimport { fetchCatalog } from './catalog.native';\n\n/** One session's catalog: what the hub last reported plus what the drawer is doing with it. */\nexport interface CatalogSession {\n cwd: string;\n agents: SubagentCatalogAgent[];\n models: string[];\n warning: string | undefined;\n loading: boolean;\n requestId: number;\n /** True while the catalog drawer is shown in the subagents tab. */\n open: boolean;\n filter: string;\n /** Task text carried from the surface that opened the catalog. */\n task: string;\n /** The highlighted row, by agent name. */\n selected: string | undefined;\n /** The row whose resources are unfolded. */\n inspected: string | undefined;\n /** The agent the launch dialog is open for, and the context it opened with. */\n launch: { agent: string; fork: boolean } | undefined;\n}\n\nexport const catalog = defineSessionStore<CatalogSession>({\n cwd: '',\n agents: [],\n models: [],\n warning: undefined,\n loading: false,\n requestId: 0,\n open: false,\n filter: '',\n task: '',\n selected: undefined,\n inspected: undefined,\n launch: undefined,\n});\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function openCatalog(sessionId: string, task = ''): void {\n catalog.update(sessionId, (current) => ({ ...current, open: true, task }));\n}\n\nexport function closeCatalog(sessionId: string): void {\n catalog.update(sessionId, (current) => ({ ...current, open: false, task: '', launch: undefined }));\n}\n\nexport function setCatalogFilter(sessionId: string, filter: string): void {\n catalog.update(sessionId, (current) => ({ ...current, filter }));\n}\n\nexport function selectAgent(sessionId: string, name: string | undefined): void {\n catalog.update(sessionId, (current) => ({ ...current, selected: name }));\n}\n\nexport function toggleInspect(sessionId: string, name: string): void {\n catalog.update(sessionId, (current) => ({ ...current, inspected: current.inspected === name ? undefined : name }));\n}\n\nexport function openLaunch(sessionId: string, agent: string, fork: boolean): void {\n catalog.update(sessionId, (current) => ({ ...current, selected: agent, launch: { agent, fork } }));\n}\n\nexport function closeLaunch(sessionId: string): void {\n catalog.update(sessionId, (current) => ({ ...current, launch: undefined }));\n}\n\n/** Each drawer opening owns one request and cancels it when the drawer leaves. */\nexport function loadCatalog(sessionId: string): () => void {\n const controller = new AbortController();\n const requestId = catalog.select(catalog.store.state, sessionId).requestId + 1;\n catalog.update(sessionId, (current) => ({ ...current, requestId, loading: true, warning: undefined }));\n const isCurrent = (): boolean =>\n !controller.signal.aborted && catalog.store.state[sessionId]?.requestId === requestId;\n void fetchCatalog(sessionId, controller.signal)\n .then((payload) => {\n if (isCurrent()) subagentCatalogChannel.apply(sessionId, payload);\n })\n .catch((error: unknown) => {\n if (isCurrent())\n catalog.update(sessionId, (current) => ({\n ...current,\n warning: error instanceof Error ? error.message : String(error),\n }));\n })\n .finally(() => {\n if (isCurrent()) catalog.update(sessionId, (current) => ({ ...current, loading: false }));\n });\n return () => {\n if (isCurrent()) catalog.update(sessionId, (current) => ({ ...current, loading: false }));\n controller.abort();\n };\n}\n\n/** The plugin's catalog channel: 'subagent_catalog' payloads into the store; the drawer's own state survives a refresh. */\nexport const subagentCatalogChannel = catalog.channel<SubagentCatalogPayload>({\n channel: SUBAGENT_CATALOG_TYPE,\n parse(input) {\n if (!isRecord(input) || typeof input.cwd !== 'string' || !Array.isArray(input.agents)) return null;\n const models = Array.isArray(input.models) ? input.models.filter((m): m is string => typeof m === 'string') : [];\n return {\n cwd: input.cwd,\n agents: input.agents.filter(isRecord) as unknown as SubagentCatalogAgent[],\n models,\n ...(typeof input.warning === 'string' ? { warning: input.warning } : {}),\n };\n },\n reduce(current, payload) {\n const names = new Set(payload.agents.map((agent) => agent.name));\n return {\n ...current,\n cwd: payload.cwd,\n agents: payload.agents,\n models: payload.models,\n warning: payload.warning,\n selected: current.selected !== undefined && names.has(current.selected) ? current.selected : undefined,\n inspected: current.inspected !== undefined && names.has(current.inspected) ? current.inspected : undefined,\n launch: current.launch !== undefined && names.has(current.launch.agent) ? current.launch : undefined,\n };\n },\n});\n","/**\n * Local copies of the host cockpit's pure formatters\n * (po-web src/web/lib/sessionSummary.ts): this plugin ships zero host\n * imports so the cockpit's bundler can compile it from any install.\n */\nconst MINUTE_MS = 60 * 1000;\nconst HOUR_MS = 60 * MINUTE_MS;\n\nexport function formatRunDuration(elapsedMs: number): string {\n if (elapsedMs < MINUTE_MS) return '<1m';\n if (elapsedMs < HOUR_MS) return `${Math.floor(elapsedMs / MINUTE_MS)}m`;\n const hours = Math.floor(elapsedMs / HOUR_MS);\n const minutes = Math.floor((elapsedMs % HOUR_MS) / MINUTE_MS);\n return `${hours}h ${String(minutes).padStart(2, '0')}m`;\n}\n\nexport function abbreviateCwd(cwd: string): string {\n const match = /^\\/(?:Users|home)\\/[^/]+/u.exec(cwd);\n if (!match) return cwd;\n return `~${cwd.slice(match[0].length)}`;\n}\n\n/**\n * What to call a run on screen.\n *\n * Prefers the generated identity, because a fan-out of one agent otherwise\n * renders as N rows reading the same word. Falls back to the agent name for a\n * run projected before identities existed. Duplicated rather than imported\n * from `services/agentIdentity`, which reaches for `node:fs` and so cannot be\n * pulled into the browser bundle; that module owns minting, this owns display.\n */\nexport function agentRunLabel(run: { agent: string; identity?: string; inline?: boolean }): string {\n const base = run.identity ?? run.agent;\n return run.inline ? `${base} (inline)` : base;\n}\n","import type { SubagentCatalogAgent, SubagentCatalogSource } from '../../../../../types/webSubagents';\n\nconst META_TOOL_LIMIT = 3;\n\nexport interface LaunchRequest {\n agent: string;\n task: string;\n /** A pinned model overrides the agent's default; absent keeps the agent's own. */\n model?: string;\n fork: boolean;\n}\n\n/** Rows whose name, source, package, description or a tool contains the filter, case-insensitively. */\nexport function filterCatalog(agents: readonly SubagentCatalogAgent[], filter: string): SubagentCatalogAgent[] {\n const needle = filter.trim().toLowerCase();\n if (needle === '') return [...agents];\n return agents.filter((agent) =>\n [agent.name, agent.source, agent.packageName ?? '', agent.description, ...agent.tools].some((field) =>\n field.toLowerCase().includes(needle),\n ),\n );\n}\n\nexport interface CatalogSection {\n source: SubagentCatalogSource;\n label: string;\n agents: SubagentCatalogAgent[];\n}\n\nconst SECTION_LABEL: Readonly<Record<SubagentCatalogSource, string>> = {\n project: 'PROJECT',\n user: 'USER',\n plugin: 'PACKAGES',\n};\n\n/** The catalog's sections, nearest source first, keeping the payload's order inside each; empty ones are left out. */\nexport function groupCatalog(agents: readonly SubagentCatalogAgent[]): CatalogSection[] {\n const sections: CatalogSection[] = [];\n for (const source of ['project', 'user', 'plugin'] as const) {\n const members = agents.filter((agent) => agent.source === source);\n if (members.length > 0) sections.push({ source, label: SECTION_LABEL[source], agents: members });\n }\n return sections;\n}\n\n/** What the picker offers: the agent's own model and fallbacks first, then the team's, without repeats. */\nexport function modelChoices(agent: SubagentCatalogAgent, models: readonly string[]): string[] {\n const seen = new Set<string>();\n const choices: string[] = [];\n for (const model of [agent.model ?? '', ...agent.fallbackModels, ...models]) {\n if (model === '' || seen.has(model)) continue;\n seen.add(model);\n choices.push(model);\n }\n return choices;\n}\n\n/** The row's one-liner: what tools it may use, how many skills, and how it starts. */\nexport function agentMeta(agent: SubagentCatalogAgent): string {\n const tools =\n agent.tools.length === 0\n ? 'all tools'\n : `tools ${agent.tools.slice(0, META_TOOL_LIMIT).join(', ')}${\n agent.tools.length > META_TOOL_LIMIT ? ` +${agent.tools.length - META_TOOL_LIMIT}` : ''\n }`;\n const skills =\n agent.skills.length > 0 ? ` · ${agent.skills.length} skill${agent.skills.length === 1 ? '' : 's'}` : '';\n return `${tools}${skills} · ${agent.defaultContext === 'fork' ? 'forks the session' : 'fresh context'}`;\n}\n","import { defineSessionStore } from '@agimon-ai/po-core/native';\n\nimport { SUBAGENT_RUNS_TYPE, type SubagentRun } from '../../../../../types/webSubagents';\nimport { stopRun } from './catalog.native';\nconst TERMINAL_STATES: ReadonlySet<SubagentRun['state']> = new Set(['done', 'failed', 'stopped']);\n\nexport function isTerminalRun(run: SubagentRun): boolean {\n return TERMINAL_STATES.has(run.state);\n}\n\n/** One session's record: the fleet the hub last reported plus what this page did with it. */\nexport interface SubagentsSession {\n /** The fleet the hub last reported; presented order preserved. */\n runs: SubagentRun[];\n /** Finished runs the reader cleared from the grid; they stay on disk and in the hub's feed. */\n dismissed: string[];\n /** Runs a stop was asked for and that have not yet reported a final state. */\n stopRequested: string[];\n /** The run whose detail sheet the subagents tab shows. */\n openRunId: string | undefined;\n /** A launch this page asked for, until a run of that agent it had not seen shows up. */\n pendingLaunch: { agent: string; knownRunIds: string[] } | undefined;\n /** The run a launch produced, for the tab to open once and forget. */\n autoOpenRunId: string | undefined;\n}\n\nexport const subagents = defineSessionStore<SubagentsSession>({\n runs: [],\n dismissed: [],\n stopRequested: [],\n openRunId: undefined,\n pendingLaunch: undefined,\n autoOpenRunId: undefined,\n});\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction without(list: readonly string[], runId: string): string[] {\n return list.filter((id) => id !== runId);\n}\n\n/** The full Subagents tab's runs minus the ones the reader dismissed. */\nexport function visibleRuns(session: SubagentsSession): SubagentRun[] {\n return session.dismissed.length === 0\n ? session.runs\n : session.runs.filter((run) => !session.dismissed.includes(run.runId));\n}\n\n/** Only runs that can still be doing work belong in the activity group. */\nexport function activityRuns(session: SubagentsSession): SubagentRun[] {\n return visibleRuns(session).filter((run) => run.state === 'queued' || run.state === 'running');\n}\n\n/**\n * Asks the session host to stop a run over the Team API, never as a parent\n * prompt: the web host does not know Team's slash commands and refuses\n * prompts mid-turn. Marked at once so the control reads \"stopping\"; rolled\n * back and rethrown if the host refuses. Once accepted, the request stands\n * until the run reports a final state.\n */\nexport async function requestRunStop(sessionId: string, runId: string): Promise<void> {\n subagents.update(sessionId, (current) => ({\n ...current,\n stopRequested: [...without(current.stopRequested, runId), runId],\n }));\n try {\n await stopRun(sessionId, runId);\n } catch (error) {\n subagents.update(sessionId, (current) => ({ ...current, stopRequested: without(current.stopRequested, runId) }));\n throw error;\n }\n}\n\n/** Hides a finished run from this page; nothing is deleted. */\nexport function dismissRun(sessionId: string, runId: string): void {\n subagents.update(sessionId, (current) => ({\n ...current,\n dismissed: [...without(current.dismissed, runId), runId],\n openRunId: current.openRunId === runId ? undefined : current.openRunId,\n }));\n}\n\n/** Remember the fleet before the server launch so its first update can open the new run. */\nexport function requestLaunch(sessionId: string, agent: string): void {\n subagents.update(sessionId, (current) => ({\n ...current,\n pendingLaunch: { agent, knownRunIds: current.runs.map((run) => run.runId) },\n }));\n}\n\nexport function clearPendingLaunch(sessionId: string): void {\n subagents.update(sessionId, (current) => ({ ...current, pendingLaunch: undefined }));\n}\n\nexport function clearAutoOpen(sessionId: string): void {\n subagents.update(sessionId, (current) => ({ ...current, autoOpenRunId: undefined }));\n}\n\nexport function openRun(sessionId: string, runId: string | undefined): void {\n subagents.update(sessionId, (current) => ({ ...current, openRunId: runId }));\n}\n\nexport interface SubagentRunsPayload {\n runs: SubagentRun[];\n}\n\n/** The plugin's session data channel: 'subagent_runs' payloads into the store. */\nexport const subagentRunsChannel = subagents.channel<SubagentRunsPayload>({\n channel: SUBAGENT_RUNS_TYPE,\n parse(input) {\n if (!isRecord(input) || !Array.isArray(input.runs)) return null;\n return { runs: input.runs.filter(isRecord) as unknown as SubagentRun[] };\n },\n reduce(current, { runs }) {\n const present = new Map(runs.map((run) => [run.runId, run]));\n // A stop request is spent once the run reports a final state or leaves\n // the feed; a dismissal is forgotten once the run is gone from the feed.\n const stopRequested = current.stopRequested.filter((runId) => {\n const run = present.get(runId);\n return run !== undefined && !isTerminalRun(run);\n });\n const dismissed = current.dismissed.filter((runId) => present.has(runId));\n // The run a launch asked for is the first of that agent the page had not seen.\n const arrived =\n current.pendingLaunch === undefined\n ? undefined\n : runs.find(\n (run) =>\n run.agent === current.pendingLaunch?.agent && !current.pendingLaunch.knownRunIds.includes(run.runId),\n );\n return {\n ...current,\n runs,\n stopRequested,\n dismissed,\n pendingLaunch: arrived === undefined ? current.pendingLaunch : undefined,\n autoOpenRunId: arrived === undefined ? current.autoOpenRunId : arrived.runId,\n };\n },\n});\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport {\n Badge,\n Button,\n Dot,\n Input,\n ListRow,\n SegmentedControl,\n Sheet,\n SheetBody,\n SheetContent,\n SheetHeader,\n SheetTitle,\n Textarea,\n} from '@agimon-ai/po-native-components';\nimport { useCallback, useEffect, useState, useSyncExternalStore } from 'react';\nimport { Text, View, ScrollView } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { SubagentCatalogAgent, SubagentRun } from '../../../../../types/webSubagents';\nimport { launchAgent, steerRun } from '../_lib/catalog.native';\nimport { catalog, closeCatalog, loadCatalog, openCatalog } from '../_lib/catalogStore.native';\nimport { agentRunLabel, formatRunDuration } from '../_lib/format';\nimport { agentMeta, filterCatalog, modelChoices } from '../_lib/launchCommand';\nimport {\n clearPendingLaunch,\n dismissRun,\n isTerminalRun,\n requestLaunch,\n requestRunStop,\n subagents,\n visibleRuns,\n} from '../_lib/subagentsStore.native';\n\nexport function useSubagents(sessionId: string | null) {\n const subscribe = useCallback((listener: () => void) => {\n const sub = subagents.store.subscribe(listener);\n return () => sub.unsubscribe();\n }, []);\n return useSyncExternalStore(subscribe, () => subagents.select(subagents.store.state, sessionId));\n}\n\nexport function subagentsTab(): Parameters<WebPluginSlotProps['openTransientTab']>[0] {\n return { id: 'subagents', label: 'agents', panel: SubagentsPanel };\n}\n\nexport function agentThreadTab(run: SubagentRun): Parameters<WebPluginSlotProps['openTransientTab']>[0] {\n const runId = run.runId;\n return {\n id: `subagents-run-${runId}`,\n label: agentRunLabel(run),\n panel: (props) => <AgentThreadPanel {...props} runId={runId} />,\n };\n}\n\nexport function AgentRunRow({ run, onPress }: { run: SubagentRun; onPress: () => void }) {\n const detail =\n run.error ??\n run.summary?.split('\\n').find((line) => line.trim() !== '') ??\n run.currentTool ??\n run.tail.at(-1) ??\n run.state;\n return (\n <ListRow\n leading={\n <Dot\n tone={\n run.state === 'failed'\n ? 'red'\n : run.state === 'running'\n ? 'yellow'\n : run.state === 'done'\n ? 'green'\n : 'muted'\n }\n />\n }\n title={\n <Button variant=\"ghost\" onPress={onPress} testID={`activity-run-${run.runId}`}>\n {agentRunLabel(run)}\n </Button>\n }\n description={detail}\n trailing={<Badge>{run.state}</Badge>}\n />\n );\n}\n\nexport function SubagentsPanel(props: WebPluginSlotProps) {\n const state = useSubagents(props.sessionId);\n return (\n <ScrollView contentContainerStyle={styles.body}>\n <Button\n testID=\"activity-agents-launch\"\n onPress={() => {\n if (props.sessionId !== null) openCatalog(props.sessionId);\n }}\n >\n Launch an agent\n </Button>\n {visibleRuns(state).map((run) => (\n <AgentRunRow key={run.runId} run={run} onPress={() => props.openTransientTab(agentThreadTab(run))} />\n ))}\n <AgentCatalog {...props} />\n </ScrollView>\n );\n}\n\nfunction AgentCatalog({ sessionId }: WebPluginSlotProps) {\n const subscribe = useCallback((listener: () => void) => {\n const sub = catalog.store.subscribe(listener);\n return () => sub.unsubscribe();\n }, []);\n const state = useSyncExternalStore(subscribe, () => catalog.select(catalog.store.state, sessionId));\n const [filter, setFilter] = useState('');\n const [agent, setAgent] = useState<SubagentCatalogAgent>();\n useEffect(() => {\n if (sessionId !== null && state.open) return loadCatalog(sessionId);\n return undefined;\n }, [sessionId, state.open]);\n if (sessionId === null || !state.open) return null;\n return (\n <Sheet\n open\n onOpenChange={(open) => {\n if (!open) {\n closeCatalog(sessionId);\n setAgent(undefined);\n }\n }}\n >\n <SheetContent>\n <SheetHeader>\n <SheetTitle>{agent ? `Launch ${agent.name}` : 'Launch an agent'}</SheetTitle>\n </SheetHeader>\n <SheetBody>\n {agent ? (\n <AgentLaunch\n key={agent.name}\n sessionId={sessionId}\n agent={agent}\n models={state.models}\n initialTask={state.task}\n onClose={() => {\n closeCatalog(sessionId);\n setAgent(undefined);\n }}\n />\n ) : (\n <View style={styles.body}>\n <Input\n accessibilityLabel=\"Filter agents\"\n placeholder=\"Find an agent\"\n value={filter}\n onChangeText={setFilter}\n />\n {state.loading ? <Text style={styles.meta}>Loading agents…</Text> : null}\n {state.warning ? <Text style={styles.error}>{state.warning}</Text> : null}\n {filterCatalog(state.agents, filter).map((item) => (\n <ListRow\n key={item.name}\n title={\n <Button variant=\"ghost\" onPress={() => setAgent(item)}>\n {item.name}\n </Button>\n }\n description={`${item.description}\\n${agentMeta(item)}`}\n />\n ))}\n </View>\n )}\n </SheetBody>\n </SheetContent>\n </Sheet>\n );\n}\n\nfunction AgentLaunch({\n sessionId,\n agent,\n models,\n initialTask,\n onClose,\n}: {\n sessionId: string;\n agent: SubagentCatalogAgent;\n models: string[];\n initialTask: string;\n onClose: () => void;\n}) {\n const [task, setTask] = useState(initialTask);\n const [fork, setFork] = useState(agent.defaultContext === 'fork');\n const [model, setModel] = useState('');\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string>();\n const launch = async () => {\n if (busy) return;\n setBusy(true);\n setError(undefined);\n requestLaunch(sessionId, agent.name);\n try {\n await launchAgent(sessionId, { agent: agent.name, task, fork, ...(model === '' ? {} : { model }) });\n onClose();\n } catch (cause) {\n clearPendingLaunch(sessionId);\n setError(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setBusy(false);\n }\n };\n return (\n <View style={styles.body}>\n <Text style={styles.meta}>{agent.description}</Text>\n <Textarea\n accessibilityLabel=\"Task\"\n value={task}\n onChangeText={setTask}\n placeholder=\"What should the agent do? Empty runs its own prompt\"\n />\n <SegmentedControl\n value={fork ? 'fork' : 'fresh'}\n onValueChange={(value) => setFork(value === 'fork')}\n options={[\n { value: 'fresh', label: 'Fresh' },\n { value: 'fork', label: 'Fork this session' },\n ]}\n />\n <Text style={styles.meta}>Model</Text>\n <Button variant={model === '' ? 'primary' : 'outline'} onPress={() => setModel('')}>\n Agent default{agent.model ? ` · ${agent.model}` : ''}\n </Button>\n {modelChoices(agent, models).map((choice) => (\n <Button\n key={choice}\n variant=\"outline\"\n onPress={() => setModel(choice)}\n accessibilityState={{ selected: model === choice }}\n >\n {choice}\n </Button>\n ))}\n {error ? <Text style={styles.error}>{error}</Text> : null}\n <Button testID=\"launch-agent-submit\" disabled={busy} onPress={() => void launch()}>\n {busy ? 'Launching…' : 'Launch'}\n </Button>\n </View>\n );\n}\n\nexport function AgentThreadPanel({ sessionId, runId, renderThread }: WebPluginSlotProps & { runId: string }) {\n const state = useSubagents(sessionId);\n const run = state.runs.find((item) => item.runId === runId);\n const [guidance, setGuidance] = useState('');\n const [busy, setBusy] = useState(false);\n const [notice, setNotice] = useState<string>();\n const [confirmClear, setConfirmClear] = useState(false);\n const act = async (action: () => Promise<void>) => {\n setBusy(true);\n setNotice(undefined);\n try {\n await action();\n } catch (cause) {\n setNotice(cause instanceof Error ? cause.message : String(cause));\n } finally {\n setBusy(false);\n }\n };\n return (\n <View style={styles.screen}>\n {run ? (\n <View style={styles.body}>\n <Text style={styles.title}>\n {agentRunLabel(run)} · {run.state}\n </Text>\n <Text style={styles.meta}>\n {run.model}\\n{run.task}\\n{formatRunDuration(Math.max(0, (run.endedAt ?? run.lastUpdate) - run.startedAt))}\n </Text>\n {sessionId !== null ? (\n isTerminalRun(run) ? (\n <Button variant=\"outline\" onPress={() => setConfirmClear(true)}>\n Clear run\n </Button>\n ) : (\n <Button\n variant=\"danger-outline\"\n disabled={busy || state.stopRequested.includes(runId)}\n onPress={() => void act(() => requestRunStop(sessionId, runId))}\n >\n {state.stopRequested.includes(runId) ? 'Stopping…' : 'Stop'}\n </Button>\n )\n ) : null}\n </View>\n ) : (\n <Text style={styles.meta}>This run is no longer listed; its transcript stays readable.</Text>\n )}\n <View style={styles.transcript}>{renderThread(runId)}</View>\n {run && sessionId !== null && !isTerminalRun(run) ? (\n <View style={styles.body}>\n <Textarea\n accessibilityLabel=\"Steering guidance\"\n value={guidance}\n onChangeText={setGuidance}\n placeholder=\"Guide this agent…\"\n />\n <Button\n disabled={busy || guidance.trim() === ''}\n onPress={() =>\n void act(async () => {\n const result = await steerRun(sessionId, runId, guidance.trim());\n setNotice(result.message);\n if (result.state !== 'failed') setGuidance('');\n })\n }\n >\n Send guidance\n </Button>\n </View>\n ) : null}\n {notice ? <Text style={styles.meta}>{notice}</Text> : null}\n <Sheet open={confirmClear} onOpenChange={setConfirmClear}>\n <SheetContent>\n <SheetHeader>\n <SheetTitle>Clear this run?</SheetTitle>\n </SheetHeader>\n <SheetBody>\n <Text style={styles.meta}>This hides the finished run. Its transcript stays on disk.</Text>\n <Button\n variant=\"danger-outline\"\n onPress={() => {\n if (sessionId !== null) dismissRun(sessionId, runId);\n setConfirmClear(false);\n }}\n >\n Clear\n </Button>\n </SheetBody>\n </SheetContent>\n </Sheet>\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme) => ({\n screen: { flex: 1, backgroundColor: theme.colors.bg },\n transcript: { flex: 1 },\n body: { padding: theme.spacing(3), gap: theme.spacing(2) },\n title: { color: theme.colors.hi, fontSize: theme.fontSize.base, fontWeight: '600' },\n meta: { color: theme.colors.dim, fontSize: theme.fontSize.sm },\n error: { color: theme.colors.red, fontSize: theme.fontSize.sm },\n}));\n","import { defineActivityGroup } from '@agimon-ai/po-core/native';\nimport { UsersIcon } from '@agimon-ai/po-native-components';\nimport { createElement } from 'react';\n\nimport { subagentsTab } from '../_components/SubagentsPanel.native';\nimport { activityRuns, subagents } from '../_lib/subagentsStore.native';\nexport default defineActivityGroup({\n keys: 'a r',\n icon: () => createElement(UsersIcon),\n statusKey: 'doom-team-agents',\n order: 10,\n transientTab: subagentsTab,\n activeSource: {\n subscribe(listener) {\n const subscription = subagents.store.subscribe(listener);\n return () => subscription.unsubscribe();\n },\n isActive(sessionId) {\n return activityRuns(subagents.select(subagents.store.state, sessionId)).length > 0;\n },\n },\n});\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { subagentCatalogChannel } from '../_lib/catalogStore.native';\nexport default defineChannelFile(subagentCatalogChannel);\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { subagentRunsChannel } from '../_lib/subagentsStore.native';\nexport default defineChannelFile(subagentRunsChannel);\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport { Button } from '@agimon-ai/po-native-components';\nimport { View } from 'react-native';\n\nimport { AgentRunRow, agentThreadTab, subagentsTab, useSubagents } from '../../_components/SubagentsPanel.native';\nimport { openCatalog } from '../../_lib/catalogStore.native';\nimport { activityRuns } from '../../_lib/subagentsStore.native';\n\nexport function AgentsActivitySection({ sessionId, openTransientTab }: WebPluginSlotProps) {\n const state = useSubagents(sessionId);\n const runs = activityRuns(state);\n return (\n <View>\n {runs.map((run) => (\n <AgentRunRow key={run.runId} run={run} onPress={() => openTransientTab(agentThreadTab(run))} />\n ))}\n {runs.length === 0 ? (\n <Button\n variant=\"ghost\"\n testID=\"activity-agents-launch\"\n disabled={sessionId === null}\n onPress={() => {\n if (sessionId !== null) {\n openCatalog(sessionId);\n openTransientTab(subagentsTab());\n }\n }}\n >\n Launch an agent\n </Button>\n ) : null}\n </View>\n );\n}\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { AgentsActivitySection } from './_components/AgentsActivitySection.native';\nexport default defineFill({ component: AgentsActivitySection });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport fillTeam from '../src/extensions/workspaces/(frontend)/fill/Team.home.native';\nimport activityGroupAgents from '../src/extensions/workspaces/sessions/(frontend)/activity-group/agents.native';\nimport channelSubagentCatalog from '../src/extensions/workspaces/sessions/(frontend)/channel/subagent-catalog.native';\nimport channelSubagentRuns from '../src/extensions/workspaces/sessions/(frontend)/channel/subagent-runs.native';\nimport fillAgents from '../src/extensions/workspaces/sessions/(frontend)/fill/Agents.activity.agents.native';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const nativePlugin = defineNativePlugin({\n id: 'subagents',\n workspace: {\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'home', id: 'team' }, fillTeam)]; },\n },\n session: {\n get activityGroups(): WebPluginContributions['activityGroups'] { return [via({ name: 'agents' }, activityGroupAgents)]; },\n get channels(): WebPluginContributions['channels'] { return [via({ channel: 'subagent_catalog' }, channelSubagentCatalog), via({ channel: 'subagent_runs' }, channelSubagentRuns)]; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'activity.agents', id: 'agents' }, fillAgents)]; },\n },\n});\n"],"mappings":"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"}
|
|
@@ -36,6 +36,7 @@ let node_child_process = require("node:child_process");
|
|
|
36
36
|
let node_url = require("node:url");
|
|
37
37
|
let _agimon_ai_po_core_headless = require("@agimon-ai/po-core/headless");
|
|
38
38
|
require("@agimon-ai/po-core/cordisHost");
|
|
39
|
+
let _agimon_ai_po_core_hubChannel = require("@agimon-ai/po-core/hubChannel");
|
|
39
40
|
//#region src/services/config/index.ts
|
|
40
41
|
/**
|
|
41
42
|
* `subagent` tool config file: read/write, and the scoped `ExtensionConfig`
|
|
@@ -3562,26 +3563,49 @@ var NativeTeamChannelService = class {
|
|
|
3562
3563
|
};
|
|
3563
3564
|
//#endregion
|
|
3564
3565
|
//#region src/services/headlessIntercomTool/index.ts
|
|
3566
|
+
/**
|
|
3567
|
+
* Finds the peer a `to` value names: its session ID first, then its session
|
|
3568
|
+
* name, ignoring case, so an agent can use the name a person typed. A name two
|
|
3569
|
+
* peers share is refused with their IDs rather than guessed.
|
|
3570
|
+
*/
|
|
3571
|
+
function resolvePeer(peers, to) {
|
|
3572
|
+
const byId = peers.find((peer) => peer.sessionId === to);
|
|
3573
|
+
if (byId !== void 0) return byId;
|
|
3574
|
+
const wanted = to.toLowerCase();
|
|
3575
|
+
const named = peers.filter((peer) => peer.name.trim().toLowerCase() === wanted);
|
|
3576
|
+
if (named.length > 1) throw invalidRequest(`${String(named.length)} sessions are named "${to}".`, `Send to one session ID: ${named.map((peer) => peer.sessionId).join(", ")}.`);
|
|
3577
|
+
return named[0];
|
|
3578
|
+
}
|
|
3579
|
+
function describePeerLine(peer) {
|
|
3580
|
+
const details = [
|
|
3581
|
+
`session ${peer.sessionId}`,
|
|
3582
|
+
...peer.profile === void 0 ? [] : [`profile ${peer.profile}`],
|
|
3583
|
+
...peer.sharedGroups.length === 0 ? [] : [`shared groups: ${peer.sharedGroups.join(", ")}`]
|
|
3584
|
+
];
|
|
3585
|
+
return `- ${peer.name.trim() === "" ? peer.sessionId : peer.name} (${details.join("; ")}): use send; it can reply to you the same way`;
|
|
3586
|
+
}
|
|
3565
3587
|
function createHeadlessIntercomTool(channel, sessions) {
|
|
3566
3588
|
return {
|
|
3567
3589
|
name: "intercom",
|
|
3568
3590
|
label: "Intercom",
|
|
3569
3591
|
description: "Communicate with active agents and related live sessions.",
|
|
3570
3592
|
parameters: TeamToolParamsSchema,
|
|
3571
|
-
promptGuidelines: ["Send only new progress, blockers, or decisions. Do not repeat task briefs or delegation instructions.", "Use members to find related sessions
|
|
3593
|
+
promptGuidelines: ["Send only new progress, blockers, or decisions. Do not repeat task briefs or delegation instructions.", "Use members to find related sessions by the names people give them, then send to that name or its session ID. Session peers use send, not ask/reply, and can send back."],
|
|
3572
3594
|
executionMode: "serial",
|
|
3573
3595
|
async execute(toolCallId, parameters, signal, onUpdate) {
|
|
3574
3596
|
const params = parseTeamToolParams(parameters);
|
|
3575
3597
|
const peers = channel.current() === void 0 ? [] : sessions?.peers() ?? [];
|
|
3576
3598
|
const to = params.to?.trim();
|
|
3577
|
-
|
|
3578
|
-
|
|
3599
|
+
const teamMember = to !== void 0 && channel.snapshot().members.some((member) => member.name === to) && !peers.some((peer) => peer.sessionId === to);
|
|
3600
|
+
const peer = sessions === void 0 || to === void 0 || teamMember ? void 0 : resolvePeer(peers, to);
|
|
3601
|
+
if (sessions !== void 0 && peer !== void 0) {
|
|
3602
|
+
if (params.action !== "send") throw invalidRequest("Session peers support send only.", "Use send with the session name or ID.");
|
|
3579
3603
|
const message = validateMessage(params.message);
|
|
3580
3604
|
const delivery = sessions.delivery();
|
|
3581
3605
|
if (delivery === void 0) throw new Error("Session delivery is unavailable.");
|
|
3582
3606
|
const receipt = await delivery.deliver({
|
|
3583
3607
|
deliveryId: `intercom:${sessions.sessionId}:${toolCallId}`,
|
|
3584
|
-
recipientKey:
|
|
3608
|
+
recipientKey: peer.sessionId,
|
|
3585
3609
|
kind: "intercom_message",
|
|
3586
3610
|
prompt: `Message from session ${sessions.sessionId} via intercom.\n\n${message}\n\nReply using intercom({ action: "send", to: "${sessions.sessionId}", message: "..." }).`,
|
|
3587
3611
|
delivery: "steer"
|
|
@@ -3589,11 +3613,11 @@ function createHeadlessIntercomTool(channel, sessions) {
|
|
|
3589
3613
|
return {
|
|
3590
3614
|
content: [{
|
|
3591
3615
|
type: "text",
|
|
3592
|
-
text: `Message queued for session ${
|
|
3616
|
+
text: `Message queued for session ${peer.name || peer.sessionId}.`
|
|
3593
3617
|
}],
|
|
3594
3618
|
details: {
|
|
3595
3619
|
...receipt,
|
|
3596
|
-
to
|
|
3620
|
+
to: peer.sessionId
|
|
3597
3621
|
}
|
|
3598
3622
|
};
|
|
3599
3623
|
}
|
|
@@ -3603,10 +3627,11 @@ function createHeadlessIntercomTool(channel, sessions) {
|
|
|
3603
3627
|
...result,
|
|
3604
3628
|
content: [...result.content, {
|
|
3605
3629
|
type: "text",
|
|
3606
|
-
text: peers.map(
|
|
3630
|
+
text: peers.map(describePeerLine).join("\n")
|
|
3607
3631
|
}],
|
|
3608
|
-
details: { members: [...channel.snapshot().members, ...peers.map((
|
|
3609
|
-
name:
|
|
3632
|
+
details: { members: [...channel.snapshot().members, ...peers.map((peer) => ({
|
|
3633
|
+
name: peer.name || peer.sessionId,
|
|
3634
|
+
sessionId: peer.sessionId,
|
|
3610
3635
|
role: "session"
|
|
3611
3636
|
}))] }
|
|
3612
3637
|
};
|
|
@@ -6439,7 +6464,11 @@ const root = (0, _agimon_ai_po_core_extensionFile.defineRoot)(({ context, host:
|
|
|
6439
6464
|
} });
|
|
6440
6465
|
const intercom = createHeadlessIntercomTool(channel, {
|
|
6441
6466
|
sessionId: execution.sessionId,
|
|
6442
|
-
peers: () => [...sessionPeers].filter((id) => serverHost.context.sessionService?.canCommunicate?.(execution.sessionId, id) === true)
|
|
6467
|
+
peers: () => [...sessionPeers].filter((id) => serverHost.context.sessionService?.canCommunicate?.(execution.sessionId, id) === true).map((id) => serverHost.context.sessionCommunication?.describePeer?.(id) ?? {
|
|
6468
|
+
sessionId: id,
|
|
6469
|
+
name: "",
|
|
6470
|
+
sharedGroups: []
|
|
6471
|
+
}),
|
|
6443
6472
|
delivery: () => (0, _agimon_ai_po_session.readDoomSessionDelivery)(context)
|
|
6444
6473
|
});
|
|
6445
6474
|
const serverService = (ctx) => {
|
|
@@ -6516,6 +6545,7 @@ const root = (0, _agimon_ai_po_core_extensionFile.defineRoot)(({ context, host:
|
|
|
6516
6545
|
if ((0, _agimon_ai_po_core_backgroundWork.readDoomBackgroundWorkService)(context) === void 0) (0, _agimon_ai_po_session.provideBackgroundWorkService)(context);
|
|
6517
6546
|
},
|
|
6518
6547
|
serverService,
|
|
6548
|
+
(context) => context.provide(_agimon_ai_po_core_childSession.DOOM_CHILD_SESSION_LABELS_SERVICE, { labelFor: (runId) => nativeRuns.get(runId)?.identity }),
|
|
6519
6549
|
mountMcpTools([intercom, createHeadlessSubagentTool(runtime, execution)])
|
|
6520
6550
|
],
|
|
6521
6551
|
activities: [{
|
|
@@ -6688,6 +6718,29 @@ function createSubagentsChannel() {
|
|
|
6688
6718
|
host.publish(scope.sessionId, publicPayload(payload));
|
|
6689
6719
|
};
|
|
6690
6720
|
return {
|
|
6721
|
+
homeFor(scope) {
|
|
6722
|
+
const payload = latest.get(scope.sessionId);
|
|
6723
|
+
if (!payload) return {
|
|
6724
|
+
coverage: "unavailable",
|
|
6725
|
+
entities: []
|
|
6726
|
+
};
|
|
6727
|
+
return {
|
|
6728
|
+
coverage: payload.runs.length > _agimon_ai_po_core_hubChannel.HOME_ENTITY_LIMIT ? "partial" : "ready",
|
|
6729
|
+
entities: payload.runs.slice(0, _agimon_ai_po_core_hubChannel.HOME_ENTITY_LIMIT).map((run) => ({
|
|
6730
|
+
id: (0, node_crypto.createHash)("sha256").update(JSON.stringify([
|
|
6731
|
+
scope.workspaceId ?? scope.cwd,
|
|
6732
|
+
scope.sessionId,
|
|
6733
|
+
run.runId,
|
|
6734
|
+
run.startedAt
|
|
6735
|
+
])).digest("hex"),
|
|
6736
|
+
kind: run.state === "failed" ? "failure" : run.state === "done" ? "completed" : run.state === "stopped" ? "paused" : run.state,
|
|
6737
|
+
title: (run.taskRef || run.task || run.agent).slice(0, 160),
|
|
6738
|
+
...(run.error || run.currentTool)?.trim() ? { detail: (run.error || run.currentTool).slice(0, 320) } : {},
|
|
6739
|
+
updatedAt: new Date(run.lastUpdate).toISOString(),
|
|
6740
|
+
sessionId: scope.sessionId
|
|
6741
|
+
}))
|
|
6742
|
+
};
|
|
6743
|
+
},
|
|
6691
6744
|
payloadFor(scope) {
|
|
6692
6745
|
const payload = scopes.has(scope.sessionId) ? latest.get(scope.sessionId) : void 0;
|
|
6693
6746
|
return payload === void 0 ? void 0 : publicPayload(payload);
|