@narumitw/pi-subagents 2.0.1 → 2.0.2
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/README.md +21 -8
- package/dist/chunks/auto-transport-SY2VHUFH.ts +109 -0
- package/dist/chunks/auto-transport-SY2VHUFH.ts.map +7 -0
- package/dist/chunks/capability-grant-CGEWOEKE.ts +19 -0
- package/dist/chunks/capability-grant-CGEWOEKE.ts.map +7 -0
- package/dist/chunks/chunk-434NII74.ts +282 -0
- package/dist/chunks/chunk-434NII74.ts.map +7 -0
- package/dist/chunks/chunk-47SK2QYC.ts +56 -0
- package/dist/chunks/chunk-47SK2QYC.ts.map +7 -0
- package/dist/chunks/chunk-6KJ34M6S.ts +159 -0
- package/dist/chunks/chunk-6KJ34M6S.ts.map +7 -0
- package/dist/chunks/chunk-7OBINKFM.ts +80 -0
- package/dist/chunks/chunk-7OBINKFM.ts.map +7 -0
- package/dist/chunks/chunk-7QPPBBXZ.ts +335 -0
- package/dist/chunks/chunk-7QPPBBXZ.ts.map +7 -0
- package/dist/chunks/chunk-AEUYS7JC.ts +73 -0
- package/dist/chunks/chunk-AEUYS7JC.ts.map +7 -0
- package/dist/chunks/chunk-BFK2Z4ZF.ts +189 -0
- package/dist/chunks/chunk-BFK2Z4ZF.ts.map +7 -0
- package/dist/chunks/chunk-BOAXY55Y.ts +153 -0
- package/dist/chunks/chunk-BOAXY55Y.ts.map +7 -0
- package/dist/chunks/chunk-C4L6P266.ts +22 -0
- package/dist/chunks/chunk-C4L6P266.ts.map +7 -0
- package/dist/chunks/chunk-DPPVEQAM.ts +29 -0
- package/dist/chunks/chunk-DPPVEQAM.ts.map +7 -0
- package/dist/chunks/chunk-DQMN4OYM.ts +913 -0
- package/dist/chunks/chunk-DQMN4OYM.ts.map +7 -0
- package/dist/chunks/chunk-DSOOH73Y.ts +238 -0
- package/dist/chunks/chunk-DSOOH73Y.ts.map +7 -0
- package/dist/chunks/chunk-EFBPISNT.ts +421 -0
- package/dist/chunks/chunk-EFBPISNT.ts.map +7 -0
- package/dist/chunks/chunk-EWWXFU7N.ts +150 -0
- package/dist/chunks/chunk-EWWXFU7N.ts.map +7 -0
- package/dist/chunks/chunk-F4L2UVSK.ts +380 -0
- package/dist/chunks/chunk-F4L2UVSK.ts.map +7 -0
- package/dist/chunks/chunk-F5YWVHQX.ts +1543 -0
- package/dist/chunks/chunk-F5YWVHQX.ts.map +7 -0
- package/dist/chunks/chunk-G3RSMSXJ.ts +63 -0
- package/dist/chunks/chunk-G3RSMSXJ.ts.map +7 -0
- package/dist/chunks/chunk-G6VZTCFH.ts +70 -0
- package/dist/chunks/chunk-G6VZTCFH.ts.map +7 -0
- package/dist/chunks/chunk-H3FP6DLR.ts +160 -0
- package/dist/chunks/chunk-H3FP6DLR.ts.map +7 -0
- package/dist/chunks/chunk-HA36LPCO.ts +130 -0
- package/dist/chunks/chunk-HA36LPCO.ts.map +7 -0
- package/dist/chunks/chunk-HKC4ES4B.ts +65 -0
- package/dist/chunks/chunk-HKC4ES4B.ts.map +7 -0
- package/dist/chunks/chunk-HOP5FXDT.ts +27 -0
- package/dist/chunks/chunk-HOP5FXDT.ts.map +7 -0
- package/dist/chunks/chunk-I2FAK44T.ts +324 -0
- package/dist/chunks/chunk-I2FAK44T.ts.map +7 -0
- package/dist/chunks/chunk-IGAMVWFN.ts +139 -0
- package/dist/chunks/chunk-IGAMVWFN.ts.map +7 -0
- package/dist/chunks/chunk-KMGKCEO4.ts +38 -0
- package/dist/chunks/chunk-KMGKCEO4.ts.map +7 -0
- package/dist/chunks/chunk-N7BLVXKK.ts +73 -0
- package/dist/chunks/chunk-N7BLVXKK.ts.map +7 -0
- package/dist/chunks/chunk-NIF42QMF.ts +297 -0
- package/dist/chunks/chunk-NIF42QMF.ts.map +7 -0
- package/dist/chunks/chunk-O4VO6JUJ.ts +52 -0
- package/dist/chunks/chunk-O4VO6JUJ.ts.map +7 -0
- package/dist/chunks/chunk-ONDTY4EL.ts +91 -0
- package/dist/chunks/chunk-ONDTY4EL.ts.map +7 -0
- package/dist/chunks/chunk-OVPHFGKO.ts +1769 -0
- package/dist/chunks/chunk-OVPHFGKO.ts.map +7 -0
- package/dist/chunks/chunk-P7OH4XMF.ts +60 -0
- package/dist/chunks/chunk-P7OH4XMF.ts.map +7 -0
- package/dist/chunks/chunk-PSK43Y6A.ts +339 -0
- package/dist/chunks/chunk-PSK43Y6A.ts.map +7 -0
- package/dist/chunks/chunk-QBORTI4W.ts +468 -0
- package/dist/chunks/chunk-QBORTI4W.ts.map +7 -0
- package/dist/chunks/chunk-QDVGH2X7.ts +171 -0
- package/dist/chunks/chunk-QDVGH2X7.ts.map +7 -0
- package/dist/chunks/chunk-RHRQMT7Q.ts +490 -0
- package/dist/chunks/chunk-RHRQMT7Q.ts.map +7 -0
- package/dist/chunks/chunk-RRR66UWR.ts +28 -0
- package/dist/chunks/chunk-RRR66UWR.ts.map +7 -0
- package/dist/chunks/chunk-RSUXZD6S.ts +275 -0
- package/dist/chunks/chunk-RSUXZD6S.ts.map +7 -0
- package/dist/chunks/chunk-RTCVYIZA.ts +221 -0
- package/dist/chunks/chunk-RTCVYIZA.ts.map +7 -0
- package/dist/chunks/chunk-S2IWVK3J.ts +44 -0
- package/dist/chunks/chunk-S2IWVK3J.ts.map +7 -0
- package/dist/chunks/chunk-SCZ33MYW.ts +52 -0
- package/dist/chunks/chunk-SCZ33MYW.ts.map +7 -0
- package/dist/chunks/chunk-SWGQLFSD.ts +60 -0
- package/dist/chunks/chunk-SWGQLFSD.ts.map +7 -0
- package/dist/chunks/chunk-UMBPMVJW.ts +22 -0
- package/dist/chunks/chunk-UMBPMVJW.ts.map +7 -0
- package/dist/chunks/chunk-UVFVHIOP.ts +735 -0
- package/dist/chunks/chunk-UVFVHIOP.ts.map +7 -0
- package/dist/chunks/completion-delivery-YPOWSSV3.ts +16 -0
- package/dist/chunks/completion-delivery-YPOWSSV3.ts.map +7 -0
- package/dist/chunks/config-status-J4GPWP46.ts +34 -0
- package/dist/chunks/config-status-J4GPWP46.ts.map +7 -0
- package/dist/chunks/config-ui-3IBMHTQB.ts +1146 -0
- package/dist/chunks/config-ui-3IBMHTQB.ts.map +7 -0
- package/dist/chunks/consult-NYXVDN5G.ts +518 -0
- package/dist/chunks/consult-NYXVDN5G.ts.map +7 -0
- package/dist/chunks/context-QDKLVQXE.ts +11 -0
- package/dist/chunks/context-QDKLVQXE.ts.map +7 -0
- package/dist/chunks/create-stateful-transport-4WKZHRSI.ts +130 -0
- package/dist/chunks/create-stateful-transport-4WKZHRSI.ts.map +7 -0
- package/dist/chunks/cwd-policy-NB6XZ5GF.ts +17 -0
- package/dist/chunks/cwd-policy-NB6XZ5GF.ts.map +7 -0
- package/dist/chunks/delegation-contract-WJPT4FVS.ts +24 -0
- package/dist/chunks/delegation-contract-WJPT4FVS.ts.map +7 -0
- package/dist/chunks/discovery-K25T3SH4.ts +12 -0
- package/dist/chunks/discovery-K25T3SH4.ts.map +7 -0
- package/dist/chunks/execution-DS2DEIQZ.ts +4034 -0
- package/dist/chunks/execution-DS2DEIQZ.ts.map +7 -0
- package/dist/chunks/in-process-transport-TEYAWSEC.ts +38 -0
- package/dist/chunks/in-process-transport-TEYAWSEC.ts.map +7 -0
- package/dist/chunks/inspect-UOQQ3KNL.ts +619 -0
- package/dist/chunks/inspect-UOQQ3KNL.ts.map +7 -0
- package/dist/chunks/peer-communication-KL36Z6CO.ts +294 -0
- package/dist/chunks/peer-communication-KL36Z6CO.ts.map +7 -0
- package/dist/chunks/persistence-VSGXAW4P.ts +344 -0
- package/dist/chunks/persistence-VSGXAW4P.ts.map +7 -0
- package/dist/chunks/registry-E6XPJB7L.ts +1324 -0
- package/dist/chunks/registry-E6XPJB7L.ts.map +7 -0
- package/dist/chunks/retained-semantic-state-7WXSGRJU.ts +81 -0
- package/dist/chunks/retained-semantic-state-7WXSGRJU.ts.map +7 -0
- package/dist/chunks/rpc-transport-Y6LA5BOP.ts +1154 -0
- package/dist/chunks/rpc-transport-Y6LA5BOP.ts.map +7 -0
- package/dist/chunks/runtime-policy-5YELCOVC.ts +15 -0
- package/dist/chunks/runtime-policy-5YELCOVC.ts.map +7 -0
- package/dist/chunks/semantic-snapshot-WPJ3UAFW.ts +19 -0
- package/dist/chunks/semantic-snapshot-WPJ3UAFW.ts.map +7 -0
- package/dist/chunks/spawn-idempotency-QGHO2WKC.ts +13 -0
- package/dist/chunks/spawn-idempotency-QGHO2WKC.ts.map +7 -0
- package/dist/chunks/stateful-lifecycle-JAR6K55H.ts +15 -0
- package/dist/chunks/stateful-lifecycle-JAR6K55H.ts.map +7 -0
- package/dist/chunks/subprocess-transport-C2XVR25R.ts +158 -0
- package/dist/chunks/subprocess-transport-C2XVR25R.ts.map +7 -0
- package/dist/chunks/workspace-WDKLN72J.ts +11 -0
- package/dist/chunks/workspace-WDKLN72J.ts.map +7 -0
- package/dist/index.ts +1057 -0
- package/dist/index.ts.map +7 -0
- package/package.json +7 -3
- package/src/index.ts +1 -1
- package/src/settings-reader.ts +208 -0
- package/src/settings.ts +22 -187
- package/src/stateful-registration.ts +1230 -0
- package/src/stateful-safety.ts +1 -1
- package/src/stateful.ts +2 -1234
- package/src/subagents-extension.ts +307 -0
- package/src/subagents.ts +1 -308
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/params.ts", "../../src/panel-presets.ts", "../../src/verified-execution-schema.ts"],
|
|
4
|
+
"sourcesContent": ["import { StringEnum } from \"@earendil-works/pi-ai\";\nimport { type Static, Type } from \"typebox\";\nimport { THINKING_LEVELS } from \"./agents/types.js\";\nimport { DelegationContractSchema } from \"./delegation-contract.js\";\nimport { MAX_CONFIGURABLE_PARALLEL_TASKS, MAX_SUBAGENT_TIMEOUT_MS } from \"./limits.js\";\nimport { PANEL_PRESETS } from \"./panel-presets.js\";\nimport { SUBAGENT_RESULT_FORMATS } from \"./result-contract.js\";\nimport { MAX_SUBAGENT_TOOL_CALLS, MAX_SUBAGENT_TURNS } from \"./turn-budget.js\";\nimport { VerifiedExecutionContractSchema } from \"./verified-execution-schema.js\";\n\nconst TimeoutMs = Type.Number({\n\tdescription:\n\t\t\"Work deadline in milliseconds selected for the task difficulty. On expiry, Pi aborts the work and makes one separately bounded summary attempt. Defaults to PI_SUBAGENT_TIMEOUT_MS or 600000.\",\n\tminimum: 1,\n\tmaximum: MAX_SUBAGENT_TIMEOUT_MS,\n});\n\nconst TurnLimitFields = {\n\tidleTimeoutMs: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription:\n\t\t\t\t\"Maximum milliseconds without a completed assistant turn or tool result before Pi aborts work and preserves a checkpoint.\",\n\t\t\tminimum: 1,\n\t\t\tmaximum: MAX_SUBAGENT_TIMEOUT_MS,\n\t\t}),\n\t),\n\tmaxTurns: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Maximum assistant turns before unfinished work is stopped and checkpointed.\",\n\t\t\tminimum: 1,\n\t\t\tmaximum: MAX_SUBAGENT_TURNS,\n\t\t}),\n\t),\n\tmaxToolCalls: Type.Optional(\n\t\tType.Integer({\n\t\t\tdescription: \"Maximum tool calls before additional tool work is stopped and checkpointed.\",\n\t\t\tminimum: 1,\n\t\t\tmaximum: MAX_SUBAGENT_TOOL_CALLS,\n\t\t}),\n\t),\n};\n\nconst ThinkingLevelSchema = StringEnum(THINKING_LEVELS, {\n\tdescription:\n\t\t\"Pi thinking level for the subagent process: off, minimal, low, medium, high, xhigh, or max.\",\n});\n\nconst ResultFormatSchema = StringEnum(SUBAGENT_RESULT_FORMATS, {\n\tdescription:\n\t\t\"Optional completion contract. Text preserves ordinary output; structured-v1 and structured-v2 request versioned JSON with bounded text fallback.\",\n});\n\nconst ContractFields = {\n\tcontract: Type.Optional(DelegationContractSchema),\n\tresultFormat: Type.Optional(ResultFormatSchema),\n\tretryPolicy: Type.Optional(\n\t\tType.Object(\n\t\t\t{\n\t\t\t\tmaxAttempts: Type.Integer({ minimum: 1, maximum: 3 }),\n\t\t\t\tbackoffMs: Type.Optional(Type.Integer({ minimum: 0, maximum: 30_000 })),\n\t\t\t},\n\t\t\t{ additionalProperties: false },\n\t\t),\n\t),\n\thedgeAfterMs: Type.Optional(Type.Integer({ minimum: 1, maximum: 30_000 })),\n};\n\nconst TaskItem = Type.Object({\n\tagent: Type.String({ description: \"Name of the agent to invoke\" }),\n\ttask: Type.String({ description: \"Task to delegate to the agent\" }),\n\tcwd: Type.Optional(Type.String({ description: \"Working directory for the agent process\" })),\n\ttimeoutMs: Type.Optional(TimeoutMs),\n\t...TurnLimitFields,\n\tthinkingLevel: Type.Optional(ThinkingLevelSchema),\n\t...ContractFields,\n});\n\nconst WorkflowTaskItem = Type.Object({\n\tid: Type.String({ minLength: 1, maxLength: 256 }),\n\tagent: Type.Optional(\n\t\tType.String({ description: \"Optional explicit agent; omit to route by capability manifest\" }),\n\t),\n\trequiredCapabilities: Type.Optional(\n\t\tType.Array(Type.String({ minLength: 1, maxLength: 256 }), { maxItems: 50 }),\n\t),\n\trequiredTools: Type.Optional(\n\t\tType.Array(Type.String({ minLength: 1, maxLength: 256 }), { maxItems: 50 }),\n\t),\n\trequiredVerificationRole: Type.Optional(Type.String({ minLength: 1, maxLength: 256 })),\n\tpreferredCostHint: Type.Optional(StringEnum([\"low\", \"medium\", \"high\"] as const)),\n\tpreferredLatencyHint: Type.Optional(StringEnum([\"low\", \"medium\", \"high\"] as const)),\n\ttask: Type.String({ description: \"Task to delegate to the agent\" }),\n\tdependsOn: Type.Optional(\n\t\tType.Array(Type.String({ minLength: 1, maxLength: 256 }), { maxItems: 64 }),\n\t),\n\tinputArtifacts: Type.Optional(\n\t\tType.Array(Type.String({ minLength: 1, maxLength: 256 }), { maxItems: 50 }),\n\t),\n\tinputArtifactVersions: Type.Optional(\n\t\tType.Record(\n\t\t\tType.String({ minLength: 1, maxLength: 256 }),\n\t\t\tType.String({ minLength: 1, maxLength: 256 }),\n\t\t),\n\t),\n\treadPaths: Type.Optional(Type.Array(Type.String({ maxLength: 4096 }), { maxItems: 50 })),\n\twritePaths: Type.Optional(Type.Array(Type.String({ maxLength: 4096 }), { maxItems: 50 })),\n\townershipKeys: Type.Optional(Type.Array(Type.String({ maxLength: 256 }), { maxItems: 50 })),\n\tacceptanceCriteria: Type.Optional(Type.Array(Type.String({ maxLength: 4096 }), { maxItems: 50 })),\n\tintegrationOwner: Type.Optional(Type.Boolean()),\n\tverifierFor: Type.Optional(\n\t\tType.String({\n\t\t\tminLength: 1,\n\t\t\tmaxLength: 256,\n\t\t\tdescription:\n\t\t\t\t\"Target task ID for one distinct direct-dependent structured-v2 verifier. The executor gates target acceptance on a current exact-tree receipt.\",\n\t\t}),\n\t),\n\tcwd: Type.Optional(Type.String({ description: \"Working directory for the agent process\" })),\n\ttimeoutMs: Type.Optional(TimeoutMs),\n\t...TurnLimitFields,\n\tthinkingLevel: Type.Optional(ThinkingLevelSchema),\n\t...ContractFields,\n});\n\nconst ChainItem = Type.Object({\n\tagent: Type.String({ description: \"Name of the agent to invoke\" }),\n\ttask: Type.String({ description: \"Task with optional {previous} placeholder for prior output\" }),\n\tcwd: Type.Optional(Type.String({ description: \"Working directory for the agent process\" })),\n\ttimeoutMs: Type.Optional(TimeoutMs),\n\t...TurnLimitFields,\n\tthinkingLevel: Type.Optional(ThinkingLevelSchema),\n\t...ContractFields,\n});\n\nconst AggregatorItem = Type.Object(\n\t{\n\t\tagent: Type.String({\n\t\t\tdescription: \"Name of the fan-in agent to invoke after parallel tasks complete\",\n\t\t}),\n\t\ttask: Type.String({\n\t\t\tdescription: \"Fan-in task. Use {previous} to include all parallel outputs.\",\n\t\t}),\n\t\tcwd: Type.Optional(\n\t\t\tType.String({ description: \"Working directory for the aggregator process\" }),\n\t\t),\n\t\ttimeoutMs: Type.Optional(TimeoutMs),\n\t\t...TurnLimitFields,\n\t\tthinkingLevel: Type.Optional(ThinkingLevelSchema),\n\t\t...ContractFields,\n\t},\n\t{\n\t\tdescription:\n\t\t\t\"Optional fan-in step for parallel mode. Omit this key entirely when no aggregation is needed; empty or whitespace-only agent/task values are treated as absent.\",\n\t},\n);\n\nconst PanelReviewerItem = Type.Object(\n\t{\n\t\tid: Type.String({ minLength: 1, maxLength: 256 }),\n\t\tagent: Type.String({ minLength: 1 }),\n\t\tfocus: Type.Optional(Type.String({ maxLength: 8 * 1024 })),\n\t\ttimeoutMs: Type.Optional(TimeoutMs),\n\t\t...TurnLimitFields,\n\t\tthinkingLevel: Type.Optional(ThinkingLevelSchema),\n\t},\n\t{ additionalProperties: false },\n);\n\nconst PanelSynthesizerItem = Type.Object(\n\t{\n\t\tagent: Type.String({ minLength: 1 }),\n\t\ttimeoutMs: Type.Optional(TimeoutMs),\n\t\t...TurnLimitFields,\n\t\tthinkingLevel: Type.Optional(ThinkingLevelSchema),\n\t},\n\t{ additionalProperties: false },\n);\n\nconst PanelItem = Type.Object(\n\t{\n\t\tid: Type.Optional(Type.String({ minLength: 1, maxLength: 256 })),\n\t\tpreset: Type.Optional(StringEnum(PANEL_PRESETS, { default: \"custom\" })),\n\t\ttask: Type.String({ minLength: 1, maxLength: 50 * 1024 }),\n\t\tcontext: Type.Optional(Type.String({ maxLength: 50 * 1024 })),\n\t\treviewers: Type.Array(PanelReviewerItem, {\n\t\t\tminItems: 2,\n\t\t\tmaxItems: MAX_CONFIGURABLE_PARALLEL_TASKS,\n\t\t}),\n\t\tsynthesizer: PanelSynthesizerItem,\n\t\tminValidReviews: Type.Optional(Type.Integer({ minimum: 2 })),\n\t},\n\t{\n\t\tadditionalProperties: false,\n\t\tdescription:\n\t\t\t\"One bounded independent review round followed by one evidence-preserving synthesis when enough valid reviews remain.\",\n\t},\n);\n\nconst AgentScopeSchema = StringEnum([\"user\", \"project\", \"both\"] as const, {\n\tdescription:\n\t\t'Per-invocation custom agent scope. Default: \"user\". Use \"project\" for project-local agents or \"both\" for user and project agents; this is a tool argument, not a pi-subagents.json setting.',\n\tdefault: \"user\",\n});\n\nexport const SubagentParams = Type.Object({\n\tagent: Type.Optional(\n\t\tType.String({ description: \"Name of the agent to invoke (for single mode)\" }),\n\t),\n\ttask: Type.Optional(Type.String({ description: \"Task to delegate (for single mode)\" })),\n\ttasks: Type.Optional(\n\t\tType.Array(TaskItem, {\n\t\t\tdescription: \"Array of {agent, task} for parallel execution\",\n\t\t\tmaxItems: MAX_CONFIGURABLE_PARALLEL_TASKS,\n\t\t}),\n\t),\n\tchain: Type.Optional(\n\t\tType.Array(ChainItem, { description: \"Array of {agent, task} for sequential execution\" }),\n\t),\n\taggregator: Type.Optional(AggregatorItem),\n\tpanel: Type.Optional(PanelItem),\n\tworkflow: Type.Optional(\n\t\tType.Object(\n\t\t\t{\n\t\t\t\tid: Type.Optional(Type.String({ minLength: 1, maxLength: 256 })),\n\t\t\t\tverifiedExecution: Type.Optional(VerifiedExecutionContractSchema),\n\t\t\t\thonorAdmission: Type.Optional(\n\t\t\t\t\tType.Boolean({\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\"Opt in to declining workflow tasks whose explicit audit metadata recommends parent-owned work or abstention.\",\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t\ttasks: Type.Array(WorkflowTaskItem, {\n\t\t\t\t\tminItems: 1,\n\t\t\t\t\tmaxItems: MAX_CONFIGURABLE_PARALLEL_TASKS,\n\t\t\t\t}),\n\t\t\t},\n\t\t\t{ additionalProperties: false },\n\t\t),\n\t),\n\tagentScope: Type.Optional(AgentScopeSchema),\n\tconfirmProjectAgents: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Prompt before running project-local agents. Default: true.\",\n\t\t\tdefault: true,\n\t\t}),\n\t),\n\tcwd: Type.Optional(\n\t\tType.String({ description: \"Working directory for the agent process (single mode)\" }),\n\t),\n\ttimeoutMs: Type.Optional(TimeoutMs),\n\ttotalTimeoutMs: Type.Optional(\n\t\tType.Number({\n\t\t\tdescription:\n\t\t\t\t\"Overall blocking-workflow deadline in milliseconds, including queued work, workflow tasks, panel phases, chain steps, and fan-in.\",\n\t\t\tminimum: 1,\n\t\t\tmaximum: MAX_SUBAGENT_TIMEOUT_MS,\n\t\t}),\n\t),\n\t...TurnLimitFields,\n\tthinkingLevel: Type.Optional(ThinkingLevelSchema),\n\t...ContractFields,\n});\n\nexport type SubagentParams = Static<typeof SubagentParams>;\n\nexport function hasUsableAggregator(\n\taggregator: unknown,\n): aggregator is { agent: string; task: string } {\n\tif (!aggregator || typeof aggregator !== \"object\") return false;\n\tconst candidate = aggregator as { agent?: unknown; task?: unknown };\n\treturn (\n\t\ttypeof candidate.agent === \"string\" &&\n\t\tcandidate.agent.trim().length > 0 &&\n\t\ttypeof candidate.task === \"string\" &&\n\t\tcandidate.task.trim().length > 0\n\t);\n}\n", "export const PANEL_PRESETS = [\"code-review\", \"research\", \"security-review\", \"custom\"] as const;\n\nexport type PanelPreset = (typeof PANEL_PRESETS)[number];\n", "import { StringEnum } from \"@earendil-works/pi-ai\";\nimport { type Static, Type } from \"typebox\";\n\nconst VerificationCheckSchema = Type.Object(\n\t{\n\t\tid: Type.String({\n\t\t\tminLength: 1,\n\t\t\tmaxLength: 256,\n\t\t\tpattern: \"^[A-Za-z0-9][A-Za-z0-9._:-]{0,255}$\",\n\t\t}),\n\t\tcommand: StringEnum([\"git\", \"node\", \"npm\", \"npx\"] as const),\n\t\targs: Type.Optional(Type.Array(Type.String({ maxLength: 4096 }), { maxItems: 64 })),\n\t\tcwd: Type.Optional(Type.String({ minLength: 1, maxLength: 4096 })),\n\t\ttimeoutMs: Type.Optional(Type.Integer({ minimum: 1, maximum: 600_000 })),\n\t},\n\t{ additionalProperties: false },\n);\n\nexport const VerifiedExecutionContractSchema = Type.Object(\n\t{\n\t\tverifierAgent: Type.String({ minLength: 1, maxLength: 256 }),\n\t\tmaxReworkCycles: Type.Optional(Type.Integer({ minimum: 0, maximum: 1, default: 1 })),\n\t\tchecks: Type.Optional(Type.Array(VerificationCheckSchema, { maxItems: 32 })),\n\t},\n\t{\n\t\tadditionalProperties: false,\n\t\tdescription:\n\t\t\t\"Explicitly gate mutating workflow success on executor-owned deterministic checks, one least-authority independent verifier, exact submitted-state identity, and managed integration acceptance.\",\n\t},\n);\n\nexport type VerifiedExecutionContract = Static<typeof VerifiedExecutionContractSchema>;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["StringEnum", "Type", "Type", "StringEnum"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// @generated by scripts/build-runtime.mjs; do not edit.
|
|
2
|
+
// @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
|
|
3
|
+
import {
|
|
4
|
+
discoverAgents
|
|
5
|
+
} from "./chunk-PSK43Y6A.js";
|
|
6
|
+
import {
|
|
7
|
+
readSubagentSettings
|
|
8
|
+
} from "./chunk-QBORTI4W.js";
|
|
9
|
+
import {
|
|
10
|
+
safeTerminalLine
|
|
11
|
+
} from "./chunk-SWGQLFSD.js";
|
|
12
|
+
|
|
13
|
+
// src/stateful-safety.ts
|
|
14
|
+
import { realpathSync } from "node:fs";
|
|
15
|
+
import * as path from "node:path";
|
|
16
|
+
function isWriteCapable(tools) {
|
|
17
|
+
if (!tools) return true;
|
|
18
|
+
return tools.some((tool) => ["bash", "write", "edit"].includes(tool));
|
|
19
|
+
}
|
|
20
|
+
async function confirmProjectAgent(name, scope, confirm, ctx, cwd, settings) {
|
|
21
|
+
if (scope !== "project" && scope !== "both") return;
|
|
22
|
+
if (!isSameCwd(cwd, ctx.cwd)) {
|
|
23
|
+
throw new Error("Project-local subagent definitions cannot run with an overridden cwd");
|
|
24
|
+
}
|
|
25
|
+
if (!ctx.isProjectTrusted()) {
|
|
26
|
+
throw new Error("Project-local subagent definitions require a trusted project");
|
|
27
|
+
}
|
|
28
|
+
const discovery = discoverAgents(cwd, scope, settings ?? readSubagentSettings());
|
|
29
|
+
const agent = discovery.agents.find((candidate) => candidate.name === name);
|
|
30
|
+
if (agent?.source !== "project") return;
|
|
31
|
+
if (confirm && ctx.hasUI) {
|
|
32
|
+
const approved = await ctx.ui.confirm(
|
|
33
|
+
"Run project-local agent?",
|
|
34
|
+
`Agent: ${safeTerminalLine(name, 256)}
|
|
35
|
+
Source: ${safeTerminalLine(agent.filePath)}`
|
|
36
|
+
);
|
|
37
|
+
if (!approved) throw new Error("Project-local subagent was not approved");
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function isSameCwd(left, right) {
|
|
41
|
+
try {
|
|
42
|
+
return realpathSync(left) === realpathSync(right);
|
|
43
|
+
} catch {
|
|
44
|
+
return path.resolve(left) === path.resolve(right);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export {
|
|
49
|
+
isWriteCapable,
|
|
50
|
+
confirmProjectAgent
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=chunk-O4VO6JUJ.ts.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/stateful-safety.ts"],
|
|
4
|
+
"sourcesContent": ["import { realpathSync } from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { discoverAgents } from \"./agents/discovery.js\";\nimport type { AgentScope, SubagentSettings } from \"./agents/types.js\";\nimport { safeTerminalLine } from \"./safe-text.js\";\nimport { readSubagentSettings } from \"./settings-reader.js\";\n\nexport function isWriteCapable(tools: string[] | undefined): boolean {\n\tif (!tools) return true;\n\treturn tools.some((tool) => [\"bash\", \"write\", \"edit\"].includes(tool));\n}\n\nexport async function confirmProjectAgent(\n\tname: string,\n\tscope: AgentScope,\n\tconfirm: boolean,\n\tctx: ExtensionContext,\n\tcwd: string,\n\tsettings?: SubagentSettings,\n): Promise<void> {\n\tif (scope !== \"project\" && scope !== \"both\") return;\n\tif (!isSameCwd(cwd, ctx.cwd)) {\n\t\tthrow new Error(\"Project-local subagent definitions cannot run with an overridden cwd\");\n\t}\n\tif (!ctx.isProjectTrusted()) {\n\t\tthrow new Error(\"Project-local subagent definitions require a trusted project\");\n\t}\n\tconst discovery = discoverAgents(cwd, scope, settings ?? readSubagentSettings());\n\tconst agent = discovery.agents.find((candidate) => candidate.name === name);\n\tif (agent?.source !== \"project\") return;\n\tif (confirm && ctx.hasUI) {\n\t\tconst approved = await ctx.ui.confirm(\n\t\t\t\"Run project-local agent?\",\n\t\t\t`Agent: ${safeTerminalLine(name, 256)}\\nSource: ${safeTerminalLine(agent.filePath)}`,\n\t\t);\n\t\tif (!approved) throw new Error(\"Project-local subagent was not approved\");\n\t}\n}\n\nfunction isSameCwd(left: string, right: string): boolean {\n\ttry {\n\t\treturn realpathSync(left) === realpathSync(right);\n\t} catch {\n\t\treturn path.resolve(left) === path.resolve(right);\n\t}\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;AAAA,SAAS,oBAAoB;AAC7B,YAAY,UAAU;AAOf,SAAS,eAAe,OAAsC;AACpE,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MAAM,KAAK,CAAC,SAAS,CAAC,QAAQ,SAAS,MAAM,EAAE,SAAS,IAAI,CAAC;AACrE;AAEA,eAAsB,oBACrB,MACA,OACA,SACA,KACA,KACA,UACgB;AAChB,MAAI,UAAU,aAAa,UAAU,OAAQ;AAC7C,MAAI,CAAC,UAAU,KAAK,IAAI,GAAG,GAAG;AAC7B,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACvF;AACA,MAAI,CAAC,IAAI,iBAAiB,GAAG;AAC5B,UAAM,IAAI,MAAM,8DAA8D;AAAA,EAC/E;AACA,QAAM,YAAY,eAAe,KAAK,OAAO,YAAY,qBAAqB,CAAC;AAC/E,QAAM,QAAQ,UAAU,OAAO,KAAK,CAAC,cAAc,UAAU,SAAS,IAAI;AAC1E,MAAI,OAAO,WAAW,UAAW;AACjC,MAAI,WAAW,IAAI,OAAO;AACzB,UAAM,WAAW,MAAM,IAAI,GAAG;AAAA,MAC7B;AAAA,MACA,UAAU,iBAAiB,MAAM,GAAG,CAAC;AAAA,UAAa,iBAAiB,MAAM,QAAQ,CAAC;AAAA,IACnF;AACA,QAAI,CAAC,SAAU,OAAM,IAAI,MAAM,yCAAyC;AAAA,EACzE;AACD;AAEA,SAAS,UAAU,MAAc,OAAwB;AACxD,MAAI;AACH,WAAO,aAAa,IAAI,MAAM,aAAa,KAAK;AAAA,EACjD,QAAQ;AACP,WAAY,aAAQ,IAAI,MAAW,aAAQ,KAAK;AAAA,EACjD;AACD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// @generated by scripts/build-runtime.mjs; do not edit.
|
|
2
|
+
// @ts-nocheck -- generated JavaScript uses a .ts extension for Pi's Jiti loader.
|
|
3
|
+
import {
|
|
4
|
+
MAX_SUBAGENT_TIMEOUT_MS
|
|
5
|
+
} from "./chunk-H3FP6DLR.js";
|
|
6
|
+
|
|
7
|
+
// src/turn-budget.ts
|
|
8
|
+
var MAX_SUBAGENT_TURNS = 1e6;
|
|
9
|
+
var MAX_SUBAGENT_TOOL_CALLS = 1e6;
|
|
10
|
+
var TERMINAL_STOP_REASONS = /* @__PURE__ */ new Set(["stop", "length", "error", "aborted"]);
|
|
11
|
+
function validateTurnLimits(limits) {
|
|
12
|
+
validateOptionalInteger("idleTimeoutMs", limits.idleTimeoutMs, MAX_SUBAGENT_TIMEOUT_MS);
|
|
13
|
+
validateOptionalInteger("maxTurns", limits.maxTurns, MAX_SUBAGENT_TURNS);
|
|
14
|
+
validateOptionalInteger("maxToolCalls", limits.maxToolCalls, MAX_SUBAGENT_TOOL_CALLS);
|
|
15
|
+
return { ...limits };
|
|
16
|
+
}
|
|
17
|
+
var TurnBudgetMonitor = class {
|
|
18
|
+
limits;
|
|
19
|
+
onExceeded;
|
|
20
|
+
idleTimer;
|
|
21
|
+
assistantTurns = 0;
|
|
22
|
+
toolCalls = 0;
|
|
23
|
+
stopped = false;
|
|
24
|
+
constructor(options) {
|
|
25
|
+
this.limits = validateTurnLimits({
|
|
26
|
+
idleTimeoutMs: options.idleTimeoutMs,
|
|
27
|
+
maxTurns: options.maxTurns,
|
|
28
|
+
maxToolCalls: options.maxToolCalls
|
|
29
|
+
});
|
|
30
|
+
this.onExceeded = options.onExceeded;
|
|
31
|
+
this.resetIdleTimer();
|
|
32
|
+
}
|
|
33
|
+
recordActivity() {
|
|
34
|
+
if (this.stopped) return;
|
|
35
|
+
this.resetIdleTimer();
|
|
36
|
+
}
|
|
37
|
+
recordAssistantTurn(stopReason) {
|
|
38
|
+
if (this.stopped) return;
|
|
39
|
+
this.assistantTurns++;
|
|
40
|
+
this.recordActivity();
|
|
41
|
+
if (this.limits.maxTurns !== void 0 && this.assistantTurns >= this.limits.maxTurns && !TERMINAL_STOP_REASONS.has(stopReason ?? "")) {
|
|
42
|
+
this.exceed({ reason: "turn_limit", limit: this.limits.maxTurns });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
recordToolCalls(count = 1) {
|
|
46
|
+
if (this.stopped || count < 1) return;
|
|
47
|
+
this.toolCalls += count;
|
|
48
|
+
if (this.limits.maxToolCalls !== void 0 && this.toolCalls > this.limits.maxToolCalls) {
|
|
49
|
+
this.exceed({ reason: "tool_call_limit", limit: this.limits.maxToolCalls });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
dispose() {
|
|
53
|
+
this.stopped = true;
|
|
54
|
+
if (this.idleTimer) clearTimeout(this.idleTimer);
|
|
55
|
+
this.idleTimer = void 0;
|
|
56
|
+
}
|
|
57
|
+
resetIdleTimer() {
|
|
58
|
+
if (this.idleTimer) clearTimeout(this.idleTimer);
|
|
59
|
+
const idleTimeoutMs = this.limits.idleTimeoutMs;
|
|
60
|
+
if (idleTimeoutMs === void 0 || this.stopped) {
|
|
61
|
+
this.idleTimer = void 0;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
this.idleTimer = setTimeout(
|
|
65
|
+
() => this.exceed({ reason: "idle_timeout", limit: idleTimeoutMs }),
|
|
66
|
+
idleTimeoutMs
|
|
67
|
+
);
|
|
68
|
+
this.idleTimer.unref?.();
|
|
69
|
+
}
|
|
70
|
+
exceed(stop) {
|
|
71
|
+
if (this.stopped) return;
|
|
72
|
+
this.stopped = true;
|
|
73
|
+
if (this.idleTimer) clearTimeout(this.idleTimer);
|
|
74
|
+
this.idleTimer = void 0;
|
|
75
|
+
this.onExceeded(stop);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
function validateOptionalInteger(name, value, maximum) {
|
|
79
|
+
if (value === void 0) return;
|
|
80
|
+
if (!Number.isSafeInteger(value) || value < 1 || value > maximum) {
|
|
81
|
+
throw new Error(`${name} must be an integer between 1 and ${maximum}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export {
|
|
86
|
+
MAX_SUBAGENT_TURNS,
|
|
87
|
+
MAX_SUBAGENT_TOOL_CALLS,
|
|
88
|
+
validateTurnLimits,
|
|
89
|
+
TurnBudgetMonitor
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=chunk-ONDTY4EL.ts.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/turn-budget.ts"],
|
|
4
|
+
"sourcesContent": ["import { MAX_SUBAGENT_TIMEOUT_MS } from \"./limits.js\";\nimport type { TurnTerminationReason } from \"./timeout-checkpoint.js\";\n\nexport const MAX_SUBAGENT_TURNS = 1_000_000;\nexport const MAX_SUBAGENT_TOOL_CALLS = 1_000_000;\n\nexport interface TurnLimits {\n\tidleTimeoutMs?: number;\n\tmaxTurns?: number;\n\tmaxToolCalls?: number;\n}\n\nexport interface TurnBudgetStop {\n\treason: Extract<TurnTerminationReason, \"idle_timeout\" | \"turn_limit\" | \"tool_call_limit\">;\n\tlimit: number;\n}\n\nexport interface TurnBudgetMonitorOptions extends TurnLimits {\n\tonExceeded(stop: TurnBudgetStop): void;\n}\n\nconst TERMINAL_STOP_REASONS = new Set([\"stop\", \"length\", \"error\", \"aborted\"]);\n\nexport function validateTurnLimits(limits: TurnLimits): TurnLimits {\n\tvalidateOptionalInteger(\"idleTimeoutMs\", limits.idleTimeoutMs, MAX_SUBAGENT_TIMEOUT_MS);\n\tvalidateOptionalInteger(\"maxTurns\", limits.maxTurns, MAX_SUBAGENT_TURNS);\n\tvalidateOptionalInteger(\"maxToolCalls\", limits.maxToolCalls, MAX_SUBAGENT_TOOL_CALLS);\n\treturn { ...limits };\n}\n\nexport class TurnBudgetMonitor {\n\tprivate readonly limits: TurnLimits;\n\tprivate readonly onExceeded: (stop: TurnBudgetStop) => void;\n\tprivate idleTimer?: NodeJS.Timeout;\n\tprivate assistantTurns = 0;\n\tprivate toolCalls = 0;\n\tprivate stopped = false;\n\n\tconstructor(options: TurnBudgetMonitorOptions) {\n\t\tthis.limits = validateTurnLimits({\n\t\t\tidleTimeoutMs: options.idleTimeoutMs,\n\t\t\tmaxTurns: options.maxTurns,\n\t\t\tmaxToolCalls: options.maxToolCalls,\n\t\t});\n\t\tthis.onExceeded = options.onExceeded;\n\t\tthis.resetIdleTimer();\n\t}\n\n\trecordActivity(): void {\n\t\tif (this.stopped) return;\n\t\tthis.resetIdleTimer();\n\t}\n\n\trecordAssistantTurn(stopReason?: string): void {\n\t\tif (this.stopped) return;\n\t\tthis.assistantTurns++;\n\t\tthis.recordActivity();\n\t\tif (\n\t\t\tthis.limits.maxTurns !== undefined &&\n\t\t\tthis.assistantTurns >= this.limits.maxTurns &&\n\t\t\t!TERMINAL_STOP_REASONS.has(stopReason ?? \"\")\n\t\t) {\n\t\t\tthis.exceed({ reason: \"turn_limit\", limit: this.limits.maxTurns });\n\t\t}\n\t}\n\n\trecordToolCalls(count = 1): void {\n\t\tif (this.stopped || count < 1) return;\n\t\tthis.toolCalls += count;\n\t\tif (this.limits.maxToolCalls !== undefined && this.toolCalls > this.limits.maxToolCalls) {\n\t\t\tthis.exceed({ reason: \"tool_call_limit\", limit: this.limits.maxToolCalls });\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis.stopped = true;\n\t\tif (this.idleTimer) clearTimeout(this.idleTimer);\n\t\tthis.idleTimer = undefined;\n\t}\n\n\tprivate resetIdleTimer(): void {\n\t\tif (this.idleTimer) clearTimeout(this.idleTimer);\n\t\tconst idleTimeoutMs = this.limits.idleTimeoutMs;\n\t\tif (idleTimeoutMs === undefined || this.stopped) {\n\t\t\tthis.idleTimer = undefined;\n\t\t\treturn;\n\t\t}\n\t\tthis.idleTimer = setTimeout(\n\t\t\t() => this.exceed({ reason: \"idle_timeout\", limit: idleTimeoutMs }),\n\t\t\tidleTimeoutMs,\n\t\t);\n\t\tthis.idleTimer.unref?.();\n\t}\n\n\tprivate exceed(stop: TurnBudgetStop): void {\n\t\tif (this.stopped) return;\n\t\tthis.stopped = true;\n\t\tif (this.idleTimer) clearTimeout(this.idleTimer);\n\t\tthis.idleTimer = undefined;\n\t\tthis.onExceeded(stop);\n\t}\n}\n\nfunction validateOptionalInteger(name: string, value: number | undefined, maximum: number): void {\n\tif (value === undefined) return;\n\tif (!Number.isSafeInteger(value) || value < 1 || value > maximum) {\n\t\tthrow new Error(`${name} must be an integer between 1 and ${maximum}`);\n\t}\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;AAGO,IAAM,qBAAqB;AAC3B,IAAM,0BAA0B;AAiBvC,IAAM,wBAAwB,oBAAI,IAAI,CAAC,QAAQ,UAAU,SAAS,SAAS,CAAC;AAErE,SAAS,mBAAmB,QAAgC;AAClE,0BAAwB,iBAAiB,OAAO,eAAe,uBAAuB;AACtF,0BAAwB,YAAY,OAAO,UAAU,kBAAkB;AACvE,0BAAwB,gBAAgB,OAAO,cAAc,uBAAuB;AACpF,SAAO,EAAE,GAAG,OAAO;AACpB;AAEO,IAAM,oBAAN,MAAwB;AAAA,EACb;AAAA,EACA;AAAA,EACT;AAAA,EACA,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,UAAU;AAAA,EAElB,YAAY,SAAmC;AAC9C,SAAK,SAAS,mBAAmB;AAAA,MAChC,eAAe,QAAQ;AAAA,MACvB,UAAU,QAAQ;AAAA,MAClB,cAAc,QAAQ;AAAA,IACvB,CAAC;AACD,SAAK,aAAa,QAAQ;AAC1B,SAAK,eAAe;AAAA,EACrB;AAAA,EAEA,iBAAuB;AACtB,QAAI,KAAK,QAAS;AAClB,SAAK,eAAe;AAAA,EACrB;AAAA,EAEA,oBAAoB,YAA2B;AAC9C,QAAI,KAAK,QAAS;AAClB,SAAK;AACL,SAAK,eAAe;AACpB,QACC,KAAK,OAAO,aAAa,UACzB,KAAK,kBAAkB,KAAK,OAAO,YACnC,CAAC,sBAAsB,IAAI,cAAc,EAAE,GAC1C;AACD,WAAK,OAAO,EAAE,QAAQ,cAAc,OAAO,KAAK,OAAO,SAAS,CAAC;AAAA,IAClE;AAAA,EACD;AAAA,EAEA,gBAAgB,QAAQ,GAAS;AAChC,QAAI,KAAK,WAAW,QAAQ,EAAG;AAC/B,SAAK,aAAa;AAClB,QAAI,KAAK,OAAO,iBAAiB,UAAa,KAAK,YAAY,KAAK,OAAO,cAAc;AACxF,WAAK,OAAO,EAAE,QAAQ,mBAAmB,OAAO,KAAK,OAAO,aAAa,CAAC;AAAA,IAC3E;AAAA,EACD;AAAA,EAEA,UAAgB;AACf,SAAK,UAAU;AACf,QAAI,KAAK,UAAW,cAAa,KAAK,SAAS;AAC/C,SAAK,YAAY;AAAA,EAClB;AAAA,EAEQ,iBAAuB;AAC9B,QAAI,KAAK,UAAW,cAAa,KAAK,SAAS;AAC/C,UAAM,gBAAgB,KAAK,OAAO;AAClC,QAAI,kBAAkB,UAAa,KAAK,SAAS;AAChD,WAAK,YAAY;AACjB;AAAA,IACD;AACA,SAAK,YAAY;AAAA,MAChB,MAAM,KAAK,OAAO,EAAE,QAAQ,gBAAgB,OAAO,cAAc,CAAC;AAAA,MAClE;AAAA,IACD;AACA,SAAK,UAAU,QAAQ;AAAA,EACxB;AAAA,EAEQ,OAAO,MAA4B;AAC1C,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU;AACf,QAAI,KAAK,UAAW,cAAa,KAAK,SAAS;AAC/C,SAAK,YAAY;AACjB,SAAK,WAAW,IAAI;AAAA,EACrB;AACD;AAEA,SAAS,wBAAwB,MAAc,OAA2B,SAAuB;AAChG,MAAI,UAAU,OAAW;AACzB,MAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,KAAK,QAAQ,SAAS;AACjE,UAAM,IAAI,MAAM,GAAG,IAAI,qCAAqC,OAAO,EAAE;AAAA,EACtE;AACD;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|