@ashx-j/lunr 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/builtin-extensions/index.d.ts +13 -4
  2. package/dist/builtin-extensions/index.d.ts.map +1 -1
  3. package/dist/builtin-extensions/index.js +30 -21
  4. package/dist/builtin-extensions/index.js.map +1 -1
  5. package/dist/builtin-extensions/lunr-local-providers/index.d.ts.map +1 -1
  6. package/dist/builtin-extensions/lunr-local-providers/index.js +25 -3
  7. package/dist/builtin-extensions/lunr-local-providers/index.js.map +1 -1
  8. package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts.map +1 -1
  9. package/dist/builtin-extensions/lunr-local-providers/local-servers.js +4 -2
  10. package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
  11. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +2 -3
  12. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
  13. package/dist/builtin-extensions/pi-ollama-cloud/index.js +4 -25
  14. package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
  15. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
  16. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +3 -0
  17. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
  18. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  19. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +4 -1
  20. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  21. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  22. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +4 -1
  23. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  24. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  25. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +20 -0
  26. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  27. package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.d.ts.map +1 -1
  28. package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.js +1 -1
  29. package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.js.map +1 -1
  30. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +2 -0
  31. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  32. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  33. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts +2 -0
  34. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts.map +1 -1
  35. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js +2 -0
  36. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js.map +1 -1
  37. package/dist/catalog/models.json +1 -1
  38. package/dist/catalog/providers/amazon-bedrock.json +1 -1
  39. package/dist/catalog/providers/cloudflare-workers-ai.json +1 -1
  40. package/dist/catalog/providers/huggingface.json +1 -1
  41. package/dist/catalog/providers/opencode-go.json +1 -1
  42. package/dist/catalog/providers/openrouter.json +1 -1
  43. package/dist/catalog/providers/together.json +1 -1
  44. package/dist/catalog/providers/vercel-ai-gateway.json +1 -1
  45. package/dist/catalog/publication.json +3 -3
  46. package/dist/cli.d.ts.map +1 -1
  47. package/dist/cli.js +19 -4
  48. package/dist/cli.js.map +1 -1
  49. package/dist/core/agent-session-services.d.ts.map +1 -1
  50. package/dist/core/agent-session-services.js +7 -0
  51. package/dist/core/agent-session-services.js.map +1 -1
  52. package/dist/core/agent-session.d.ts +9 -0
  53. package/dist/core/agent-session.d.ts.map +1 -1
  54. package/dist/core/agent-session.js +74 -0
  55. package/dist/core/agent-session.js.map +1 -1
  56. package/dist/core/auth-storage.d.ts.map +1 -1
  57. package/dist/core/auth-storage.js +39 -7
  58. package/dist/core/auth-storage.js.map +1 -1
  59. package/dist/core/catalog-merge.d.ts.map +1 -1
  60. package/dist/core/catalog-merge.js +4 -1
  61. package/dist/core/catalog-merge.js.map +1 -1
  62. package/dist/core/extensions/index.d.ts +1 -1
  63. package/dist/core/extensions/index.d.ts.map +1 -1
  64. package/dist/core/extensions/index.js.map +1 -1
  65. package/dist/core/extensions/runner.d.ts +2 -0
  66. package/dist/core/extensions/runner.d.ts.map +1 -1
  67. package/dist/core/extensions/runner.js +12 -0
  68. package/dist/core/extensions/runner.js.map +1 -1
  69. package/dist/core/extensions/types.d.ts +2 -1
  70. package/dist/core/extensions/types.d.ts.map +1 -1
  71. package/dist/core/extensions/types.js.map +1 -1
  72. package/dist/core/grok-cli-auth.d.ts +13 -3
  73. package/dist/core/grok-cli-auth.d.ts.map +1 -1
  74. package/dist/core/grok-cli-auth.js +130 -21
  75. package/dist/core/grok-cli-auth.js.map +1 -1
  76. package/dist/core/model-runtime.d.ts +9 -1
  77. package/dist/core/model-runtime.d.ts.map +1 -1
  78. package/dist/core/model-runtime.js +40 -12
  79. package/dist/core/model-runtime.js.map +1 -1
  80. package/dist/core/official-catalog.d.ts +8 -1
  81. package/dist/core/official-catalog.d.ts.map +1 -1
  82. package/dist/core/official-catalog.js +38 -11
  83. package/dist/core/official-catalog.js.map +1 -1
  84. package/dist/core/package-manager.d.ts.map +1 -1
  85. package/dist/core/package-manager.js +28 -4
  86. package/dist/core/package-manager.js.map +1 -1
  87. package/dist/core/plan-mode.d.ts +2 -0
  88. package/dist/core/plan-mode.d.ts.map +1 -1
  89. package/dist/core/plan-mode.js +7 -0
  90. package/dist/core/plan-mode.js.map +1 -1
  91. package/dist/core/resource-loader.d.ts +2 -0
  92. package/dist/core/resource-loader.d.ts.map +1 -1
  93. package/dist/core/resource-loader.js +27 -3
  94. package/dist/core/resource-loader.js.map +1 -1
  95. package/dist/core/subagent-permission-inherit.d.ts +38 -0
  96. package/dist/core/subagent-permission-inherit.d.ts.map +1 -0
  97. package/dist/core/subagent-permission-inherit.js +110 -0
  98. package/dist/core/subagent-permission-inherit.js.map +1 -0
  99. package/dist/core/usage-service.d.ts.map +1 -1
  100. package/dist/core/usage-service.js +5 -5
  101. package/dist/core/usage-service.js.map +1 -1
  102. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  103. package/dist/gateway/agent-bridge.js +2 -2
  104. package/dist/gateway/agent-bridge.js.map +1 -1
  105. package/dist/gateway/command.d.ts.map +1 -1
  106. package/dist/gateway/command.js +2 -1
  107. package/dist/gateway/command.js.map +1 -1
  108. package/dist/gateway/cron.d.ts.map +1 -1
  109. package/dist/gateway/cron.js +2 -2
  110. package/dist/gateway/cron.js.map +1 -1
  111. package/dist/main.d.ts.map +1 -1
  112. package/dist/main.js +25 -4
  113. package/dist/main.js.map +1 -1
  114. package/dist/modes/interactive/interactive-mode.d.ts +7 -0
  115. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  116. package/dist/modes/interactive/interactive-mode.js +35 -8
  117. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  118. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  119. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  120. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  121. package/examples/extensions/gondolin/package-lock.json +2 -2
  122. package/examples/extensions/gondolin/package.json +1 -1
  123. package/examples/extensions/sandbox/package-lock.json +2 -2
  124. package/examples/extensions/sandbox/package.json +1 -1
  125. package/examples/extensions/with-deps/package-lock.json +2 -2
  126. package/examples/extensions/with-deps/package.json +1 -1
  127. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic-fanout.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { DynamicParallelStep, ParallelTaskItem } from \"../../shared/settings.ts\";\nimport type { ArtifactPaths, ChainOutputMap, JsonSchemaObject, SingleResult } from \"../../shared/types.ts\";\nimport { getSingleResultOutput } from \"../../shared/utils.ts\";\nimport { validateStructuredOutputValue } from \"./structured-output.ts\";\n\nexport class DynamicFanoutError extends Error {}\n\nexport interface DynamicFanoutConfig {\n\tmaxItems?: number;\n\tallowRunnerFields?: boolean;\n}\n\nexport interface DynamicMaterializedItem {\n\tindex: number;\n\tkey: string;\n\tidKey: string;\n\titem: unknown;\n}\n\nexport interface DynamicCollectedResult {\n\tkey: string;\n\tindex: number;\n\titem: unknown;\n\tagent: string;\n\texitCode: number | null;\n\ttext: string;\n\tstructured?: unknown;\n\terror?: string;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\toutputPath?: string;\n\tartifactPaths?: ArtifactPaths;\n}\n\nexport interface DynamicMaterializedGroup {\n\titems: DynamicMaterializedItem[];\n\tparallel: ParallelTaskItem[];\n\tcollectedOnEmpty?: DynamicCollectedResult[];\n}\n\nconst SAFE_OUTPUT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ITEM_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ITEM_REF_PATTERN = /\\{([A-Za-z_][A-Za-z0-9_]*)(?:\\.([^{}]+))?\\}/g;\nconst RESERVED_TEMPLATE_NAMES = new Set([\"task\", \"previous\", \"chain_dir\", \"outputs\"]);\nconst DYNAMIC_STEP_KEYS = new Set([\"expand\", \"parallel\", \"collect\", \"concurrency\", \"failFast\", \"phase\", \"label\", \"acceptance\"]);\nconst RUNNER_DYNAMIC_STEP_KEYS = new Set([...DYNAMIC_STEP_KEYS, \"effectiveAcceptance\", \"acceptanceInput\", \"acceptanceRole\", \"sessionFiles\", \"thinkingOverrides\"]);\nconst DYNAMIC_EXPAND_KEYS = new Set([\"from\", \"item\", \"key\", \"maxItems\", \"onEmpty\"]);\nconst DYNAMIC_EXPAND_FROM_KEYS = new Set([\"output\", \"path\"]);\nconst DYNAMIC_PARALLEL_KEYS = new Set([\"agent\", \"task\", \"phase\", \"label\", \"outputSchema\", \"cwd\", \"output\", \"outputMode\", \"reads\", \"progress\", \"skill\", \"model\", \"toolBudget\", \"acceptance\"]);\nconst RUNNER_DYNAMIC_PARALLEL_KEYS = new Set([\n\t...DYNAMIC_PARALLEL_KEYS,\n\t\"outputName\", \"structured\", \"inheritProjectContext\", \"inheritSkills\", \"skills\", \"outputPath\", \"namespaceOutputPath\", \"maxSubagentDepth\", \"waitToolEnabled\",\n\t\"structuredOutput\", \"structuredOutputSchema\", \"tools\", \"extensions\", \"subagentOnlyExtensions\", \"mcpDirectTools\", \"completionGuard\", \"systemPrompt\",\n\t\"systemPromptMode\", \"thinking\", \"modelCandidates\", \"sessionFile\", \"effectiveAcceptance\", \"acceptanceInput\", \"acceptanceRole\", \"parentSessionId\",\n]);\nconst DYNAMIC_COLLECT_KEYS = new Set([\"as\", \"outputSchema\"]);\n\nexport function isSafeOutputName(name: string): boolean {\n\treturn SAFE_OUTPUT_NAME_PATTERN.test(name);\n}\n\nexport function assertJsonPointer(pointer: string, label: string): void {\n\tif (pointer === \"\") return;\n\tif (!pointer.startsWith(\"/\")) {\n\t\tthrow new DynamicFanoutError(`${label} must be a JSON Pointer starting with '/'.`);\n\t}\n\tfor (const segment of pointer.slice(1).split(\"/\")) {\n\t\tif (/~(?![01])/.test(segment)) {\n\t\t\tthrow new DynamicFanoutError(`${label} contains invalid JSON Pointer escape.`);\n\t\t}\n\t}\n}\n\nfunction decodePointerSegment(segment: string): string {\n\treturn segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n}\n\nexport function resolveJsonPointer(value: unknown, pointer: string, label: string): unknown {\n\tassertJsonPointer(pointer, label);\n\tif (pointer === \"\") return value;\n\tlet current = value;\n\tfor (const rawSegment of pointer.slice(1).split(\"/\")) {\n\t\tconst segment = decodePointerSegment(rawSegment);\n\t\tif (Array.isArray(current)) {\n\t\t\tif (!/^(0|[1-9][0-9]*)$/.test(segment)) {\n\t\t\t\tthrow new DynamicFanoutError(`${label} segment '${segment}' does not address an array index.`);\n\t\t\t}\n\t\t\tconst index = Number(segment);\n\t\t\tif (index >= current.length) throw new DynamicFanoutError(`${label} does not exist.`);\n\t\t\tcurrent = current[index];\n\t\t\tcontinue;\n\t\t}\n\t\tif (!current || typeof current !== \"object\") {\n\t\t\tthrow new DynamicFanoutError(`${label} does not exist.`);\n\t\t}\n\t\tconst record = current as Record<string, unknown>;\n\t\tif (!Object.prototype.hasOwnProperty.call(record, segment)) {\n\t\t\tthrow new DynamicFanoutError(`${label} does not exist.`);\n\t\t}\n\t\tcurrent = record[segment];\n\t}\n\treturn current;\n}\n\nfunction scalarToKey(value: unknown, label: string): string {\n\tif (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n\t\tconst key = String(value);\n\t\tif (!key.trim()) throw new DynamicFanoutError(`${label} resolved to an empty key.`);\n\t\tif (/[\\u0000-\\u001F\\u007F]/.test(key)) throw new DynamicFanoutError(`${label} resolved to an unsafe key.`);\n\t\tif (key.length > 200) throw new DynamicFanoutError(`${label} resolved to a key longer than 200 characters.`);\n\t\treturn key;\n\t}\n\tthrow new DynamicFanoutError(`${label} must resolve to a string, number, or boolean.`);\n}\n\nexport function normalizeItemKeyForId(key: string): string {\n\tconst normalized = key\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\")\n\t\t.slice(0, 80);\n\treturn normalized || \"item\";\n}\n\nfunction valueToTemplateText(value: unknown, reference: string): string {\n\tif (value === undefined) throw new DynamicFanoutError(`Unresolved item reference '${reference}'.`);\n\tif (typeof value === \"string\") return value;\n\tif (typeof value === \"number\" || typeof value === \"boolean\" || value === null) return String(value);\n\treturn JSON.stringify(value);\n}\n\nfunction resolveItemPath(item: unknown, pathText: string | undefined, reference: string): unknown {\n\tif (!pathText) return item;\n\tconst pointer = `/${pathText.split(\".\").map((segment) => segment.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")).join(\"/\")}`;\n\treturn resolveJsonPointer(item, pointer, reference);\n}\n\nexport function resolveItemTemplate(template: string, itemName: string, item: unknown): string {\n\treturn template.replace(ITEM_REF_PATTERN, (raw, name: string, pathText: string | undefined) => {\n\t\tif (name !== itemName) return raw;\n\t\tif (pathText !== undefined && (!pathText.trim() || pathText.includes(\"..\"))) {\n\t\t\tthrow new DynamicFanoutError(`Invalid item reference '${raw}'.`);\n\t\t}\n\t\treturn valueToTemplateText(resolveItemPath(item, pathText, raw), raw);\n\t});\n}\n\nfunction assertOnlyKeys(value: unknown, allowed: Set<string>, label: string): void {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw new DynamicFanoutError(`${label} must be an object.`);\n\tfor (const key of Object.keys(value)) {\n\t\tif (!allowed.has(key)) throw new DynamicFanoutError(`${label} does not support field '${key}'.`);\n\t}\n}\n\nexport function assertNoUnresolvedItemReferences(template: string, itemName: string, label: string): void {\n\tfor (const match of template.matchAll(/\\{([^{}]*)\\}/g)) {\n\t\tconst raw = match[0]!;\n\t\tconst reference = match[1]!;\n\t\tif (reference === itemName || reference.startsWith(`${itemName}.`)) {\n\t\t\tif (!ITEM_REF_PATTERN.test(raw) || reference === `${itemName}.` || reference.includes(\"..\")) {\n\t\t\t\tthrow new DynamicFanoutError(`Invalid item reference '${raw}' in ${label}.`);\n\t\t\t}\n\t\t\tITEM_REF_PATTERN.lastIndex = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tITEM_REF_PATTERN.lastIndex = 0;\n\t\tconst name = reference.match(/^[A-Za-z_][A-Za-z0-9_]*/)?.[0];\n\t\tif (name === itemName) throw new DynamicFanoutError(`Invalid item reference '${raw}' in ${label}.`);\n\t\tif (name && RESERVED_TEMPLATE_NAMES.has(name)) continue;\n\t\tif (name) throw new DynamicFanoutError(`Unsupported template reference '${raw}' in ${label}.`);\n\t}\n\tITEM_REF_PATTERN.lastIndex = 0;\n\tif (template.includes(`{${itemName}.}`) || new RegExp(`\\\\{${itemName}(?:\\\\.|$)[^}]*$`).test(template)) {\n\t\tthrow new DynamicFanoutError(`Invalid item reference in ${label}.`);\n\t}\n}\n\nexport function hasDynamicFanoutFields(step: unknown): boolean {\n\treturn !!step && typeof step === \"object\" && !Array.isArray(step)\n\t\t&& (Object.prototype.hasOwnProperty.call(step, \"expand\") || Object.prototype.hasOwnProperty.call(step, \"collect\"));\n}\n\nexport function validateDynamicStepShape(step: DynamicParallelStep, stepIndex: number, config: DynamicFanoutConfig = {}): void {\n\tconst prefix = `Dynamic chain step ${stepIndex + 1}`;\n\tassertOnlyKeys(step, config.allowRunnerFields ? RUNNER_DYNAMIC_STEP_KEYS : DYNAMIC_STEP_KEYS, prefix);\n\tif (!step.expand || !step.expand.from) throw new DynamicFanoutError(`${prefix} requires expand.from.`);\n\tassertOnlyKeys(step.expand, DYNAMIC_EXPAND_KEYS, `${prefix} expand`);\n\tassertOnlyKeys(step.expand.from, DYNAMIC_EXPAND_FROM_KEYS, `${prefix} expand.from`);\n\tif (!isSafeOutputName(step.expand.from.output)) throw new DynamicFanoutError(`${prefix} has invalid expand.from.output '${step.expand.from.output}'.`);\n\tassertJsonPointer(step.expand.from.path, `${prefix} expand.from.path`);\n\tif (step.expand.key !== undefined) assertJsonPointer(step.expand.key, `${prefix} expand.key`);\n\tconst itemName = step.expand.item ?? \"item\";\n\tif (!ITEM_NAME_PATTERN.test(itemName)) throw new DynamicFanoutError(`${prefix} has invalid expand.item '${itemName}'.`);\n\tif (step.expand.maxItems === undefined && config.maxItems === undefined) {\n\t\tthrow new DynamicFanoutError(`${prefix} requires expand.maxItems or config.chain.dynamicFanout.maxItems.`);\n\t}\n\tif (step.expand.maxItems !== undefined && (!Number.isInteger(step.expand.maxItems) || step.expand.maxItems < 0)) {\n\t\tthrow new DynamicFanoutError(`${prefix} expand.maxItems must be an integer >= 0.`);\n\t}\n\tif (config.maxItems !== undefined && (!Number.isInteger(config.maxItems) || config.maxItems < 0)) {\n\t\tthrow new DynamicFanoutError(\"config.chain.dynamicFanout.maxItems must be an integer >= 0.\");\n\t}\n\tif (!step.parallel || Array.isArray(step.parallel)) throw new DynamicFanoutError(`${prefix} requires a single parallel template object and cannot mix dynamic expand/collect with static parallel arrays.`);\n\tassertOnlyKeys(step.parallel, config.allowRunnerFields ? RUNNER_DYNAMIC_PARALLEL_KEYS : DYNAMIC_PARALLEL_KEYS, `${prefix} parallel`);\n\tif (\"expand\" in (step.parallel as object)) throw new DynamicFanoutError(`${prefix} does not support nested dynamic fanout.`);\n\tif (!step.parallel.agent) throw new DynamicFanoutError(`${prefix} parallel.agent is required.`);\n\tif (!step.collect?.as || !isSafeOutputName(step.collect.as)) throw new DynamicFanoutError(`${prefix} requires collect.as with a safe output name.`);\n\tassertOnlyKeys(step.collect, DYNAMIC_COLLECT_KEYS, `${prefix} collect`);\n\tfor (const [label, template] of [\n\t\t[\"parallel.task\", step.parallel.task],\n\t\t[\"parallel.label\", step.parallel.label],\n\t] as const) {\n\t\tif (template) assertNoUnresolvedItemReferences(template, itemName, `${prefix} ${label}`);\n\t}\n}\n\nexport function resolveDynamicFanoutItems(step: DynamicParallelStep, outputs: ChainOutputMap, stepIndex: number, config: DynamicFanoutConfig = {}): DynamicMaterializedItem[] {\n\tvalidateDynamicStepShape(step, stepIndex, config);\n\tconst sourceName = step.expand.from.output;\n\tconst source = outputs[sourceName];\n\tif (!source) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} references unknown output '${sourceName}'.`);\n\tif (source.structured === undefined) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} requires structured output '${sourceName}'.`);\n\tconst value = resolveJsonPointer(source.structured, step.expand.from.path, `Dynamic chain step ${stepIndex + 1} expand.from.path`);\n\tif (!Array.isArray(value)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} expand.from.path must resolve to an array.`);\n\tconst maxItems = step.expand.maxItems ?? config.maxItems;\n\tif (maxItems === undefined) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} requires an effective maxItems.`);\n\tif (value.length > maxItems) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} resolved ${value.length} items, exceeding maxItems ${maxItems}.`);\n\tconst seen = new Set<string>();\n\tconst seenIds = new Set<string>();\n\treturn value.map((item, index) => {\n\t\tconst key = step.expand.key === undefined\n\t\t\t? String(index)\n\t\t\t: scalarToKey(resolveJsonPointer(item, step.expand.key, `Dynamic chain step ${stepIndex + 1} expand.key`), `Dynamic chain step ${stepIndex + 1} expand.key`);\n\t\tif (seen.has(key)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} produced duplicate item key '${key}'.`);\n\t\tseen.add(key);\n\t\tconst idKey = normalizeItemKeyForId(key);\n\t\tif (seenIds.has(idKey)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} produced colliding item id '${idKey}'.`);\n\t\tseenIds.add(idKey);\n\t\treturn { index, key, idKey, item };\n\t});\n}\n\nexport function materializeDynamicParallelStep(step: DynamicParallelStep, outputs: ChainOutputMap, stepIndex: number, config: DynamicFanoutConfig = {}): DynamicMaterializedGroup {\n\tconst items = resolveDynamicFanoutItems(step, outputs, stepIndex, config);\n\tif (items.length === 0) {\n\t\tif ((step.expand.onEmpty ?? \"skip\") === \"fail\") {\n\t\t\tthrow new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} source array is empty.`);\n\t\t}\n\t\treturn { items, parallel: [], collectedOnEmpty: [] };\n\t}\n\tconst itemName = step.expand.item ?? \"item\";\n\tconst parallel = items.map((entry) => {\n\t\tconst task = resolveItemTemplate(step.parallel.task ?? \"{previous}\", itemName, entry.item);\n\t\tconst label = step.parallel.label ? resolveItemTemplate(step.parallel.label, itemName, entry.item) : undefined;\n\t\treturn {\n\t\t\t...step.parallel,\n\t\t\ttask,\n\t\t\t...(label !== undefined ? { label } : {}),\n\t\t};\n\t});\n\treturn { items, parallel };\n}\n\nexport function collectDynamicResults(\n\tstep: DynamicParallelStep,\n\titems: DynamicMaterializedItem[],\n\tresults: Array<Pick<SingleResult, \"agent\" | \"exitCode\" | \"error\" | \"timedOut\" | \"stopped\" | \"structuredOutput\" | \"artifactPaths\" | \"savedOutputPath\"> & { output?: string; finalOutput?: string }>,\n): DynamicCollectedResult[] {\n\treturn items.map((entry, index) => {\n\t\tconst result = results[index];\n\t\tconst text = result\n\t\t\t? (\"output\" in result && typeof result.output === \"string\" ? result.output : getSingleResultOutput(result as SingleResult))\n\t\t\t: \"\";\n\t\treturn {\n\t\t\tkey: entry.key,\n\t\t\tindex: entry.index,\n\t\t\titem: entry.item,\n\t\t\tagent: result?.agent ?? step.parallel.agent,\n\t\t\texitCode: result?.exitCode ?? null,\n\t\t\ttext,\n\t\t\t...(result?.structuredOutput !== undefined ? { structured: result.structuredOutput } : {}),\n\t\t\t...(result?.error ? { error: result.error } : {}),\n\t\t\t...(result?.timedOut ? { timedOut: true } : {}),\n\t\t\t...(result?.stopped ? { stopped: true } : {}),\n\t\t\t...(result?.savedOutputPath ? { outputPath: result.savedOutputPath } : {}),\n\t\t\t...(result?.artifactPaths ? { artifactPaths: result.artifactPaths } : {}),\n\t\t};\n\t});\n}\n\nexport function validateDynamicCollection(schema: JsonSchemaObject | undefined, value: DynamicCollectedResult[]): void {\n\tif (!schema) return;\n\tconst validation = validateStructuredOutputValue(schema, value);\n\tif (validation.status === \"invalid\") {\n\t\tthrow new DynamicFanoutError(`Collected output validation failed: ${validation.message}`);\n\t}\n}\n"]}
1
+ {"version":3,"file":"dynamic-fanout.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { DynamicParallelStep, ParallelTaskItem } from \"../../shared/settings.ts\";\nimport type { ArtifactPaths, ChainOutputMap, JsonSchemaObject, SingleResult } from \"../../shared/types.ts\";\nimport { getSingleResultOutput } from \"../../shared/utils.ts\";\nimport { validateStructuredOutputValue } from \"./structured-output.ts\";\n\nexport class DynamicFanoutError extends Error {}\n\nexport interface DynamicFanoutConfig {\n\tmaxItems?: number;\n\tallowRunnerFields?: boolean;\n}\n\nexport interface DynamicMaterializedItem {\n\tindex: number;\n\tkey: string;\n\tidKey: string;\n\titem: unknown;\n}\n\nexport interface DynamicCollectedResult {\n\tkey: string;\n\tindex: number;\n\titem: unknown;\n\tagent: string;\n\texitCode: number | null;\n\ttext: string;\n\tstructured?: unknown;\n\terror?: string;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\toutputPath?: string;\n\tartifactPaths?: ArtifactPaths;\n}\n\nexport interface DynamicMaterializedGroup {\n\titems: DynamicMaterializedItem[];\n\tparallel: ParallelTaskItem[];\n\tcollectedOnEmpty?: DynamicCollectedResult[];\n}\n\nconst SAFE_OUTPUT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ITEM_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ITEM_REF_PATTERN = /\\{([A-Za-z_][A-Za-z0-9_]*)(?:\\.([^{}]+))?\\}/g;\nconst RESERVED_TEMPLATE_NAMES = new Set([\"task\", \"previous\", \"chain_dir\", \"outputs\"]);\nconst DYNAMIC_STEP_KEYS = new Set([\"expand\", \"parallel\", \"collect\", \"concurrency\", \"failFast\", \"phase\", \"label\", \"acceptance\"]);\nconst RUNNER_DYNAMIC_STEP_KEYS = new Set([...DYNAMIC_STEP_KEYS, \"effectiveAcceptance\", \"acceptanceInput\", \"acceptanceRole\", \"sessionFiles\", \"thinkingOverrides\"]);\nconst DYNAMIC_EXPAND_KEYS = new Set([\"from\", \"item\", \"key\", \"maxItems\", \"onEmpty\"]);\nconst DYNAMIC_EXPAND_FROM_KEYS = new Set([\"output\", \"path\"]);\nconst DYNAMIC_PARALLEL_KEYS = new Set([\"agent\", \"task\", \"phase\", \"label\", \"outputSchema\", \"cwd\", \"output\", \"outputMode\", \"reads\", \"progress\", \"skill\", \"model\", \"toolBudget\", \"acceptance\"]);\nconst RUNNER_DYNAMIC_PARALLEL_KEYS = new Set([\n\t...DYNAMIC_PARALLEL_KEYS,\n\t\"outputName\", \"structured\", \"inheritProjectContext\", \"inheritSkills\", \"skills\", \"outputPath\", \"namespaceOutputPath\", \"maxSubagentDepth\", \"waitToolEnabled\",\n\t\"structuredOutput\", \"structuredOutputSchema\", \"tools\", \"extensions\", \"subagentOnlyExtensions\", \"mcpDirectTools\", \"completionGuard\", \"systemPrompt\",\n\t\"systemPromptMode\", \"thinking\", \"modelCandidates\", \"sessionFile\", \"effectiveAcceptance\", \"acceptanceInput\", \"acceptanceRole\", \"parentSessionId\", \"parentPermissionMode\",\n]);\nconst DYNAMIC_COLLECT_KEYS = new Set([\"as\", \"outputSchema\"]);\n\nexport function isSafeOutputName(name: string): boolean {\n\treturn SAFE_OUTPUT_NAME_PATTERN.test(name);\n}\n\nexport function assertJsonPointer(pointer: string, label: string): void {\n\tif (pointer === \"\") return;\n\tif (!pointer.startsWith(\"/\")) {\n\t\tthrow new DynamicFanoutError(`${label} must be a JSON Pointer starting with '/'.`);\n\t}\n\tfor (const segment of pointer.slice(1).split(\"/\")) {\n\t\tif (/~(?![01])/.test(segment)) {\n\t\t\tthrow new DynamicFanoutError(`${label} contains invalid JSON Pointer escape.`);\n\t\t}\n\t}\n}\n\nfunction decodePointerSegment(segment: string): string {\n\treturn segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n}\n\nexport function resolveJsonPointer(value: unknown, pointer: string, label: string): unknown {\n\tassertJsonPointer(pointer, label);\n\tif (pointer === \"\") return value;\n\tlet current = value;\n\tfor (const rawSegment of pointer.slice(1).split(\"/\")) {\n\t\tconst segment = decodePointerSegment(rawSegment);\n\t\tif (Array.isArray(current)) {\n\t\t\tif (!/^(0|[1-9][0-9]*)$/.test(segment)) {\n\t\t\t\tthrow new DynamicFanoutError(`${label} segment '${segment}' does not address an array index.`);\n\t\t\t}\n\t\t\tconst index = Number(segment);\n\t\t\tif (index >= current.length) throw new DynamicFanoutError(`${label} does not exist.`);\n\t\t\tcurrent = current[index];\n\t\t\tcontinue;\n\t\t}\n\t\tif (!current || typeof current !== \"object\") {\n\t\t\tthrow new DynamicFanoutError(`${label} does not exist.`);\n\t\t}\n\t\tconst record = current as Record<string, unknown>;\n\t\tif (!Object.prototype.hasOwnProperty.call(record, segment)) {\n\t\t\tthrow new DynamicFanoutError(`${label} does not exist.`);\n\t\t}\n\t\tcurrent = record[segment];\n\t}\n\treturn current;\n}\n\nfunction scalarToKey(value: unknown, label: string): string {\n\tif (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n\t\tconst key = String(value);\n\t\tif (!key.trim()) throw new DynamicFanoutError(`${label} resolved to an empty key.`);\n\t\tif (/[\\u0000-\\u001F\\u007F]/.test(key)) throw new DynamicFanoutError(`${label} resolved to an unsafe key.`);\n\t\tif (key.length > 200) throw new DynamicFanoutError(`${label} resolved to a key longer than 200 characters.`);\n\t\treturn key;\n\t}\n\tthrow new DynamicFanoutError(`${label} must resolve to a string, number, or boolean.`);\n}\n\nexport function normalizeItemKeyForId(key: string): string {\n\tconst normalized = key\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\")\n\t\t.slice(0, 80);\n\treturn normalized || \"item\";\n}\n\nfunction valueToTemplateText(value: unknown, reference: string): string {\n\tif (value === undefined) throw new DynamicFanoutError(`Unresolved item reference '${reference}'.`);\n\tif (typeof value === \"string\") return value;\n\tif (typeof value === \"number\" || typeof value === \"boolean\" || value === null) return String(value);\n\treturn JSON.stringify(value);\n}\n\nfunction resolveItemPath(item: unknown, pathText: string | undefined, reference: string): unknown {\n\tif (!pathText) return item;\n\tconst pointer = `/${pathText.split(\".\").map((segment) => segment.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")).join(\"/\")}`;\n\treturn resolveJsonPointer(item, pointer, reference);\n}\n\nexport function resolveItemTemplate(template: string, itemName: string, item: unknown): string {\n\treturn template.replace(ITEM_REF_PATTERN, (raw, name: string, pathText: string | undefined) => {\n\t\tif (name !== itemName) return raw;\n\t\tif (pathText !== undefined && (!pathText.trim() || pathText.includes(\"..\"))) {\n\t\t\tthrow new DynamicFanoutError(`Invalid item reference '${raw}'.`);\n\t\t}\n\t\treturn valueToTemplateText(resolveItemPath(item, pathText, raw), raw);\n\t});\n}\n\nfunction assertOnlyKeys(value: unknown, allowed: Set<string>, label: string): void {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw new DynamicFanoutError(`${label} must be an object.`);\n\tfor (const key of Object.keys(value)) {\n\t\tif (!allowed.has(key)) throw new DynamicFanoutError(`${label} does not support field '${key}'.`);\n\t}\n}\n\nexport function assertNoUnresolvedItemReferences(template: string, itemName: string, label: string): void {\n\tfor (const match of template.matchAll(/\\{([^{}]*)\\}/g)) {\n\t\tconst raw = match[0]!;\n\t\tconst reference = match[1]!;\n\t\tif (reference === itemName || reference.startsWith(`${itemName}.`)) {\n\t\t\tif (!ITEM_REF_PATTERN.test(raw) || reference === `${itemName}.` || reference.includes(\"..\")) {\n\t\t\t\tthrow new DynamicFanoutError(`Invalid item reference '${raw}' in ${label}.`);\n\t\t\t}\n\t\t\tITEM_REF_PATTERN.lastIndex = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tITEM_REF_PATTERN.lastIndex = 0;\n\t\tconst name = reference.match(/^[A-Za-z_][A-Za-z0-9_]*/)?.[0];\n\t\tif (name === itemName) throw new DynamicFanoutError(`Invalid item reference '${raw}' in ${label}.`);\n\t\tif (name && RESERVED_TEMPLATE_NAMES.has(name)) continue;\n\t\tif (name) throw new DynamicFanoutError(`Unsupported template reference '${raw}' in ${label}.`);\n\t}\n\tITEM_REF_PATTERN.lastIndex = 0;\n\tif (template.includes(`{${itemName}.}`) || new RegExp(`\\\\{${itemName}(?:\\\\.|$)[^}]*$`).test(template)) {\n\t\tthrow new DynamicFanoutError(`Invalid item reference in ${label}.`);\n\t}\n}\n\nexport function hasDynamicFanoutFields(step: unknown): boolean {\n\treturn !!step && typeof step === \"object\" && !Array.isArray(step)\n\t\t&& (Object.prototype.hasOwnProperty.call(step, \"expand\") || Object.prototype.hasOwnProperty.call(step, \"collect\"));\n}\n\nexport function validateDynamicStepShape(step: DynamicParallelStep, stepIndex: number, config: DynamicFanoutConfig = {}): void {\n\tconst prefix = `Dynamic chain step ${stepIndex + 1}`;\n\tassertOnlyKeys(step, config.allowRunnerFields ? RUNNER_DYNAMIC_STEP_KEYS : DYNAMIC_STEP_KEYS, prefix);\n\tif (!step.expand || !step.expand.from) throw new DynamicFanoutError(`${prefix} requires expand.from.`);\n\tassertOnlyKeys(step.expand, DYNAMIC_EXPAND_KEYS, `${prefix} expand`);\n\tassertOnlyKeys(step.expand.from, DYNAMIC_EXPAND_FROM_KEYS, `${prefix} expand.from`);\n\tif (!isSafeOutputName(step.expand.from.output)) throw new DynamicFanoutError(`${prefix} has invalid expand.from.output '${step.expand.from.output}'.`);\n\tassertJsonPointer(step.expand.from.path, `${prefix} expand.from.path`);\n\tif (step.expand.key !== undefined) assertJsonPointer(step.expand.key, `${prefix} expand.key`);\n\tconst itemName = step.expand.item ?? \"item\";\n\tif (!ITEM_NAME_PATTERN.test(itemName)) throw new DynamicFanoutError(`${prefix} has invalid expand.item '${itemName}'.`);\n\tif (step.expand.maxItems === undefined && config.maxItems === undefined) {\n\t\tthrow new DynamicFanoutError(`${prefix} requires expand.maxItems or config.chain.dynamicFanout.maxItems.`);\n\t}\n\tif (step.expand.maxItems !== undefined && (!Number.isInteger(step.expand.maxItems) || step.expand.maxItems < 0)) {\n\t\tthrow new DynamicFanoutError(`${prefix} expand.maxItems must be an integer >= 0.`);\n\t}\n\tif (config.maxItems !== undefined && (!Number.isInteger(config.maxItems) || config.maxItems < 0)) {\n\t\tthrow new DynamicFanoutError(\"config.chain.dynamicFanout.maxItems must be an integer >= 0.\");\n\t}\n\tif (!step.parallel || Array.isArray(step.parallel)) throw new DynamicFanoutError(`${prefix} requires a single parallel template object and cannot mix dynamic expand/collect with static parallel arrays.`);\n\tassertOnlyKeys(step.parallel, config.allowRunnerFields ? RUNNER_DYNAMIC_PARALLEL_KEYS : DYNAMIC_PARALLEL_KEYS, `${prefix} parallel`);\n\tif (\"expand\" in (step.parallel as object)) throw new DynamicFanoutError(`${prefix} does not support nested dynamic fanout.`);\n\tif (!step.parallel.agent) throw new DynamicFanoutError(`${prefix} parallel.agent is required.`);\n\tif (!step.collect?.as || !isSafeOutputName(step.collect.as)) throw new DynamicFanoutError(`${prefix} requires collect.as with a safe output name.`);\n\tassertOnlyKeys(step.collect, DYNAMIC_COLLECT_KEYS, `${prefix} collect`);\n\tfor (const [label, template] of [\n\t\t[\"parallel.task\", step.parallel.task],\n\t\t[\"parallel.label\", step.parallel.label],\n\t] as const) {\n\t\tif (template) assertNoUnresolvedItemReferences(template, itemName, `${prefix} ${label}`);\n\t}\n}\n\nexport function resolveDynamicFanoutItems(step: DynamicParallelStep, outputs: ChainOutputMap, stepIndex: number, config: DynamicFanoutConfig = {}): DynamicMaterializedItem[] {\n\tvalidateDynamicStepShape(step, stepIndex, config);\n\tconst sourceName = step.expand.from.output;\n\tconst source = outputs[sourceName];\n\tif (!source) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} references unknown output '${sourceName}'.`);\n\tif (source.structured === undefined) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} requires structured output '${sourceName}'.`);\n\tconst value = resolveJsonPointer(source.structured, step.expand.from.path, `Dynamic chain step ${stepIndex + 1} expand.from.path`);\n\tif (!Array.isArray(value)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} expand.from.path must resolve to an array.`);\n\tconst maxItems = step.expand.maxItems ?? config.maxItems;\n\tif (maxItems === undefined) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} requires an effective maxItems.`);\n\tif (value.length > maxItems) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} resolved ${value.length} items, exceeding maxItems ${maxItems}.`);\n\tconst seen = new Set<string>();\n\tconst seenIds = new Set<string>();\n\treturn value.map((item, index) => {\n\t\tconst key = step.expand.key === undefined\n\t\t\t? String(index)\n\t\t\t: scalarToKey(resolveJsonPointer(item, step.expand.key, `Dynamic chain step ${stepIndex + 1} expand.key`), `Dynamic chain step ${stepIndex + 1} expand.key`);\n\t\tif (seen.has(key)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} produced duplicate item key '${key}'.`);\n\t\tseen.add(key);\n\t\tconst idKey = normalizeItemKeyForId(key);\n\t\tif (seenIds.has(idKey)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} produced colliding item id '${idKey}'.`);\n\t\tseenIds.add(idKey);\n\t\treturn { index, key, idKey, item };\n\t});\n}\n\nexport function materializeDynamicParallelStep(step: DynamicParallelStep, outputs: ChainOutputMap, stepIndex: number, config: DynamicFanoutConfig = {}): DynamicMaterializedGroup {\n\tconst items = resolveDynamicFanoutItems(step, outputs, stepIndex, config);\n\tif (items.length === 0) {\n\t\tif ((step.expand.onEmpty ?? \"skip\") === \"fail\") {\n\t\t\tthrow new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} source array is empty.`);\n\t\t}\n\t\treturn { items, parallel: [], collectedOnEmpty: [] };\n\t}\n\tconst itemName = step.expand.item ?? \"item\";\n\tconst parallel = items.map((entry) => {\n\t\tconst task = resolveItemTemplate(step.parallel.task ?? \"{previous}\", itemName, entry.item);\n\t\tconst label = step.parallel.label ? resolveItemTemplate(step.parallel.label, itemName, entry.item) : undefined;\n\t\treturn {\n\t\t\t...step.parallel,\n\t\t\ttask,\n\t\t\t...(label !== undefined ? { label } : {}),\n\t\t};\n\t});\n\treturn { items, parallel };\n}\n\nexport function collectDynamicResults(\n\tstep: DynamicParallelStep,\n\titems: DynamicMaterializedItem[],\n\tresults: Array<Pick<SingleResult, \"agent\" | \"exitCode\" | \"error\" | \"timedOut\" | \"stopped\" | \"structuredOutput\" | \"artifactPaths\" | \"savedOutputPath\"> & { output?: string; finalOutput?: string }>,\n): DynamicCollectedResult[] {\n\treturn items.map((entry, index) => {\n\t\tconst result = results[index];\n\t\tconst text = result\n\t\t\t? (\"output\" in result && typeof result.output === \"string\" ? result.output : getSingleResultOutput(result as SingleResult))\n\t\t\t: \"\";\n\t\treturn {\n\t\t\tkey: entry.key,\n\t\t\tindex: entry.index,\n\t\t\titem: entry.item,\n\t\t\tagent: result?.agent ?? step.parallel.agent,\n\t\t\texitCode: result?.exitCode ?? null,\n\t\t\ttext,\n\t\t\t...(result?.structuredOutput !== undefined ? { structured: result.structuredOutput } : {}),\n\t\t\t...(result?.error ? { error: result.error } : {}),\n\t\t\t...(result?.timedOut ? { timedOut: true } : {}),\n\t\t\t...(result?.stopped ? { stopped: true } : {}),\n\t\t\t...(result?.savedOutputPath ? { outputPath: result.savedOutputPath } : {}),\n\t\t\t...(result?.artifactPaths ? { artifactPaths: result.artifactPaths } : {}),\n\t\t};\n\t});\n}\n\nexport function validateDynamicCollection(schema: JsonSchemaObject | undefined, value: DynamicCollectedResult[]): void {\n\tif (!schema) return;\n\tconst validation = validateStructuredOutputValue(schema, value);\n\tif (validation.status === \"invalid\") {\n\t\tthrow new DynamicFanoutError(`Collected output validation failed: ${validation.message}`);\n\t}\n}\n"]}
@@ -15,7 +15,7 @@ const RUNNER_DYNAMIC_PARALLEL_KEYS = new Set([
15
15
  ...DYNAMIC_PARALLEL_KEYS,
16
16
  "outputName", "structured", "inheritProjectContext", "inheritSkills", "skills", "outputPath", "namespaceOutputPath", "maxSubagentDepth", "waitToolEnabled",
17
17
  "structuredOutput", "structuredOutputSchema", "tools", "extensions", "subagentOnlyExtensions", "mcpDirectTools", "completionGuard", "systemPrompt",
18
- "systemPromptMode", "thinking", "modelCandidates", "sessionFile", "effectiveAcceptance", "acceptanceInput", "acceptanceRole", "parentSessionId",
18
+ "systemPromptMode", "thinking", "modelCandidates", "sessionFile", "effectiveAcceptance", "acceptanceInput", "acceptanceRole", "parentSessionId", "parentPermissionMode",
19
19
  ]);
20
20
  const DYNAMIC_COLLECT_KEYS = new Set(["as", "outputSchema"]);
21
21
  export function isSafeOutputName(name) {
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic-fanout.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { DynamicParallelStep, ParallelTaskItem } from \"../../shared/settings.ts\";\nimport type { ArtifactPaths, ChainOutputMap, JsonSchemaObject, SingleResult } from \"../../shared/types.ts\";\nimport { getSingleResultOutput } from \"../../shared/utils.ts\";\nimport { validateStructuredOutputValue } from \"./structured-output.ts\";\n\nexport class DynamicFanoutError extends Error {}\n\nexport interface DynamicFanoutConfig {\n\tmaxItems?: number;\n\tallowRunnerFields?: boolean;\n}\n\nexport interface DynamicMaterializedItem {\n\tindex: number;\n\tkey: string;\n\tidKey: string;\n\titem: unknown;\n}\n\nexport interface DynamicCollectedResult {\n\tkey: string;\n\tindex: number;\n\titem: unknown;\n\tagent: string;\n\texitCode: number | null;\n\ttext: string;\n\tstructured?: unknown;\n\terror?: string;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\toutputPath?: string;\n\tartifactPaths?: ArtifactPaths;\n}\n\nexport interface DynamicMaterializedGroup {\n\titems: DynamicMaterializedItem[];\n\tparallel: ParallelTaskItem[];\n\tcollectedOnEmpty?: DynamicCollectedResult[];\n}\n\nconst SAFE_OUTPUT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ITEM_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ITEM_REF_PATTERN = /\\{([A-Za-z_][A-Za-z0-9_]*)(?:\\.([^{}]+))?\\}/g;\nconst RESERVED_TEMPLATE_NAMES = new Set([\"task\", \"previous\", \"chain_dir\", \"outputs\"]);\nconst DYNAMIC_STEP_KEYS = new Set([\"expand\", \"parallel\", \"collect\", \"concurrency\", \"failFast\", \"phase\", \"label\", \"acceptance\"]);\nconst RUNNER_DYNAMIC_STEP_KEYS = new Set([...DYNAMIC_STEP_KEYS, \"effectiveAcceptance\", \"acceptanceInput\", \"acceptanceRole\", \"sessionFiles\", \"thinkingOverrides\"]);\nconst DYNAMIC_EXPAND_KEYS = new Set([\"from\", \"item\", \"key\", \"maxItems\", \"onEmpty\"]);\nconst DYNAMIC_EXPAND_FROM_KEYS = new Set([\"output\", \"path\"]);\nconst DYNAMIC_PARALLEL_KEYS = new Set([\"agent\", \"task\", \"phase\", \"label\", \"outputSchema\", \"cwd\", \"output\", \"outputMode\", \"reads\", \"progress\", \"skill\", \"model\", \"toolBudget\", \"acceptance\"]);\nconst RUNNER_DYNAMIC_PARALLEL_KEYS = new Set([\n\t...DYNAMIC_PARALLEL_KEYS,\n\t\"outputName\", \"structured\", \"inheritProjectContext\", \"inheritSkills\", \"skills\", \"outputPath\", \"namespaceOutputPath\", \"maxSubagentDepth\", \"waitToolEnabled\",\n\t\"structuredOutput\", \"structuredOutputSchema\", \"tools\", \"extensions\", \"subagentOnlyExtensions\", \"mcpDirectTools\", \"completionGuard\", \"systemPrompt\",\n\t\"systemPromptMode\", \"thinking\", \"modelCandidates\", \"sessionFile\", \"effectiveAcceptance\", \"acceptanceInput\", \"acceptanceRole\", \"parentSessionId\",\n]);\nconst DYNAMIC_COLLECT_KEYS = new Set([\"as\", \"outputSchema\"]);\n\nexport function isSafeOutputName(name: string): boolean {\n\treturn SAFE_OUTPUT_NAME_PATTERN.test(name);\n}\n\nexport function assertJsonPointer(pointer: string, label: string): void {\n\tif (pointer === \"\") return;\n\tif (!pointer.startsWith(\"/\")) {\n\t\tthrow new DynamicFanoutError(`${label} must be a JSON Pointer starting with '/'.`);\n\t}\n\tfor (const segment of pointer.slice(1).split(\"/\")) {\n\t\tif (/~(?![01])/.test(segment)) {\n\t\t\tthrow new DynamicFanoutError(`${label} contains invalid JSON Pointer escape.`);\n\t\t}\n\t}\n}\n\nfunction decodePointerSegment(segment: string): string {\n\treturn segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n}\n\nexport function resolveJsonPointer(value: unknown, pointer: string, label: string): unknown {\n\tassertJsonPointer(pointer, label);\n\tif (pointer === \"\") return value;\n\tlet current = value;\n\tfor (const rawSegment of pointer.slice(1).split(\"/\")) {\n\t\tconst segment = decodePointerSegment(rawSegment);\n\t\tif (Array.isArray(current)) {\n\t\t\tif (!/^(0|[1-9][0-9]*)$/.test(segment)) {\n\t\t\t\tthrow new DynamicFanoutError(`${label} segment '${segment}' does not address an array index.`);\n\t\t\t}\n\t\t\tconst index = Number(segment);\n\t\t\tif (index >= current.length) throw new DynamicFanoutError(`${label} does not exist.`);\n\t\t\tcurrent = current[index];\n\t\t\tcontinue;\n\t\t}\n\t\tif (!current || typeof current !== \"object\") {\n\t\t\tthrow new DynamicFanoutError(`${label} does not exist.`);\n\t\t}\n\t\tconst record = current as Record<string, unknown>;\n\t\tif (!Object.prototype.hasOwnProperty.call(record, segment)) {\n\t\t\tthrow new DynamicFanoutError(`${label} does not exist.`);\n\t\t}\n\t\tcurrent = record[segment];\n\t}\n\treturn current;\n}\n\nfunction scalarToKey(value: unknown, label: string): string {\n\tif (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n\t\tconst key = String(value);\n\t\tif (!key.trim()) throw new DynamicFanoutError(`${label} resolved to an empty key.`);\n\t\tif (/[\\u0000-\\u001F\\u007F]/.test(key)) throw new DynamicFanoutError(`${label} resolved to an unsafe key.`);\n\t\tif (key.length > 200) throw new DynamicFanoutError(`${label} resolved to a key longer than 200 characters.`);\n\t\treturn key;\n\t}\n\tthrow new DynamicFanoutError(`${label} must resolve to a string, number, or boolean.`);\n}\n\nexport function normalizeItemKeyForId(key: string): string {\n\tconst normalized = key\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\")\n\t\t.slice(0, 80);\n\treturn normalized || \"item\";\n}\n\nfunction valueToTemplateText(value: unknown, reference: string): string {\n\tif (value === undefined) throw new DynamicFanoutError(`Unresolved item reference '${reference}'.`);\n\tif (typeof value === \"string\") return value;\n\tif (typeof value === \"number\" || typeof value === \"boolean\" || value === null) return String(value);\n\treturn JSON.stringify(value);\n}\n\nfunction resolveItemPath(item: unknown, pathText: string | undefined, reference: string): unknown {\n\tif (!pathText) return item;\n\tconst pointer = `/${pathText.split(\".\").map((segment) => segment.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")).join(\"/\")}`;\n\treturn resolveJsonPointer(item, pointer, reference);\n}\n\nexport function resolveItemTemplate(template: string, itemName: string, item: unknown): string {\n\treturn template.replace(ITEM_REF_PATTERN, (raw, name: string, pathText: string | undefined) => {\n\t\tif (name !== itemName) return raw;\n\t\tif (pathText !== undefined && (!pathText.trim() || pathText.includes(\"..\"))) {\n\t\t\tthrow new DynamicFanoutError(`Invalid item reference '${raw}'.`);\n\t\t}\n\t\treturn valueToTemplateText(resolveItemPath(item, pathText, raw), raw);\n\t});\n}\n\nfunction assertOnlyKeys(value: unknown, allowed: Set<string>, label: string): void {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw new DynamicFanoutError(`${label} must be an object.`);\n\tfor (const key of Object.keys(value)) {\n\t\tif (!allowed.has(key)) throw new DynamicFanoutError(`${label} does not support field '${key}'.`);\n\t}\n}\n\nexport function assertNoUnresolvedItemReferences(template: string, itemName: string, label: string): void {\n\tfor (const match of template.matchAll(/\\{([^{}]*)\\}/g)) {\n\t\tconst raw = match[0]!;\n\t\tconst reference = match[1]!;\n\t\tif (reference === itemName || reference.startsWith(`${itemName}.`)) {\n\t\t\tif (!ITEM_REF_PATTERN.test(raw) || reference === `${itemName}.` || reference.includes(\"..\")) {\n\t\t\t\tthrow new DynamicFanoutError(`Invalid item reference '${raw}' in ${label}.`);\n\t\t\t}\n\t\t\tITEM_REF_PATTERN.lastIndex = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tITEM_REF_PATTERN.lastIndex = 0;\n\t\tconst name = reference.match(/^[A-Za-z_][A-Za-z0-9_]*/)?.[0];\n\t\tif (name === itemName) throw new DynamicFanoutError(`Invalid item reference '${raw}' in ${label}.`);\n\t\tif (name && RESERVED_TEMPLATE_NAMES.has(name)) continue;\n\t\tif (name) throw new DynamicFanoutError(`Unsupported template reference '${raw}' in ${label}.`);\n\t}\n\tITEM_REF_PATTERN.lastIndex = 0;\n\tif (template.includes(`{${itemName}.}`) || new RegExp(`\\\\{${itemName}(?:\\\\.|$)[^}]*$`).test(template)) {\n\t\tthrow new DynamicFanoutError(`Invalid item reference in ${label}.`);\n\t}\n}\n\nexport function hasDynamicFanoutFields(step: unknown): boolean {\n\treturn !!step && typeof step === \"object\" && !Array.isArray(step)\n\t\t&& (Object.prototype.hasOwnProperty.call(step, \"expand\") || Object.prototype.hasOwnProperty.call(step, \"collect\"));\n}\n\nexport function validateDynamicStepShape(step: DynamicParallelStep, stepIndex: number, config: DynamicFanoutConfig = {}): void {\n\tconst prefix = `Dynamic chain step ${stepIndex + 1}`;\n\tassertOnlyKeys(step, config.allowRunnerFields ? RUNNER_DYNAMIC_STEP_KEYS : DYNAMIC_STEP_KEYS, prefix);\n\tif (!step.expand || !step.expand.from) throw new DynamicFanoutError(`${prefix} requires expand.from.`);\n\tassertOnlyKeys(step.expand, DYNAMIC_EXPAND_KEYS, `${prefix} expand`);\n\tassertOnlyKeys(step.expand.from, DYNAMIC_EXPAND_FROM_KEYS, `${prefix} expand.from`);\n\tif (!isSafeOutputName(step.expand.from.output)) throw new DynamicFanoutError(`${prefix} has invalid expand.from.output '${step.expand.from.output}'.`);\n\tassertJsonPointer(step.expand.from.path, `${prefix} expand.from.path`);\n\tif (step.expand.key !== undefined) assertJsonPointer(step.expand.key, `${prefix} expand.key`);\n\tconst itemName = step.expand.item ?? \"item\";\n\tif (!ITEM_NAME_PATTERN.test(itemName)) throw new DynamicFanoutError(`${prefix} has invalid expand.item '${itemName}'.`);\n\tif (step.expand.maxItems === undefined && config.maxItems === undefined) {\n\t\tthrow new DynamicFanoutError(`${prefix} requires expand.maxItems or config.chain.dynamicFanout.maxItems.`);\n\t}\n\tif (step.expand.maxItems !== undefined && (!Number.isInteger(step.expand.maxItems) || step.expand.maxItems < 0)) {\n\t\tthrow new DynamicFanoutError(`${prefix} expand.maxItems must be an integer >= 0.`);\n\t}\n\tif (config.maxItems !== undefined && (!Number.isInteger(config.maxItems) || config.maxItems < 0)) {\n\t\tthrow new DynamicFanoutError(\"config.chain.dynamicFanout.maxItems must be an integer >= 0.\");\n\t}\n\tif (!step.parallel || Array.isArray(step.parallel)) throw new DynamicFanoutError(`${prefix} requires a single parallel template object and cannot mix dynamic expand/collect with static parallel arrays.`);\n\tassertOnlyKeys(step.parallel, config.allowRunnerFields ? RUNNER_DYNAMIC_PARALLEL_KEYS : DYNAMIC_PARALLEL_KEYS, `${prefix} parallel`);\n\tif (\"expand\" in (step.parallel as object)) throw new DynamicFanoutError(`${prefix} does not support nested dynamic fanout.`);\n\tif (!step.parallel.agent) throw new DynamicFanoutError(`${prefix} parallel.agent is required.`);\n\tif (!step.collect?.as || !isSafeOutputName(step.collect.as)) throw new DynamicFanoutError(`${prefix} requires collect.as with a safe output name.`);\n\tassertOnlyKeys(step.collect, DYNAMIC_COLLECT_KEYS, `${prefix} collect`);\n\tfor (const [label, template] of [\n\t\t[\"parallel.task\", step.parallel.task],\n\t\t[\"parallel.label\", step.parallel.label],\n\t] as const) {\n\t\tif (template) assertNoUnresolvedItemReferences(template, itemName, `${prefix} ${label}`);\n\t}\n}\n\nexport function resolveDynamicFanoutItems(step: DynamicParallelStep, outputs: ChainOutputMap, stepIndex: number, config: DynamicFanoutConfig = {}): DynamicMaterializedItem[] {\n\tvalidateDynamicStepShape(step, stepIndex, config);\n\tconst sourceName = step.expand.from.output;\n\tconst source = outputs[sourceName];\n\tif (!source) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} references unknown output '${sourceName}'.`);\n\tif (source.structured === undefined) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} requires structured output '${sourceName}'.`);\n\tconst value = resolveJsonPointer(source.structured, step.expand.from.path, `Dynamic chain step ${stepIndex + 1} expand.from.path`);\n\tif (!Array.isArray(value)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} expand.from.path must resolve to an array.`);\n\tconst maxItems = step.expand.maxItems ?? config.maxItems;\n\tif (maxItems === undefined) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} requires an effective maxItems.`);\n\tif (value.length > maxItems) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} resolved ${value.length} items, exceeding maxItems ${maxItems}.`);\n\tconst seen = new Set<string>();\n\tconst seenIds = new Set<string>();\n\treturn value.map((item, index) => {\n\t\tconst key = step.expand.key === undefined\n\t\t\t? String(index)\n\t\t\t: scalarToKey(resolveJsonPointer(item, step.expand.key, `Dynamic chain step ${stepIndex + 1} expand.key`), `Dynamic chain step ${stepIndex + 1} expand.key`);\n\t\tif (seen.has(key)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} produced duplicate item key '${key}'.`);\n\t\tseen.add(key);\n\t\tconst idKey = normalizeItemKeyForId(key);\n\t\tif (seenIds.has(idKey)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} produced colliding item id '${idKey}'.`);\n\t\tseenIds.add(idKey);\n\t\treturn { index, key, idKey, item };\n\t});\n}\n\nexport function materializeDynamicParallelStep(step: DynamicParallelStep, outputs: ChainOutputMap, stepIndex: number, config: DynamicFanoutConfig = {}): DynamicMaterializedGroup {\n\tconst items = resolveDynamicFanoutItems(step, outputs, stepIndex, config);\n\tif (items.length === 0) {\n\t\tif ((step.expand.onEmpty ?? \"skip\") === \"fail\") {\n\t\t\tthrow new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} source array is empty.`);\n\t\t}\n\t\treturn { items, parallel: [], collectedOnEmpty: [] };\n\t}\n\tconst itemName = step.expand.item ?? \"item\";\n\tconst parallel = items.map((entry) => {\n\t\tconst task = resolveItemTemplate(step.parallel.task ?? \"{previous}\", itemName, entry.item);\n\t\tconst label = step.parallel.label ? resolveItemTemplate(step.parallel.label, itemName, entry.item) : undefined;\n\t\treturn {\n\t\t\t...step.parallel,\n\t\t\ttask,\n\t\t\t...(label !== undefined ? { label } : {}),\n\t\t};\n\t});\n\treturn { items, parallel };\n}\n\nexport function collectDynamicResults(\n\tstep: DynamicParallelStep,\n\titems: DynamicMaterializedItem[],\n\tresults: Array<Pick<SingleResult, \"agent\" | \"exitCode\" | \"error\" | \"timedOut\" | \"stopped\" | \"structuredOutput\" | \"artifactPaths\" | \"savedOutputPath\"> & { output?: string; finalOutput?: string }>,\n): DynamicCollectedResult[] {\n\treturn items.map((entry, index) => {\n\t\tconst result = results[index];\n\t\tconst text = result\n\t\t\t? (\"output\" in result && typeof result.output === \"string\" ? result.output : getSingleResultOutput(result as SingleResult))\n\t\t\t: \"\";\n\t\treturn {\n\t\t\tkey: entry.key,\n\t\t\tindex: entry.index,\n\t\t\titem: entry.item,\n\t\t\tagent: result?.agent ?? step.parallel.agent,\n\t\t\texitCode: result?.exitCode ?? null,\n\t\t\ttext,\n\t\t\t...(result?.structuredOutput !== undefined ? { structured: result.structuredOutput } : {}),\n\t\t\t...(result?.error ? { error: result.error } : {}),\n\t\t\t...(result?.timedOut ? { timedOut: true } : {}),\n\t\t\t...(result?.stopped ? { stopped: true } : {}),\n\t\t\t...(result?.savedOutputPath ? { outputPath: result.savedOutputPath } : {}),\n\t\t\t...(result?.artifactPaths ? { artifactPaths: result.artifactPaths } : {}),\n\t\t};\n\t});\n}\n\nexport function validateDynamicCollection(schema: JsonSchemaObject | undefined, value: DynamicCollectedResult[]): void {\n\tif (!schema) return;\n\tconst validation = validateStructuredOutputValue(schema, value);\n\tif (validation.status === \"invalid\") {\n\t\tthrow new DynamicFanoutError(`Collected output validation failed: ${validation.message}`);\n\t}\n}\n"]}
1
+ {"version":3,"file":"dynamic-fanout.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { DynamicParallelStep, ParallelTaskItem } from \"../../shared/settings.ts\";\nimport type { ArtifactPaths, ChainOutputMap, JsonSchemaObject, SingleResult } from \"../../shared/types.ts\";\nimport { getSingleResultOutput } from \"../../shared/utils.ts\";\nimport { validateStructuredOutputValue } from \"./structured-output.ts\";\n\nexport class DynamicFanoutError extends Error {}\n\nexport interface DynamicFanoutConfig {\n\tmaxItems?: number;\n\tallowRunnerFields?: boolean;\n}\n\nexport interface DynamicMaterializedItem {\n\tindex: number;\n\tkey: string;\n\tidKey: string;\n\titem: unknown;\n}\n\nexport interface DynamicCollectedResult {\n\tkey: string;\n\tindex: number;\n\titem: unknown;\n\tagent: string;\n\texitCode: number | null;\n\ttext: string;\n\tstructured?: unknown;\n\terror?: string;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\toutputPath?: string;\n\tartifactPaths?: ArtifactPaths;\n}\n\nexport interface DynamicMaterializedGroup {\n\titems: DynamicMaterializedItem[];\n\tparallel: ParallelTaskItem[];\n\tcollectedOnEmpty?: DynamicCollectedResult[];\n}\n\nconst SAFE_OUTPUT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ITEM_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ITEM_REF_PATTERN = /\\{([A-Za-z_][A-Za-z0-9_]*)(?:\\.([^{}]+))?\\}/g;\nconst RESERVED_TEMPLATE_NAMES = new Set([\"task\", \"previous\", \"chain_dir\", \"outputs\"]);\nconst DYNAMIC_STEP_KEYS = new Set([\"expand\", \"parallel\", \"collect\", \"concurrency\", \"failFast\", \"phase\", \"label\", \"acceptance\"]);\nconst RUNNER_DYNAMIC_STEP_KEYS = new Set([...DYNAMIC_STEP_KEYS, \"effectiveAcceptance\", \"acceptanceInput\", \"acceptanceRole\", \"sessionFiles\", \"thinkingOverrides\"]);\nconst DYNAMIC_EXPAND_KEYS = new Set([\"from\", \"item\", \"key\", \"maxItems\", \"onEmpty\"]);\nconst DYNAMIC_EXPAND_FROM_KEYS = new Set([\"output\", \"path\"]);\nconst DYNAMIC_PARALLEL_KEYS = new Set([\"agent\", \"task\", \"phase\", \"label\", \"outputSchema\", \"cwd\", \"output\", \"outputMode\", \"reads\", \"progress\", \"skill\", \"model\", \"toolBudget\", \"acceptance\"]);\nconst RUNNER_DYNAMIC_PARALLEL_KEYS = new Set([\n\t...DYNAMIC_PARALLEL_KEYS,\n\t\"outputName\", \"structured\", \"inheritProjectContext\", \"inheritSkills\", \"skills\", \"outputPath\", \"namespaceOutputPath\", \"maxSubagentDepth\", \"waitToolEnabled\",\n\t\"structuredOutput\", \"structuredOutputSchema\", \"tools\", \"extensions\", \"subagentOnlyExtensions\", \"mcpDirectTools\", \"completionGuard\", \"systemPrompt\",\n\t\"systemPromptMode\", \"thinking\", \"modelCandidates\", \"sessionFile\", \"effectiveAcceptance\", \"acceptanceInput\", \"acceptanceRole\", \"parentSessionId\", \"parentPermissionMode\",\n]);\nconst DYNAMIC_COLLECT_KEYS = new Set([\"as\", \"outputSchema\"]);\n\nexport function isSafeOutputName(name: string): boolean {\n\treturn SAFE_OUTPUT_NAME_PATTERN.test(name);\n}\n\nexport function assertJsonPointer(pointer: string, label: string): void {\n\tif (pointer === \"\") return;\n\tif (!pointer.startsWith(\"/\")) {\n\t\tthrow new DynamicFanoutError(`${label} must be a JSON Pointer starting with '/'.`);\n\t}\n\tfor (const segment of pointer.slice(1).split(\"/\")) {\n\t\tif (/~(?![01])/.test(segment)) {\n\t\t\tthrow new DynamicFanoutError(`${label} contains invalid JSON Pointer escape.`);\n\t\t}\n\t}\n}\n\nfunction decodePointerSegment(segment: string): string {\n\treturn segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n}\n\nexport function resolveJsonPointer(value: unknown, pointer: string, label: string): unknown {\n\tassertJsonPointer(pointer, label);\n\tif (pointer === \"\") return value;\n\tlet current = value;\n\tfor (const rawSegment of pointer.slice(1).split(\"/\")) {\n\t\tconst segment = decodePointerSegment(rawSegment);\n\t\tif (Array.isArray(current)) {\n\t\t\tif (!/^(0|[1-9][0-9]*)$/.test(segment)) {\n\t\t\t\tthrow new DynamicFanoutError(`${label} segment '${segment}' does not address an array index.`);\n\t\t\t}\n\t\t\tconst index = Number(segment);\n\t\t\tif (index >= current.length) throw new DynamicFanoutError(`${label} does not exist.`);\n\t\t\tcurrent = current[index];\n\t\t\tcontinue;\n\t\t}\n\t\tif (!current || typeof current !== \"object\") {\n\t\t\tthrow new DynamicFanoutError(`${label} does not exist.`);\n\t\t}\n\t\tconst record = current as Record<string, unknown>;\n\t\tif (!Object.prototype.hasOwnProperty.call(record, segment)) {\n\t\t\tthrow new DynamicFanoutError(`${label} does not exist.`);\n\t\t}\n\t\tcurrent = record[segment];\n\t}\n\treturn current;\n}\n\nfunction scalarToKey(value: unknown, label: string): string {\n\tif (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n\t\tconst key = String(value);\n\t\tif (!key.trim()) throw new DynamicFanoutError(`${label} resolved to an empty key.`);\n\t\tif (/[\\u0000-\\u001F\\u007F]/.test(key)) throw new DynamicFanoutError(`${label} resolved to an unsafe key.`);\n\t\tif (key.length > 200) throw new DynamicFanoutError(`${label} resolved to a key longer than 200 characters.`);\n\t\treturn key;\n\t}\n\tthrow new DynamicFanoutError(`${label} must resolve to a string, number, or boolean.`);\n}\n\nexport function normalizeItemKeyForId(key: string): string {\n\tconst normalized = key\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\")\n\t\t.slice(0, 80);\n\treturn normalized || \"item\";\n}\n\nfunction valueToTemplateText(value: unknown, reference: string): string {\n\tif (value === undefined) throw new DynamicFanoutError(`Unresolved item reference '${reference}'.`);\n\tif (typeof value === \"string\") return value;\n\tif (typeof value === \"number\" || typeof value === \"boolean\" || value === null) return String(value);\n\treturn JSON.stringify(value);\n}\n\nfunction resolveItemPath(item: unknown, pathText: string | undefined, reference: string): unknown {\n\tif (!pathText) return item;\n\tconst pointer = `/${pathText.split(\".\").map((segment) => segment.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")).join(\"/\")}`;\n\treturn resolveJsonPointer(item, pointer, reference);\n}\n\nexport function resolveItemTemplate(template: string, itemName: string, item: unknown): string {\n\treturn template.replace(ITEM_REF_PATTERN, (raw, name: string, pathText: string | undefined) => {\n\t\tif (name !== itemName) return raw;\n\t\tif (pathText !== undefined && (!pathText.trim() || pathText.includes(\"..\"))) {\n\t\t\tthrow new DynamicFanoutError(`Invalid item reference '${raw}'.`);\n\t\t}\n\t\treturn valueToTemplateText(resolveItemPath(item, pathText, raw), raw);\n\t});\n}\n\nfunction assertOnlyKeys(value: unknown, allowed: Set<string>, label: string): void {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw new DynamicFanoutError(`${label} must be an object.`);\n\tfor (const key of Object.keys(value)) {\n\t\tif (!allowed.has(key)) throw new DynamicFanoutError(`${label} does not support field '${key}'.`);\n\t}\n}\n\nexport function assertNoUnresolvedItemReferences(template: string, itemName: string, label: string): void {\n\tfor (const match of template.matchAll(/\\{([^{}]*)\\}/g)) {\n\t\tconst raw = match[0]!;\n\t\tconst reference = match[1]!;\n\t\tif (reference === itemName || reference.startsWith(`${itemName}.`)) {\n\t\t\tif (!ITEM_REF_PATTERN.test(raw) || reference === `${itemName}.` || reference.includes(\"..\")) {\n\t\t\t\tthrow new DynamicFanoutError(`Invalid item reference '${raw}' in ${label}.`);\n\t\t\t}\n\t\t\tITEM_REF_PATTERN.lastIndex = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tITEM_REF_PATTERN.lastIndex = 0;\n\t\tconst name = reference.match(/^[A-Za-z_][A-Za-z0-9_]*/)?.[0];\n\t\tif (name === itemName) throw new DynamicFanoutError(`Invalid item reference '${raw}' in ${label}.`);\n\t\tif (name && RESERVED_TEMPLATE_NAMES.has(name)) continue;\n\t\tif (name) throw new DynamicFanoutError(`Unsupported template reference '${raw}' in ${label}.`);\n\t}\n\tITEM_REF_PATTERN.lastIndex = 0;\n\tif (template.includes(`{${itemName}.}`) || new RegExp(`\\\\{${itemName}(?:\\\\.|$)[^}]*$`).test(template)) {\n\t\tthrow new DynamicFanoutError(`Invalid item reference in ${label}.`);\n\t}\n}\n\nexport function hasDynamicFanoutFields(step: unknown): boolean {\n\treturn !!step && typeof step === \"object\" && !Array.isArray(step)\n\t\t&& (Object.prototype.hasOwnProperty.call(step, \"expand\") || Object.prototype.hasOwnProperty.call(step, \"collect\"));\n}\n\nexport function validateDynamicStepShape(step: DynamicParallelStep, stepIndex: number, config: DynamicFanoutConfig = {}): void {\n\tconst prefix = `Dynamic chain step ${stepIndex + 1}`;\n\tassertOnlyKeys(step, config.allowRunnerFields ? RUNNER_DYNAMIC_STEP_KEYS : DYNAMIC_STEP_KEYS, prefix);\n\tif (!step.expand || !step.expand.from) throw new DynamicFanoutError(`${prefix} requires expand.from.`);\n\tassertOnlyKeys(step.expand, DYNAMIC_EXPAND_KEYS, `${prefix} expand`);\n\tassertOnlyKeys(step.expand.from, DYNAMIC_EXPAND_FROM_KEYS, `${prefix} expand.from`);\n\tif (!isSafeOutputName(step.expand.from.output)) throw new DynamicFanoutError(`${prefix} has invalid expand.from.output '${step.expand.from.output}'.`);\n\tassertJsonPointer(step.expand.from.path, `${prefix} expand.from.path`);\n\tif (step.expand.key !== undefined) assertJsonPointer(step.expand.key, `${prefix} expand.key`);\n\tconst itemName = step.expand.item ?? \"item\";\n\tif (!ITEM_NAME_PATTERN.test(itemName)) throw new DynamicFanoutError(`${prefix} has invalid expand.item '${itemName}'.`);\n\tif (step.expand.maxItems === undefined && config.maxItems === undefined) {\n\t\tthrow new DynamicFanoutError(`${prefix} requires expand.maxItems or config.chain.dynamicFanout.maxItems.`);\n\t}\n\tif (step.expand.maxItems !== undefined && (!Number.isInteger(step.expand.maxItems) || step.expand.maxItems < 0)) {\n\t\tthrow new DynamicFanoutError(`${prefix} expand.maxItems must be an integer >= 0.`);\n\t}\n\tif (config.maxItems !== undefined && (!Number.isInteger(config.maxItems) || config.maxItems < 0)) {\n\t\tthrow new DynamicFanoutError(\"config.chain.dynamicFanout.maxItems must be an integer >= 0.\");\n\t}\n\tif (!step.parallel || Array.isArray(step.parallel)) throw new DynamicFanoutError(`${prefix} requires a single parallel template object and cannot mix dynamic expand/collect with static parallel arrays.`);\n\tassertOnlyKeys(step.parallel, config.allowRunnerFields ? RUNNER_DYNAMIC_PARALLEL_KEYS : DYNAMIC_PARALLEL_KEYS, `${prefix} parallel`);\n\tif (\"expand\" in (step.parallel as object)) throw new DynamicFanoutError(`${prefix} does not support nested dynamic fanout.`);\n\tif (!step.parallel.agent) throw new DynamicFanoutError(`${prefix} parallel.agent is required.`);\n\tif (!step.collect?.as || !isSafeOutputName(step.collect.as)) throw new DynamicFanoutError(`${prefix} requires collect.as with a safe output name.`);\n\tassertOnlyKeys(step.collect, DYNAMIC_COLLECT_KEYS, `${prefix} collect`);\n\tfor (const [label, template] of [\n\t\t[\"parallel.task\", step.parallel.task],\n\t\t[\"parallel.label\", step.parallel.label],\n\t] as const) {\n\t\tif (template) assertNoUnresolvedItemReferences(template, itemName, `${prefix} ${label}`);\n\t}\n}\n\nexport function resolveDynamicFanoutItems(step: DynamicParallelStep, outputs: ChainOutputMap, stepIndex: number, config: DynamicFanoutConfig = {}): DynamicMaterializedItem[] {\n\tvalidateDynamicStepShape(step, stepIndex, config);\n\tconst sourceName = step.expand.from.output;\n\tconst source = outputs[sourceName];\n\tif (!source) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} references unknown output '${sourceName}'.`);\n\tif (source.structured === undefined) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} requires structured output '${sourceName}'.`);\n\tconst value = resolveJsonPointer(source.structured, step.expand.from.path, `Dynamic chain step ${stepIndex + 1} expand.from.path`);\n\tif (!Array.isArray(value)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} expand.from.path must resolve to an array.`);\n\tconst maxItems = step.expand.maxItems ?? config.maxItems;\n\tif (maxItems === undefined) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} requires an effective maxItems.`);\n\tif (value.length > maxItems) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} resolved ${value.length} items, exceeding maxItems ${maxItems}.`);\n\tconst seen = new Set<string>();\n\tconst seenIds = new Set<string>();\n\treturn value.map((item, index) => {\n\t\tconst key = step.expand.key === undefined\n\t\t\t? String(index)\n\t\t\t: scalarToKey(resolveJsonPointer(item, step.expand.key, `Dynamic chain step ${stepIndex + 1} expand.key`), `Dynamic chain step ${stepIndex + 1} expand.key`);\n\t\tif (seen.has(key)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} produced duplicate item key '${key}'.`);\n\t\tseen.add(key);\n\t\tconst idKey = normalizeItemKeyForId(key);\n\t\tif (seenIds.has(idKey)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} produced colliding item id '${idKey}'.`);\n\t\tseenIds.add(idKey);\n\t\treturn { index, key, idKey, item };\n\t});\n}\n\nexport function materializeDynamicParallelStep(step: DynamicParallelStep, outputs: ChainOutputMap, stepIndex: number, config: DynamicFanoutConfig = {}): DynamicMaterializedGroup {\n\tconst items = resolveDynamicFanoutItems(step, outputs, stepIndex, config);\n\tif (items.length === 0) {\n\t\tif ((step.expand.onEmpty ?? \"skip\") === \"fail\") {\n\t\t\tthrow new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} source array is empty.`);\n\t\t}\n\t\treturn { items, parallel: [], collectedOnEmpty: [] };\n\t}\n\tconst itemName = step.expand.item ?? \"item\";\n\tconst parallel = items.map((entry) => {\n\t\tconst task = resolveItemTemplate(step.parallel.task ?? \"{previous}\", itemName, entry.item);\n\t\tconst label = step.parallel.label ? resolveItemTemplate(step.parallel.label, itemName, entry.item) : undefined;\n\t\treturn {\n\t\t\t...step.parallel,\n\t\t\ttask,\n\t\t\t...(label !== undefined ? { label } : {}),\n\t\t};\n\t});\n\treturn { items, parallel };\n}\n\nexport function collectDynamicResults(\n\tstep: DynamicParallelStep,\n\titems: DynamicMaterializedItem[],\n\tresults: Array<Pick<SingleResult, \"agent\" | \"exitCode\" | \"error\" | \"timedOut\" | \"stopped\" | \"structuredOutput\" | \"artifactPaths\" | \"savedOutputPath\"> & { output?: string; finalOutput?: string }>,\n): DynamicCollectedResult[] {\n\treturn items.map((entry, index) => {\n\t\tconst result = results[index];\n\t\tconst text = result\n\t\t\t? (\"output\" in result && typeof result.output === \"string\" ? result.output : getSingleResultOutput(result as SingleResult))\n\t\t\t: \"\";\n\t\treturn {\n\t\t\tkey: entry.key,\n\t\t\tindex: entry.index,\n\t\t\titem: entry.item,\n\t\t\tagent: result?.agent ?? step.parallel.agent,\n\t\t\texitCode: result?.exitCode ?? null,\n\t\t\ttext,\n\t\t\t...(result?.structuredOutput !== undefined ? { structured: result.structuredOutput } : {}),\n\t\t\t...(result?.error ? { error: result.error } : {}),\n\t\t\t...(result?.timedOut ? { timedOut: true } : {}),\n\t\t\t...(result?.stopped ? { stopped: true } : {}),\n\t\t\t...(result?.savedOutputPath ? { outputPath: result.savedOutputPath } : {}),\n\t\t\t...(result?.artifactPaths ? { artifactPaths: result.artifactPaths } : {}),\n\t\t};\n\t});\n}\n\nexport function validateDynamicCollection(schema: JsonSchemaObject | undefined, value: DynamicCollectedResult[]): void {\n\tif (!schema) return;\n\tconst validation = validateStructuredOutputValue(schema, value);\n\tif (validation.status === \"invalid\") {\n\t\tthrow new DynamicFanoutError(`Collected output validation failed: ${validation.message}`);\n\t}\n}\n"]}
@@ -1,6 +1,8 @@
1
1
  export interface RunnerSubagentStep {
2
2
  /** Session id of the direct parent session for permission-system ask forwarding. */
3
3
  parentSessionId?: string;
4
+ /** Live parent permission mode snapshotted at spawn. */
5
+ parentPermissionMode?: string;
4
6
  agent: string;
5
7
  task: string;
6
8
  importAsyncRoot?: {
@@ -1 +1 @@
1
- {"version":3,"file":"parallel-utils.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nexport interface RunnerSubagentStep {\n\t/** Session id of the direct parent session for permission-system ask forwarding. */\n\tparentSessionId?: string;\n\tagent: string;\n\ttask: string;\n\timportAsyncRoot?: {\n\t\trunId: string;\n\t\tasyncDir: string;\n\t\tresultPath: string;\n\t\tindex: number;\n\t};\n\tphase?: string;\n\tlabel?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tcwd?: string;\n\tmodel?: string;\n\tthinking?: string;\n\tmodelCandidates?: string[];\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tmcpDirectTools?: string[];\n\tcompletionGuard?: boolean;\n\tsystemPrompt?: string | null;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tskills?: string[];\n\toutputPath?: string;\n\t/** Defer the authoritative output instruction until a dynamic fanout item is materialized. */\n\tnamespaceOutputPath?: boolean;\n\toutputMode?: \"inline\" | \"file-only\";\n\tsessionFile?: string;\n\tmaxSubagentDepth?: number;\n\twaitToolEnabled?: boolean;\n\tstructuredOutput?: {\n\t\tschema: import(\"../../shared/types.ts\").JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\tstructuredOutputSchema?: import(\"../../shared/types.ts\").JsonSchemaObject;\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n\ttoolBudget?: import(\"../../shared/types.ts\").ResolvedToolBudget;\n}\n\nexport interface ParallelStepGroup {\n\tparallel: RunnerSubagentStep[];\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tworktree?: boolean;\n}\n\nexport interface DynamicRunnerGroup {\n\texpand: import(\"../../shared/settings.ts\").DynamicExpandSpec;\n\tparallel: RunnerSubagentStep;\n\tcollect: import(\"../../shared/settings.ts\").DynamicCollectSpec;\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tphase?: string;\n\tlabel?: string;\n\tsessionFiles?: (string | undefined)[];\n\tthinkingOverrides?: (string | undefined)[];\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n}\n\nexport type RunnerStep = RunnerSubagentStep | ParallelStepGroup | DynamicRunnerGroup;\n\nexport function isParallelGroup(step: RunnerStep): step is ParallelStepGroup {\n\treturn \"parallel\" in step && Array.isArray(step.parallel);\n}\n\nexport function isDynamicRunnerGroup(step: RunnerStep): step is DynamicRunnerGroup {\n\treturn \"expand\" in step && \"collect\" in step && \"parallel\" in step && !Array.isArray((step as { parallel?: unknown }).parallel);\n}\n\nexport function flattenSteps(steps: RunnerStep[]): RunnerSubagentStep[] {\n\tconst flat: RunnerSubagentStep[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tfor (const task of step.parallel) flat.push(task);\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tflat.push(step);\n\t\t}\n\t}\n\treturn flat;\n}\n\nexport const DEFAULT_GLOBAL_CONCURRENCY_LIMIT = 20;\n\n// lunr: stagger parallel cold starts so the first child's response begins\n// (creating the Anthropic cache entry) before siblings fire identical\n// system prompts. Sequential mode (limit=1) is untouched.\nconst PARALLEL_COLD_START_STAGGER_MS = 1000;\n\n/**\n * A promise-based semaphore for limiting concurrent access across multiple\n * mapConcurrent calls within a single run. Enforces a global cap on the total\n * number of subagent tasks executing simultaneously, regardless of each step's\n * per-step concurrency limit.\n */\nexport class Semaphore {\n\tprivate available: number;\n\tprivate readonly queue: Array<() => void> = [];\n\n\tconstructor(limit: number) {\n\t\tthis.available = Math.max(1, Math.floor(limit) || 1);\n\t}\n\n\tacquire(): Promise<void> {\n\t\tif (this.available > 0) {\n\t\t\tthis.available--;\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.queue.push(resolve);\n\t\t});\n\t}\n\n\trelease(): void {\n\t\tconst next = this.queue.shift();\n\t\tif (next) {\n\t\t\tnext();\n\t\t} else {\n\t\t\tthis.available++;\n\t\t}\n\t}\n}\n\nexport async function mapConcurrent<T, R>(\n\titems: T[],\n\tlimit: number,\n\tfn: (item: T, i: number) => Promise<R>,\n\tglobalSemaphore?: Semaphore,\n): Promise<R[]> {\n\tconst safeLimit = Math.max(1, Math.floor(limit) || 1);\n\tconst results: R[] = new Array(items.length);\n\tlet next = 0;\n\n\tasync function worker(_workerIndex: number): Promise<void> {\n\t\twhile (next < items.length) {\n\t\t\tconst i = next++;\n\t\t\tif (safeLimit > 1 && i > 0 && PARALLEL_COLD_START_STAGGER_MS > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\tsetTimeout(resolve, PARALLEL_COLD_START_STAGGER_MS * i);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (globalSemaphore) {\n\t\t\t\tawait globalSemaphore.acquire();\n\t\t\t\ttry {\n\t\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t\t} finally {\n\t\t\t\t\tglobalSemaphore.release();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t}\n\t\t}\n\t}\n\n\tawait Promise.all(\n\t\tArray.from({ length: Math.min(safeLimit, items.length) }, (_, wi) => worker(wi)),\n\t);\n\treturn results;\n}\n\nexport interface ParallelTaskResult {\n\tagent: string;\n\ttaskIndex?: number;\n\toutput: string;\n\texitCode: number | null;\n\terror?: string;\n\ttimedOut?: boolean;\n\tmodel?: string;\n\tattemptedModels?: string[];\n\toutputTargetPath?: string;\n\toutputTargetExists?: boolean;\n}\n\nexport function aggregateParallelOutputs(\n\tresults: ParallelTaskResult[],\n\theaderFormat: (index: number, agent: string) => string = (i, agent) =>\n\t\t`=== Parallel Task ${i + 1} (${agent}) ===`,\n): string {\n\treturn results\n\t\t.map((r, i) => {\n\t\t\tconst header = headerFormat(r.taskIndex ?? i, r.agent);\n\t\t\tconst hasOutput = Boolean(r.output?.trim());\n\t\t\tconst status =\n\t\t\t\tr.timedOut\n\t\t\t\t\t? `TIMED OUT${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t: r.exitCode === -1\n\t\t\t\t\t? \"SKIPPED\"\n\t\t\t\t\t: r.exitCode !== 0 && r.exitCode !== null\n\t\t\t\t\t\t? `FAILED (exit code ${r.exitCode})${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t\t: r.error\n\t\t\t\t\t\t\t? `WARNING: ${r.error}`\n\t\t\t\t\t\t\t: !hasOutput && r.outputTargetPath && r.outputTargetExists === false\n\t\t\t\t\t\t\t\t? `EMPTY OUTPUT (expected output file missing: ${r.outputTargetPath})`\n\t\t\t\t\t\t\t\t: !hasOutput && !r.outputTargetPath\n\t\t\t\t\t\t\t\t\t? \"EMPTY OUTPUT (no textual response returned)\"\n\t\t\t\t\t\t\t: \"\";\n\t\t\tconst body = status ? (hasOutput ? `${status}\\n${r.output}` : status) : r.output;\n\t\t\treturn `${header}\\n${body}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nexport const MAX_PARALLEL_CONCURRENCY = 4;\n"]}
1
+ {"version":3,"file":"parallel-utils.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nexport interface RunnerSubagentStep {\n\t/** Session id of the direct parent session for permission-system ask forwarding. */\n\tparentSessionId?: string;\n\t/** Live parent permission mode snapshotted at spawn. */\n\tparentPermissionMode?: string;\n\tagent: string;\n\ttask: string;\n\timportAsyncRoot?: {\n\t\trunId: string;\n\t\tasyncDir: string;\n\t\tresultPath: string;\n\t\tindex: number;\n\t};\n\tphase?: string;\n\tlabel?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tcwd?: string;\n\tmodel?: string;\n\tthinking?: string;\n\tmodelCandidates?: string[];\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tmcpDirectTools?: string[];\n\tcompletionGuard?: boolean;\n\tsystemPrompt?: string | null;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tskills?: string[];\n\toutputPath?: string;\n\t/** Defer the authoritative output instruction until a dynamic fanout item is materialized. */\n\tnamespaceOutputPath?: boolean;\n\toutputMode?: \"inline\" | \"file-only\";\n\tsessionFile?: string;\n\tmaxSubagentDepth?: number;\n\twaitToolEnabled?: boolean;\n\tstructuredOutput?: {\n\t\tschema: import(\"../../shared/types.ts\").JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\tstructuredOutputSchema?: import(\"../../shared/types.ts\").JsonSchemaObject;\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n\ttoolBudget?: import(\"../../shared/types.ts\").ResolvedToolBudget;\n}\n\nexport interface ParallelStepGroup {\n\tparallel: RunnerSubagentStep[];\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tworktree?: boolean;\n}\n\nexport interface DynamicRunnerGroup {\n\texpand: import(\"../../shared/settings.ts\").DynamicExpandSpec;\n\tparallel: RunnerSubagentStep;\n\tcollect: import(\"../../shared/settings.ts\").DynamicCollectSpec;\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tphase?: string;\n\tlabel?: string;\n\tsessionFiles?: (string | undefined)[];\n\tthinkingOverrides?: (string | undefined)[];\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n}\n\nexport type RunnerStep = RunnerSubagentStep | ParallelStepGroup | DynamicRunnerGroup;\n\nexport function isParallelGroup(step: RunnerStep): step is ParallelStepGroup {\n\treturn \"parallel\" in step && Array.isArray(step.parallel);\n}\n\nexport function isDynamicRunnerGroup(step: RunnerStep): step is DynamicRunnerGroup {\n\treturn \"expand\" in step && \"collect\" in step && \"parallel\" in step && !Array.isArray((step as { parallel?: unknown }).parallel);\n}\n\nexport function flattenSteps(steps: RunnerStep[]): RunnerSubagentStep[] {\n\tconst flat: RunnerSubagentStep[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tfor (const task of step.parallel) flat.push(task);\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tflat.push(step);\n\t\t}\n\t}\n\treturn flat;\n}\n\nexport const DEFAULT_GLOBAL_CONCURRENCY_LIMIT = 20;\n\n// lunr: stagger parallel cold starts so the first child's response begins\n// (creating the Anthropic cache entry) before siblings fire identical\n// system prompts. Sequential mode (limit=1) is untouched.\nconst PARALLEL_COLD_START_STAGGER_MS = 1000;\n\n/**\n * A promise-based semaphore for limiting concurrent access across multiple\n * mapConcurrent calls within a single run. Enforces a global cap on the total\n * number of subagent tasks executing simultaneously, regardless of each step's\n * per-step concurrency limit.\n */\nexport class Semaphore {\n\tprivate available: number;\n\tprivate readonly queue: Array<() => void> = [];\n\n\tconstructor(limit: number) {\n\t\tthis.available = Math.max(1, Math.floor(limit) || 1);\n\t}\n\n\tacquire(): Promise<void> {\n\t\tif (this.available > 0) {\n\t\t\tthis.available--;\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.queue.push(resolve);\n\t\t});\n\t}\n\n\trelease(): void {\n\t\tconst next = this.queue.shift();\n\t\tif (next) {\n\t\t\tnext();\n\t\t} else {\n\t\t\tthis.available++;\n\t\t}\n\t}\n}\n\nexport async function mapConcurrent<T, R>(\n\titems: T[],\n\tlimit: number,\n\tfn: (item: T, i: number) => Promise<R>,\n\tglobalSemaphore?: Semaphore,\n): Promise<R[]> {\n\tconst safeLimit = Math.max(1, Math.floor(limit) || 1);\n\tconst results: R[] = new Array(items.length);\n\tlet next = 0;\n\n\tasync function worker(_workerIndex: number): Promise<void> {\n\t\twhile (next < items.length) {\n\t\t\tconst i = next++;\n\t\t\tif (safeLimit > 1 && i > 0 && PARALLEL_COLD_START_STAGGER_MS > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\tsetTimeout(resolve, PARALLEL_COLD_START_STAGGER_MS * i);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (globalSemaphore) {\n\t\t\t\tawait globalSemaphore.acquire();\n\t\t\t\ttry {\n\t\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t\t} finally {\n\t\t\t\t\tglobalSemaphore.release();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t}\n\t\t}\n\t}\n\n\tawait Promise.all(\n\t\tArray.from({ length: Math.min(safeLimit, items.length) }, (_, wi) => worker(wi)),\n\t);\n\treturn results;\n}\n\nexport interface ParallelTaskResult {\n\tagent: string;\n\ttaskIndex?: number;\n\toutput: string;\n\texitCode: number | null;\n\terror?: string;\n\ttimedOut?: boolean;\n\tmodel?: string;\n\tattemptedModels?: string[];\n\toutputTargetPath?: string;\n\toutputTargetExists?: boolean;\n}\n\nexport function aggregateParallelOutputs(\n\tresults: ParallelTaskResult[],\n\theaderFormat: (index: number, agent: string) => string = (i, agent) =>\n\t\t`=== Parallel Task ${i + 1} (${agent}) ===`,\n): string {\n\treturn results\n\t\t.map((r, i) => {\n\t\t\tconst header = headerFormat(r.taskIndex ?? i, r.agent);\n\t\t\tconst hasOutput = Boolean(r.output?.trim());\n\t\t\tconst status =\n\t\t\t\tr.timedOut\n\t\t\t\t\t? `TIMED OUT${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t: r.exitCode === -1\n\t\t\t\t\t? \"SKIPPED\"\n\t\t\t\t\t: r.exitCode !== 0 && r.exitCode !== null\n\t\t\t\t\t\t? `FAILED (exit code ${r.exitCode})${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t\t: r.error\n\t\t\t\t\t\t\t? `WARNING: ${r.error}`\n\t\t\t\t\t\t\t: !hasOutput && r.outputTargetPath && r.outputTargetExists === false\n\t\t\t\t\t\t\t\t? `EMPTY OUTPUT (expected output file missing: ${r.outputTargetPath})`\n\t\t\t\t\t\t\t\t: !hasOutput && !r.outputTargetPath\n\t\t\t\t\t\t\t\t\t? \"EMPTY OUTPUT (no textual response returned)\"\n\t\t\t\t\t\t\t: \"\";\n\t\t\tconst body = status ? (hasOutput ? `${status}\\n${r.output}` : status) : r.output;\n\t\t\treturn `${header}\\n${body}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nexport const MAX_PARALLEL_CONCURRENCY = 4;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"parallel-utils.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nexport interface RunnerSubagentStep {\n\t/** Session id of the direct parent session for permission-system ask forwarding. */\n\tparentSessionId?: string;\n\tagent: string;\n\ttask: string;\n\timportAsyncRoot?: {\n\t\trunId: string;\n\t\tasyncDir: string;\n\t\tresultPath: string;\n\t\tindex: number;\n\t};\n\tphase?: string;\n\tlabel?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tcwd?: string;\n\tmodel?: string;\n\tthinking?: string;\n\tmodelCandidates?: string[];\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tmcpDirectTools?: string[];\n\tcompletionGuard?: boolean;\n\tsystemPrompt?: string | null;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tskills?: string[];\n\toutputPath?: string;\n\t/** Defer the authoritative output instruction until a dynamic fanout item is materialized. */\n\tnamespaceOutputPath?: boolean;\n\toutputMode?: \"inline\" | \"file-only\";\n\tsessionFile?: string;\n\tmaxSubagentDepth?: number;\n\twaitToolEnabled?: boolean;\n\tstructuredOutput?: {\n\t\tschema: import(\"../../shared/types.ts\").JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\tstructuredOutputSchema?: import(\"../../shared/types.ts\").JsonSchemaObject;\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n\ttoolBudget?: import(\"../../shared/types.ts\").ResolvedToolBudget;\n}\n\nexport interface ParallelStepGroup {\n\tparallel: RunnerSubagentStep[];\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tworktree?: boolean;\n}\n\nexport interface DynamicRunnerGroup {\n\texpand: import(\"../../shared/settings.ts\").DynamicExpandSpec;\n\tparallel: RunnerSubagentStep;\n\tcollect: import(\"../../shared/settings.ts\").DynamicCollectSpec;\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tphase?: string;\n\tlabel?: string;\n\tsessionFiles?: (string | undefined)[];\n\tthinkingOverrides?: (string | undefined)[];\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n}\n\nexport type RunnerStep = RunnerSubagentStep | ParallelStepGroup | DynamicRunnerGroup;\n\nexport function isParallelGroup(step: RunnerStep): step is ParallelStepGroup {\n\treturn \"parallel\" in step && Array.isArray(step.parallel);\n}\n\nexport function isDynamicRunnerGroup(step: RunnerStep): step is DynamicRunnerGroup {\n\treturn \"expand\" in step && \"collect\" in step && \"parallel\" in step && !Array.isArray((step as { parallel?: unknown }).parallel);\n}\n\nexport function flattenSteps(steps: RunnerStep[]): RunnerSubagentStep[] {\n\tconst flat: RunnerSubagentStep[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tfor (const task of step.parallel) flat.push(task);\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tflat.push(step);\n\t\t}\n\t}\n\treturn flat;\n}\n\nexport const DEFAULT_GLOBAL_CONCURRENCY_LIMIT = 20;\n\n// lunr: stagger parallel cold starts so the first child's response begins\n// (creating the Anthropic cache entry) before siblings fire identical\n// system prompts. Sequential mode (limit=1) is untouched.\nconst PARALLEL_COLD_START_STAGGER_MS = 1000;\n\n/**\n * A promise-based semaphore for limiting concurrent access across multiple\n * mapConcurrent calls within a single run. Enforces a global cap on the total\n * number of subagent tasks executing simultaneously, regardless of each step's\n * per-step concurrency limit.\n */\nexport class Semaphore {\n\tprivate available: number;\n\tprivate readonly queue: Array<() => void> = [];\n\n\tconstructor(limit: number) {\n\t\tthis.available = Math.max(1, Math.floor(limit) || 1);\n\t}\n\n\tacquire(): Promise<void> {\n\t\tif (this.available > 0) {\n\t\t\tthis.available--;\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.queue.push(resolve);\n\t\t});\n\t}\n\n\trelease(): void {\n\t\tconst next = this.queue.shift();\n\t\tif (next) {\n\t\t\tnext();\n\t\t} else {\n\t\t\tthis.available++;\n\t\t}\n\t}\n}\n\nexport async function mapConcurrent<T, R>(\n\titems: T[],\n\tlimit: number,\n\tfn: (item: T, i: number) => Promise<R>,\n\tglobalSemaphore?: Semaphore,\n): Promise<R[]> {\n\tconst safeLimit = Math.max(1, Math.floor(limit) || 1);\n\tconst results: R[] = new Array(items.length);\n\tlet next = 0;\n\n\tasync function worker(_workerIndex: number): Promise<void> {\n\t\twhile (next < items.length) {\n\t\t\tconst i = next++;\n\t\t\tif (safeLimit > 1 && i > 0 && PARALLEL_COLD_START_STAGGER_MS > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\tsetTimeout(resolve, PARALLEL_COLD_START_STAGGER_MS * i);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (globalSemaphore) {\n\t\t\t\tawait globalSemaphore.acquire();\n\t\t\t\ttry {\n\t\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t\t} finally {\n\t\t\t\t\tglobalSemaphore.release();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t}\n\t\t}\n\t}\n\n\tawait Promise.all(\n\t\tArray.from({ length: Math.min(safeLimit, items.length) }, (_, wi) => worker(wi)),\n\t);\n\treturn results;\n}\n\nexport interface ParallelTaskResult {\n\tagent: string;\n\ttaskIndex?: number;\n\toutput: string;\n\texitCode: number | null;\n\terror?: string;\n\ttimedOut?: boolean;\n\tmodel?: string;\n\tattemptedModels?: string[];\n\toutputTargetPath?: string;\n\toutputTargetExists?: boolean;\n}\n\nexport function aggregateParallelOutputs(\n\tresults: ParallelTaskResult[],\n\theaderFormat: (index: number, agent: string) => string = (i, agent) =>\n\t\t`=== Parallel Task ${i + 1} (${agent}) ===`,\n): string {\n\treturn results\n\t\t.map((r, i) => {\n\t\t\tconst header = headerFormat(r.taskIndex ?? i, r.agent);\n\t\t\tconst hasOutput = Boolean(r.output?.trim());\n\t\t\tconst status =\n\t\t\t\tr.timedOut\n\t\t\t\t\t? `TIMED OUT${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t: r.exitCode === -1\n\t\t\t\t\t? \"SKIPPED\"\n\t\t\t\t\t: r.exitCode !== 0 && r.exitCode !== null\n\t\t\t\t\t\t? `FAILED (exit code ${r.exitCode})${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t\t: r.error\n\t\t\t\t\t\t\t? `WARNING: ${r.error}`\n\t\t\t\t\t\t\t: !hasOutput && r.outputTargetPath && r.outputTargetExists === false\n\t\t\t\t\t\t\t\t? `EMPTY OUTPUT (expected output file missing: ${r.outputTargetPath})`\n\t\t\t\t\t\t\t\t: !hasOutput && !r.outputTargetPath\n\t\t\t\t\t\t\t\t\t? \"EMPTY OUTPUT (no textual response returned)\"\n\t\t\t\t\t\t\t: \"\";\n\t\t\tconst body = status ? (hasOutput ? `${status}\\n${r.output}` : status) : r.output;\n\t\t\treturn `${header}\\n${body}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nexport const MAX_PARALLEL_CONCURRENCY = 4;\n"]}
1
+ {"version":3,"file":"parallel-utils.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.ts"],"names":[],"mappings":"AA2EA,MAAM,UAAU,eAAe,CAAC,IAAgB,EAA6B;IAC5E,OAAO,UAAU,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAAA,CAC1D;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAgB,EAA8B;IAClF,OAAO,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,IAA+B,CAAC,QAAQ,CAAC,CAAC;AAAA,CAChI;AAED,MAAM,UAAU,YAAY,CAAC,KAAmB,EAAwB;IACvE,MAAM,IAAI,GAAyB,EAAE,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ;gBAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,SAAS;QACV,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC;AAAA,CACZ;AAED,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,CAAC;AAEnD,0EAA0E;AAC1E,sEAAsE;AACtE,0DAA0D;AAC1D,MAAM,8BAA8B,GAAG,IAAI,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,OAAO,SAAS;IACb,SAAS,CAAS;IACT,KAAK,GAAsB,EAAE,CAAC;IAE/C,YAAY,KAAa,EAAE;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAAA,CACrD;IAED,OAAO,GAAkB;QACxB,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAAA,CACzB,CAAC,CAAC;IAAA,CACH;IAED,OAAO,GAAS;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,EAAE,CAAC;YACV,IAAI,EAAE,CAAC;QACR,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,SAAS,EAAE,CAAC;QAClB,CAAC;IAAA,CACD;CACD;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,KAAU,EACV,KAAa,EACb,EAAsC,EACtC,eAA2B,EACZ;IACf,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,MAAM,OAAO,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,KAAK,UAAU,MAAM,CAAC,YAAoB,EAAiB;QAC1D,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;YACjB,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,8BAA8B,GAAG,CAAC,EAAE,CAAC;gBAClE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC;oBACpC,UAAU,CAAC,OAAO,EAAE,8BAA8B,GAAG,CAAC,CAAC,CAAC;gBAAA,CACxD,CAAC,CAAC;YACJ,CAAC;YACD,IAAI,eAAe,EAAE,CAAC;gBACrB,MAAM,eAAe,CAAC,OAAO,EAAE,CAAC;gBAChC,IAAI,CAAC;oBACJ,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpC,CAAC;wBAAS,CAAC;oBACV,eAAe,CAAC,OAAO,EAAE,CAAC;gBAC3B,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpC,CAAC;QACF,CAAC;IAAA,CACD;IAED,MAAM,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAChF,CAAC;IACF,OAAO,OAAO,CAAC;AAAA,CACf;AAeD,MAAM,UAAU,wBAAwB,CACvC,OAA6B,EAC7B,YAAY,GAA6C,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CACrE,qBAAqB,CAAC,GAAG,CAAC,KAAK,KAAK,OAAO,EACnC;IACT,OAAO,OAAO;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,MAAM,GACX,CAAC,CAAC,QAAQ;YACT,CAAC,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7C,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC;gBACnB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI;oBACxC,CAAC,CAAC,qBAAqB,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;oBACpE,CAAC,CAAC,CAAC,CAAC,KAAK;wBACR,CAAC,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE;wBACvB,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,kBAAkB,KAAK,KAAK;4BACnE,CAAC,CAAC,+CAA+C,CAAC,CAAC,gBAAgB,GAAG;4BACtE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,gBAAgB;gCAClC,CAAC,CAAC,6CAA6C;gCACjD,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACjF,OAAO,GAAG,MAAM,KAAK,IAAI,EAAE,CAAC;IAAA,CAC5B,CAAC;SACD,IAAI,CAAC,MAAM,CAAC,CAAC;AAAA,CACf;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC","sourcesContent":["// @ts-nocheck\nexport interface RunnerSubagentStep {\n\t/** Session id of the direct parent session for permission-system ask forwarding. */\n\tparentSessionId?: string;\n\t/** Live parent permission mode snapshotted at spawn. */\n\tparentPermissionMode?: string;\n\tagent: string;\n\ttask: string;\n\timportAsyncRoot?: {\n\t\trunId: string;\n\t\tasyncDir: string;\n\t\tresultPath: string;\n\t\tindex: number;\n\t};\n\tphase?: string;\n\tlabel?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tcwd?: string;\n\tmodel?: string;\n\tthinking?: string;\n\tmodelCandidates?: string[];\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tmcpDirectTools?: string[];\n\tcompletionGuard?: boolean;\n\tsystemPrompt?: string | null;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tskills?: string[];\n\toutputPath?: string;\n\t/** Defer the authoritative output instruction until a dynamic fanout item is materialized. */\n\tnamespaceOutputPath?: boolean;\n\toutputMode?: \"inline\" | \"file-only\";\n\tsessionFile?: string;\n\tmaxSubagentDepth?: number;\n\twaitToolEnabled?: boolean;\n\tstructuredOutput?: {\n\t\tschema: import(\"../../shared/types.ts\").JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\tstructuredOutputSchema?: import(\"../../shared/types.ts\").JsonSchemaObject;\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n\ttoolBudget?: import(\"../../shared/types.ts\").ResolvedToolBudget;\n}\n\nexport interface ParallelStepGroup {\n\tparallel: RunnerSubagentStep[];\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tworktree?: boolean;\n}\n\nexport interface DynamicRunnerGroup {\n\texpand: import(\"../../shared/settings.ts\").DynamicExpandSpec;\n\tparallel: RunnerSubagentStep;\n\tcollect: import(\"../../shared/settings.ts\").DynamicCollectSpec;\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tphase?: string;\n\tlabel?: string;\n\tsessionFiles?: (string | undefined)[];\n\tthinkingOverrides?: (string | undefined)[];\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n}\n\nexport type RunnerStep = RunnerSubagentStep | ParallelStepGroup | DynamicRunnerGroup;\n\nexport function isParallelGroup(step: RunnerStep): step is ParallelStepGroup {\n\treturn \"parallel\" in step && Array.isArray(step.parallel);\n}\n\nexport function isDynamicRunnerGroup(step: RunnerStep): step is DynamicRunnerGroup {\n\treturn \"expand\" in step && \"collect\" in step && \"parallel\" in step && !Array.isArray((step as { parallel?: unknown }).parallel);\n}\n\nexport function flattenSteps(steps: RunnerStep[]): RunnerSubagentStep[] {\n\tconst flat: RunnerSubagentStep[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tfor (const task of step.parallel) flat.push(task);\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tflat.push(step);\n\t\t}\n\t}\n\treturn flat;\n}\n\nexport const DEFAULT_GLOBAL_CONCURRENCY_LIMIT = 20;\n\n// lunr: stagger parallel cold starts so the first child's response begins\n// (creating the Anthropic cache entry) before siblings fire identical\n// system prompts. Sequential mode (limit=1) is untouched.\nconst PARALLEL_COLD_START_STAGGER_MS = 1000;\n\n/**\n * A promise-based semaphore for limiting concurrent access across multiple\n * mapConcurrent calls within a single run. Enforces a global cap on the total\n * number of subagent tasks executing simultaneously, regardless of each step's\n * per-step concurrency limit.\n */\nexport class Semaphore {\n\tprivate available: number;\n\tprivate readonly queue: Array<() => void> = [];\n\n\tconstructor(limit: number) {\n\t\tthis.available = Math.max(1, Math.floor(limit) || 1);\n\t}\n\n\tacquire(): Promise<void> {\n\t\tif (this.available > 0) {\n\t\t\tthis.available--;\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.queue.push(resolve);\n\t\t});\n\t}\n\n\trelease(): void {\n\t\tconst next = this.queue.shift();\n\t\tif (next) {\n\t\t\tnext();\n\t\t} else {\n\t\t\tthis.available++;\n\t\t}\n\t}\n}\n\nexport async function mapConcurrent<T, R>(\n\titems: T[],\n\tlimit: number,\n\tfn: (item: T, i: number) => Promise<R>,\n\tglobalSemaphore?: Semaphore,\n): Promise<R[]> {\n\tconst safeLimit = Math.max(1, Math.floor(limit) || 1);\n\tconst results: R[] = new Array(items.length);\n\tlet next = 0;\n\n\tasync function worker(_workerIndex: number): Promise<void> {\n\t\twhile (next < items.length) {\n\t\t\tconst i = next++;\n\t\t\tif (safeLimit > 1 && i > 0 && PARALLEL_COLD_START_STAGGER_MS > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\tsetTimeout(resolve, PARALLEL_COLD_START_STAGGER_MS * i);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (globalSemaphore) {\n\t\t\t\tawait globalSemaphore.acquire();\n\t\t\t\ttry {\n\t\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t\t} finally {\n\t\t\t\t\tglobalSemaphore.release();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t}\n\t\t}\n\t}\n\n\tawait Promise.all(\n\t\tArray.from({ length: Math.min(safeLimit, items.length) }, (_, wi) => worker(wi)),\n\t);\n\treturn results;\n}\n\nexport interface ParallelTaskResult {\n\tagent: string;\n\ttaskIndex?: number;\n\toutput: string;\n\texitCode: number | null;\n\terror?: string;\n\ttimedOut?: boolean;\n\tmodel?: string;\n\tattemptedModels?: string[];\n\toutputTargetPath?: string;\n\toutputTargetExists?: boolean;\n}\n\nexport function aggregateParallelOutputs(\n\tresults: ParallelTaskResult[],\n\theaderFormat: (index: number, agent: string) => string = (i, agent) =>\n\t\t`=== Parallel Task ${i + 1} (${agent}) ===`,\n): string {\n\treturn results\n\t\t.map((r, i) => {\n\t\t\tconst header = headerFormat(r.taskIndex ?? i, r.agent);\n\t\t\tconst hasOutput = Boolean(r.output?.trim());\n\t\t\tconst status =\n\t\t\t\tr.timedOut\n\t\t\t\t\t? `TIMED OUT${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t: r.exitCode === -1\n\t\t\t\t\t? \"SKIPPED\"\n\t\t\t\t\t: r.exitCode !== 0 && r.exitCode !== null\n\t\t\t\t\t\t? `FAILED (exit code ${r.exitCode})${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t\t: r.error\n\t\t\t\t\t\t\t? `WARNING: ${r.error}`\n\t\t\t\t\t\t\t: !hasOutput && r.outputTargetPath && r.outputTargetExists === false\n\t\t\t\t\t\t\t\t? `EMPTY OUTPUT (expected output file missing: ${r.outputTargetPath})`\n\t\t\t\t\t\t\t\t: !hasOutput && !r.outputTargetPath\n\t\t\t\t\t\t\t\t\t? \"EMPTY OUTPUT (no textual response returned)\"\n\t\t\t\t\t\t\t: \"\";\n\t\t\tconst body = status ? (hasOutput ? `${status}\\n${r.output}` : status) : r.output;\n\t\t\treturn `${header}\\n${body}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nexport const MAX_PARALLEL_CONCURRENCY = 4;\n"]}
@@ -18,6 +18,7 @@ export declare const SUBAGENT_PARENT_DEPTH_ENV = "PI_SUBAGENT_PARENT_DEPTH";
18
18
  export declare const SUBAGENT_PARENT_PATH_ENV = "PI_SUBAGENT_PARENT_PATH";
19
19
  export declare const SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV = "PI_SUBAGENT_PARENT_CAPABILITY_TOKEN";
20
20
  export declare const SUBAGENT_PARENT_SESSION_ENV = "PI_SUBAGENT_PARENT_SESSION";
21
+ export declare const SUBAGENT_PARENT_PERMISSION_MODE_ENV = "PI_SUBAGENT_PARENT_PERMISSION_MODE";
21
22
  export declare const SUBAGENT_STEER_INBOX_ENV = "PI_SUBAGENT_STEER_INBOX";
22
23
  export declare const SUBAGENT_STEER_CAPABILITY_ENV = "PI_SUBAGENT_STEER_CAPABILITY";
23
24
  export declare const SUBAGENT_STEER_ACK_DIR_ENV = "PI_SUBAGENT_STEER_ACK_DIR";
@@ -65,6 +66,7 @@ interface BuildPiArgsInput {
65
66
  toolBudget?: ResolvedToolBudget;
66
67
  childWatchdog?: ChildWatchdogConfig;
67
68
  waitToolEnabled?: boolean;
69
+ parentPermissionMode?: string;
68
70
  }
69
71
  interface BuildPiArgsResult {
70
72
  args: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"pi-args.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/pi-args.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { encodeNestedPathEnv, parseNestedPathEnv, type NestedPathEntry } from \"./nested-path.ts\";\nimport { resolveMcpDirectToolNames } from \"./mcp-direct-tool-allowlist.ts\";\nimport { STRUCTURED_OUTPUT_CAPTURE_ENV, STRUCTURED_OUTPUT_SCHEMA_ENV } from \"./structured-output.ts\";\nimport { TEMP_ROOT_DIR, type JsonSchemaObject, type ResolvedToolBudget } from \"../../shared/types.ts\";\nimport { THINKING_LEVELS } from \"../../shared/model-info.ts\";\nimport { TOOL_BUDGET_ENV, encodeToolBudgetEnv } from \"./tool-budget.ts\";\nimport { CHILD_TOOL_DIAGNOSTIC_PATH_ENV, REQUIRED_CHILD_TOOLS_ENV } from \"./tool-availability.ts\";\nimport { CHILD_WATCHDOG_CONFIG_ENV, encodeChildWatchdogConfig, type ChildWatchdogConfig } from \"../../watchdog/child-status.ts\";\nimport { WAIT_TOOL_ENABLED_ENV } from \"../background/wait-config.ts\";\n\nconst TASK_ARG_LIMIT = 8000;\n// lunr: the bake-in compiles extensions to dist/*.js only; upstream dev mode ships .ts.\n// Resolve the .ts sibling when present, else fall back to the compiled .js so child\n// processes always get a path that exists (the extension loader accepts both).\nfunction resolveRuntimeScriptPath(basePathWithoutExt: string): string {\n\tconst tsPath = `${basePathWithoutExt}.ts`;\n\tif (fs.existsSync(tsPath)) return tsPath;\n\treturn `${basePathWithoutExt}.js`;\n}\nconst PROMPT_RUNTIME_EXTENSION_PATH = resolveRuntimeScriptPath(path.join(path.dirname(fileURLToPath(import.meta.url)), \"subagent-prompt-runtime\"));\nconst FANOUT_CHILD_EXTENSION_PATH = resolveRuntimeScriptPath(path.join(path.dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"extension\", \"fanout-child\"));\nexport const SUBAGENT_CHILD_ENV = \"PI_SUBAGENT_CHILD\";\nexport const SUBAGENT_ORCHESTRATOR_TARGET_ENV = \"PI_SUBAGENT_ORCHESTRATOR_TARGET\";\nexport const SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV = \"PI_SUBAGENT_ORCHESTRATOR_SESSION_ID\";\nexport const SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV = \"PI_SUBAGENT_SUPERVISOR_CHANNEL_DIR\";\nexport const SUBAGENT_RUN_ID_ENV = \"PI_SUBAGENT_RUN_ID\";\nexport const SUBAGENT_CHILD_AGENT_ENV = \"PI_SUBAGENT_CHILD_AGENT\";\nexport const SUBAGENT_CHILD_INDEX_ENV = \"PI_SUBAGENT_CHILD_INDEX\";\nexport const SUBAGENT_FANOUT_CHILD_ENV = \"PI_SUBAGENT_FANOUT_CHILD\";\nexport const SUBAGENT_PARENT_EVENT_SINK_ENV = \"PI_SUBAGENT_PARENT_EVENT_SINK\";\nexport const SUBAGENT_PARENT_CONTROL_INBOX_ENV = \"PI_SUBAGENT_PARENT_CONTROL_INBOX\";\nexport const SUBAGENT_PARENT_ROOT_RUN_ID_ENV = \"PI_SUBAGENT_PARENT_ROOT_RUN_ID\";\nexport const SUBAGENT_PARENT_RUN_ID_ENV = \"PI_SUBAGENT_PARENT_RUN_ID\";\nexport const SUBAGENT_PARENT_CHILD_INDEX_ENV = \"PI_SUBAGENT_PARENT_CHILD_INDEX\";\nexport const SUBAGENT_PARENT_DEPTH_ENV = \"PI_SUBAGENT_PARENT_DEPTH\";\nexport const SUBAGENT_PARENT_PATH_ENV = \"PI_SUBAGENT_PARENT_PATH\";\nexport const SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV = \"PI_SUBAGENT_PARENT_CAPABILITY_TOKEN\";\nexport const SUBAGENT_PARENT_SESSION_ENV = \"PI_SUBAGENT_PARENT_SESSION\";\nexport const SUBAGENT_STEER_INBOX_ENV = \"PI_SUBAGENT_STEER_INBOX\";\nexport const SUBAGENT_STEER_CAPABILITY_ENV = \"PI_SUBAGENT_STEER_CAPABILITY\";\nexport const SUBAGENT_STEER_ACK_DIR_ENV = \"PI_SUBAGENT_STEER_ACK_DIR\";\n\ninterface BuildPiArgsInput {\n\tparentSessionId?: string;\n\tbaseArgs: string[];\n\ttask: string;\n\tsessionEnabled: boolean;\n\tsessionDir?: string;\n\tsessionFile?: string;\n\tmodel?: string;\n\tthinking?: string | false;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\trequireReadTool?: boolean;\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tsystemPrompt?: string | null;\n\tmcpDirectTools?: string[];\n\tcwd?: string;\n\tpromptFileStem?: string;\n\tintercomSessionName?: string;\n\torchestratorIntercomTarget?: string;\n\trunId?: string;\n\tchildAgentName?: string;\n\tchildIndex?: number;\n\tparentEventSink?: string;\n\tparentControlInbox?: string;\n\tparentRootRunId?: string;\n\tparentRunId?: string;\n\tparentChildIndex?: number;\n\tparentDepth?: number;\n\tparentPath?: NestedPathEntry[];\n\tparentCapabilityToken?: string;\n\tsteerInboxDir?: string;\n\tsteerCapabilityPath?: string;\n\tsteerAckDir?: string;\n\tstructuredOutput?: {\n\t\tschema: JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\ttoolBudget?: ResolvedToolBudget;\n\tchildWatchdog?: ChildWatchdogConfig;\n\twaitToolEnabled?: boolean;\n}\n\ninterface BuildPiArgsResult {\n\targs: string[];\n\tenv: Record<string, string | undefined>;\n\ttempDir?: string;\n\ttoolDiagnosticPath?: string;\n}\n\nfunction sanitizeSupervisorChannelSegment(value: string): string {\n\treturn value.trim().replace(/[^A-Za-z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"unknown\";\n}\n\nfunction supervisorChannelDir(runId: string, agent: string, childIndex: number): string {\n\treturn path.join(TEMP_ROOT_DIR, \"supervisor-channels\", `${sanitizeSupervisorChannelSegment(runId)}-${sanitizeSupervisorChannelSegment(agent)}-${childIndex}`);\n}\n\nexport function applyThinkingSuffix(model: string | undefined, thinking: string | false | undefined, replaceExisting = false): string | undefined {\n\tif (!model || !thinking) return model;\n\tconst colonIdx = model.lastIndexOf(\":\");\n\tif (colonIdx !== -1 && THINKING_LEVELS.some((level) => level === model.substring(colonIdx + 1))) {\n\t\treturn replaceExisting ? `${model.slice(0, colonIdx)}:${thinking}` : model;\n\t}\n\treturn `${model}:${thinking}`;\n}\n\nexport function buildPiArgs(input: BuildPiArgsInput): BuildPiArgsResult {\n\tconst args = [...input.baseArgs];\n\n\tif (input.sessionFile) {\n\t\tfs.mkdirSync(path.dirname(input.sessionFile), { recursive: true });\n\t\targs.push(\"--session\", input.sessionFile);\n\t} else {\n\t\tif (!input.sessionEnabled) {\n\t\t\targs.push(\"--no-session\");\n\t\t}\n\t\tif (input.sessionDir) {\n\t\t\tfs.mkdirSync(input.sessionDir, { recursive: true });\n\t\t\targs.push(\"--session-dir\", input.sessionDir);\n\t\t}\n\t}\n\n\tconst modelArg = applyThinkingSuffix(input.model, input.thinking);\n\tif (modelArg) {\n\t\targs.push(\"--model\", modelArg);\n\t}\n\n\tconst declaredBuiltinToolsBase = input.tools?.filter((tool) => !(tool.includes(\"/\") || tool.endsWith(\".ts\") || tool.endsWith(\".js\"))) ?? [];\n\tconst declaredBuiltinTools = input.requireReadTool && input.tools?.length && !declaredBuiltinToolsBase.includes(\"read\")\n\t\t? [\"read\", ...declaredBuiltinToolsBase]\n\t\t: declaredBuiltinToolsBase;\n\tconst fanoutAuthorized = declaredBuiltinTools.includes(\"subagent\");\n\tconst toolExtensionPaths: string[] = [];\n\tlet requiredChildTools: string[] = [];\n\tif (input.tools?.length) {\n\t\tconst allowedTools = [...declaredBuiltinTools];\n\t\tfor (const tool of input.tools) {\n\t\t\tif (!declaredBuiltinTools.includes(tool) && (tool.includes(\"/\") || tool.endsWith(\".ts\") || tool.endsWith(\".js\"))) {\n\t\t\t\ttoolExtensionPaths.push(tool);\n\t\t\t}\n\t\t}\n\t\tif (allowedTools.length > 0) {\n\t\t\tif (input.mcpDirectTools?.length) {\n\t\t\t\tallowedTools.push(...resolveMcpDirectToolNames(input.mcpDirectTools, input.cwd));\n\t\t\t}\n\t\t\tif (input.structuredOutput) allowedTools.push(\"structured_output\");\n\t\t\trequiredChildTools = [...new Set(allowedTools)];\n\t\t\targs.push(\"--tools\", requiredChildTools.join(\",\"));\n\t\t}\n\t}\n\n\tconst runtimeExtensions = fanoutAuthorized\n\t\t? [PROMPT_RUNTIME_EXTENSION_PATH, FANOUT_CHILD_EXTENSION_PATH]\n\t\t: [PROMPT_RUNTIME_EXTENSION_PATH];\n\tif (input.extensions !== undefined) {\n\t\targs.push(\"--no-extensions\");\n\t\tfor (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...input.extensions, ...(input.subagentOnlyExtensions ?? [])])]) {\n\t\t\targs.push(\"--extension\", extPath);\n\t\t}\n\t} else {\n\t\tfor (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...(input.subagentOnlyExtensions ?? [])])]) {\n\t\t\targs.push(\"--extension\", extPath);\n\t\t}\n\t}\n\n\tif (!input.inheritSkills) {\n\t\targs.push(\"--no-skills\");\n\t}\n\n\tlet tempDir: string | undefined;\n\tif (input.systemPrompt !== undefined && input.systemPrompt !== null) {\n\t\ttempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\tconst stem = (input.promptFileStem ?? \"prompt\").replace(/[^\\w.-]/g, \"_\");\n\t\tconst promptPath = path.join(tempDir, `${stem}.md`);\n\t\tfs.writeFileSync(promptPath, input.systemPrompt, { mode: 0o600 });\n\t\targs.push(input.systemPromptMode === \"replace\" ? \"--system-prompt\" : \"--append-system-prompt\", promptPath);\n\t}\n\n\tif (input.task.length > TASK_ARG_LIMIT) {\n\t\tif (!tempDir) {\n\t\t\ttempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\t}\n\t\tconst taskFilePath = path.join(tempDir, \"task.md\");\n\t\tfs.writeFileSync(taskFilePath, `Task: ${input.task}`, { mode: 0o600 });\n\t\targs.push(`@${taskFilePath}`);\n\t} else {\n\t\targs.push(`Task: ${input.task}`);\n\t}\n\n\tconst env: Record<string, string | undefined> = {};\n\tlet toolDiagnosticPath: string | undefined;\n\tif (requiredChildTools.length > 0) {\n\t\tif (!tempDir) tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\ttoolDiagnosticPath = path.join(tempDir, \"tool-diagnostic.json\");\n\t\tenv[REQUIRED_CHILD_TOOLS_ENV] = JSON.stringify(requiredChildTools);\n\t\tenv[CHILD_TOOL_DIAGNOSTIC_PATH_ENV] = toolDiagnosticPath;\n\t}\n\tenv[SUBAGENT_CHILD_ENV] = \"1\";\n\tenv[SUBAGENT_FANOUT_CHILD_ENV] = fanoutAuthorized ? \"1\" : \"0\";\n\tif (input.waitToolEnabled !== undefined) {\n\t\tenv[WAIT_TOOL_ENABLED_ENV] = input.waitToolEnabled ? \"true\" : \"false\";\n\t}\n\tconst inheritedNestedRoute = Boolean(process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] && process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] && process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV]);\n\tconst parentRunId = input.parentRunId ?? input.runId ?? (inheritedNestedRoute ? process.env[SUBAGENT_RUN_ID_ENV] : undefined) ?? process.env[SUBAGENT_PARENT_RUN_ID_ENV] ?? \"\";\n\tconst parentChildIndex = input.parentChildIndex !== undefined\n\t\t? String(input.parentChildIndex)\n\t\t: input.childIndex !== undefined\n\t\t\t? String(input.childIndex)\n\t\t\t: process.env[SUBAGENT_PARENT_CHILD_INDEX_ENV] ?? \"\";\n\tconst inheritedDepth = Number(process.env[SUBAGENT_PARENT_DEPTH_ENV]);\n\tconst parentDepth = input.parentDepth ?? (inheritedNestedRoute && Number.isFinite(inheritedDepth) ? inheritedDepth + 1 : 1);\n\tconst parentPath = input.parentPath ?? [\n\t\t...parseNestedPathEnv(process.env[SUBAGENT_PARENT_PATH_ENV]),\n\t\t...(parentRunId ? [{\n\t\t\trunId: parentRunId,\n\t\t\t...(parentChildIndex && /^\\d+$/.test(parentChildIndex) ? { stepIndex: Number(parentChildIndex) } : {}),\n\t\t\t...(input.childAgentName ? { agent: input.childAgentName } : {}),\n\t\t}] : []),\n\t];\n\tenv[SUBAGENT_PARENT_EVENT_SINK_ENV] = fanoutAuthorized\n\t\t? input.parentEventSink ?? process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_CONTROL_INBOX_ENV] = fanoutAuthorized\n\t\t? input.parentControlInbox ?? process.env[SUBAGENT_PARENT_CONTROL_INBOX_ENV] ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] = fanoutAuthorized\n\t\t? input.parentRootRunId ?? process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] ?? input.runId ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_RUN_ID_ENV] = fanoutAuthorized ? parentRunId : \"\";\n\tenv[SUBAGENT_PARENT_CHILD_INDEX_ENV] = fanoutAuthorized ? parentChildIndex : \"\";\n\tenv[SUBAGENT_PARENT_DEPTH_ENV] = fanoutAuthorized ? String(parentDepth) : \"\";\n\tenv[SUBAGENT_PARENT_PATH_ENV] = fanoutAuthorized ? encodeNestedPathEnv(parentPath) : \"\";\n\tenv[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] = fanoutAuthorized\n\t\t? input.parentCapabilityToken ?? process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] ?? \"\"\n\t\t: \"\";\n\tenv.PI_SUBAGENT_INHERIT_PROJECT_CONTEXT = input.inheritProjectContext ? \"1\" : \"0\";\n\tenv.PI_SUBAGENT_INHERIT_SKILLS = input.inheritSkills ? \"1\" : \"0\";\n\tif (input.intercomSessionName) {\n\t\tenv.PI_SUBAGENT_INTERCOM_SESSION_NAME = input.intercomSessionName;\n\t}\n\tif (input.orchestratorIntercomTarget) {\n\t\tenv[SUBAGENT_ORCHESTRATOR_TARGET_ENV] = input.orchestratorIntercomTarget;\n\t}\n\tif (input.parentSessionId) {\n\t\tenv[SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV] = input.parentSessionId;\n\t}\n\tif (input.orchestratorIntercomTarget && input.parentSessionId && input.runId && input.childAgentName) {\n\t\tconst childIndex = input.childIndex ?? 0;\n\t\tconst channelDir = supervisorChannelDir(input.runId, input.childAgentName, childIndex);\n\t\tfs.mkdirSync(path.join(channelDir, \"requests\"), { recursive: true });\n\t\tfs.mkdirSync(path.join(channelDir, \"replies\"), { recursive: true });\n\t\tenv[SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV] = channelDir;\n\t}\n\tif (input.runId) {\n\t\tenv[SUBAGENT_RUN_ID_ENV] = input.runId;\n\t}\n\tif (input.childAgentName) {\n\t\tenv[SUBAGENT_CHILD_AGENT_ENV] = input.childAgentName;\n\t}\n\tif (input.childIndex !== undefined) {\n\t\tenv[SUBAGENT_CHILD_INDEX_ENV] = String(input.childIndex);\n\t}\n\tif (input.mcpDirectTools?.length) {\n\t\tenv.MCP_DIRECT_TOOLS = input.mcpDirectTools.join(\",\");\n\t} else {\n\t\tenv.MCP_DIRECT_TOOLS = \"__none__\";\n\t}\n\tif (input.structuredOutput) {\n\t\tenv[STRUCTURED_OUTPUT_CAPTURE_ENV] = input.structuredOutput.outputPath;\n\t\tenv[STRUCTURED_OUTPUT_SCHEMA_ENV] = input.structuredOutput.schemaPath;\n\t}\n\tif (input.steerInboxDir) {\n\t\tenv[SUBAGENT_STEER_INBOX_ENV] = input.steerInboxDir;\n\t}\n\tif (input.steerCapabilityPath) env[SUBAGENT_STEER_CAPABILITY_ENV] = input.steerCapabilityPath;\n\tif (input.steerAckDir) env[SUBAGENT_STEER_ACK_DIR_ENV] = input.steerAckDir;\n\tconst encodedToolBudget = encodeToolBudgetEnv(input.toolBudget);\n\tif (encodedToolBudget) env[TOOL_BUDGET_ENV] = encodedToolBudget;\n\tconst encodedChildWatchdog = encodeChildWatchdogConfig(input.childWatchdog);\n\tif (encodedChildWatchdog) env[CHILD_WATCHDOG_CONFIG_ENV] = encodedChildWatchdog;\n\n\tenv[SUBAGENT_PARENT_SESSION_ENV] = input.parentSessionId ?? process.env[SUBAGENT_PARENT_SESSION_ENV] ?? \"\";\n\n\treturn { args, env, tempDir, toolDiagnosticPath };\n}\n\nexport const parseParentPathEnv = parseNestedPathEnv;\n\nexport function cleanupTempDir(tempDir: string | null | undefined): void {\n\tif (!tempDir) return;\n\ttry {\n\t\tfs.rmSync(tempDir, { recursive: true, force: true });\n\t} catch {\n\t\t// Temp cleanup is best effort.\n\t}\n}\n"]}
1
+ {"version":3,"file":"pi-args.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/pi-args.ts"],"names":[],"mappings":"AAKA,OAAO,EAAuB,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGjG,OAAO,EAAiB,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAItG,OAAO,EAAwD,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAchI,eAAO,MAAM,kBAAkB,sBAAsB,CAAC;AACtD,eAAO,MAAM,gCAAgC,oCAAoC,CAAC;AAClF,eAAO,MAAM,oCAAoC,wCAAwC,CAAC;AAC1F,eAAO,MAAM,mCAAmC,uCAAuC,CAAC;AACxF,eAAO,MAAM,mBAAmB,uBAAuB,CAAC;AACxD,eAAO,MAAM,wBAAwB,4BAA4B,CAAC;AAClE,eAAO,MAAM,wBAAwB,4BAA4B,CAAC;AAClE,eAAO,MAAM,yBAAyB,6BAA6B,CAAC;AACpE,eAAO,MAAM,8BAA8B,kCAAkC,CAAC;AAC9E,eAAO,MAAM,iCAAiC,qCAAqC,CAAC;AACpF,eAAO,MAAM,+BAA+B,mCAAmC,CAAC;AAChF,eAAO,MAAM,0BAA0B,8BAA8B,CAAC;AACtE,eAAO,MAAM,+BAA+B,mCAAmC,CAAC;AAChF,eAAO,MAAM,yBAAyB,6BAA6B,CAAC;AACpE,eAAO,MAAM,wBAAwB,4BAA4B,CAAC;AAClE,eAAO,MAAM,oCAAoC,wCAAwC,CAAC;AAC1F,eAAO,MAAM,2BAA2B,+BAA+B,CAAC;AACxE,eAAO,MAAM,mCAAmC,uCAAuC,CAAC;AACxF,eAAO,MAAM,wBAAwB,4BAA4B,CAAC;AAClE,eAAO,MAAM,6BAA6B,iCAAiC,CAAC;AAC5E,eAAO,MAAM,0BAA0B,8BAA8B,CAAC;AAEtE,UAAU,gBAAgB;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC1B,gBAAgB,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACxC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE;QAClB,MAAM,EAAE,gBAAgB,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,UAAU,iBAAiB;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAUD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,EAAE,eAAe,UAAQ,GAAG,MAAM,GAAG,SAAS,CAOhJ;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAmLtE;AAED,eAAO,MAAM,kBAAkB,2BAAqB,CAAC;AAErD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAOvE","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { encodeNestedPathEnv, parseNestedPathEnv, type NestedPathEntry } from \"./nested-path.ts\";\nimport { resolveMcpDirectToolNames } from \"./mcp-direct-tool-allowlist.ts\";\nimport { STRUCTURED_OUTPUT_CAPTURE_ENV, STRUCTURED_OUTPUT_SCHEMA_ENV } from \"./structured-output.ts\";\nimport { TEMP_ROOT_DIR, type JsonSchemaObject, type ResolvedToolBudget } from \"../../shared/types.ts\";\nimport { THINKING_LEVELS } from \"../../shared/model-info.ts\";\nimport { TOOL_BUDGET_ENV, encodeToolBudgetEnv } from \"./tool-budget.ts\";\nimport { CHILD_TOOL_DIAGNOSTIC_PATH_ENV, REQUIRED_CHILD_TOOLS_ENV } from \"./tool-availability.ts\";\nimport { CHILD_WATCHDOG_CONFIG_ENV, encodeChildWatchdogConfig, type ChildWatchdogConfig } from \"../../watchdog/child-status.ts\";\nimport { WAIT_TOOL_ENABLED_ENV } from \"../background/wait-config.ts\";\n\nconst TASK_ARG_LIMIT = 8000;\n// lunr: the bake-in compiles extensions to dist/*.js only; upstream dev mode ships .ts.\n// Resolve the .ts sibling when present, else fall back to the compiled .js so child\n// processes always get a path that exists (the extension loader accepts both).\nfunction resolveRuntimeScriptPath(basePathWithoutExt: string): string {\n\tconst tsPath = `${basePathWithoutExt}.ts`;\n\tif (fs.existsSync(tsPath)) return tsPath;\n\treturn `${basePathWithoutExt}.js`;\n}\nconst PROMPT_RUNTIME_EXTENSION_PATH = resolveRuntimeScriptPath(path.join(path.dirname(fileURLToPath(import.meta.url)), \"subagent-prompt-runtime\"));\nconst FANOUT_CHILD_EXTENSION_PATH = resolveRuntimeScriptPath(path.join(path.dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"extension\", \"fanout-child\"));\nexport const SUBAGENT_CHILD_ENV = \"PI_SUBAGENT_CHILD\";\nexport const SUBAGENT_ORCHESTRATOR_TARGET_ENV = \"PI_SUBAGENT_ORCHESTRATOR_TARGET\";\nexport const SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV = \"PI_SUBAGENT_ORCHESTRATOR_SESSION_ID\";\nexport const SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV = \"PI_SUBAGENT_SUPERVISOR_CHANNEL_DIR\";\nexport const SUBAGENT_RUN_ID_ENV = \"PI_SUBAGENT_RUN_ID\";\nexport const SUBAGENT_CHILD_AGENT_ENV = \"PI_SUBAGENT_CHILD_AGENT\";\nexport const SUBAGENT_CHILD_INDEX_ENV = \"PI_SUBAGENT_CHILD_INDEX\";\nexport const SUBAGENT_FANOUT_CHILD_ENV = \"PI_SUBAGENT_FANOUT_CHILD\";\nexport const SUBAGENT_PARENT_EVENT_SINK_ENV = \"PI_SUBAGENT_PARENT_EVENT_SINK\";\nexport const SUBAGENT_PARENT_CONTROL_INBOX_ENV = \"PI_SUBAGENT_PARENT_CONTROL_INBOX\";\nexport const SUBAGENT_PARENT_ROOT_RUN_ID_ENV = \"PI_SUBAGENT_PARENT_ROOT_RUN_ID\";\nexport const SUBAGENT_PARENT_RUN_ID_ENV = \"PI_SUBAGENT_PARENT_RUN_ID\";\nexport const SUBAGENT_PARENT_CHILD_INDEX_ENV = \"PI_SUBAGENT_PARENT_CHILD_INDEX\";\nexport const SUBAGENT_PARENT_DEPTH_ENV = \"PI_SUBAGENT_PARENT_DEPTH\";\nexport const SUBAGENT_PARENT_PATH_ENV = \"PI_SUBAGENT_PARENT_PATH\";\nexport const SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV = \"PI_SUBAGENT_PARENT_CAPABILITY_TOKEN\";\nexport const SUBAGENT_PARENT_SESSION_ENV = \"PI_SUBAGENT_PARENT_SESSION\";\nexport const SUBAGENT_PARENT_PERMISSION_MODE_ENV = \"PI_SUBAGENT_PARENT_PERMISSION_MODE\";\nexport const SUBAGENT_STEER_INBOX_ENV = \"PI_SUBAGENT_STEER_INBOX\";\nexport const SUBAGENT_STEER_CAPABILITY_ENV = \"PI_SUBAGENT_STEER_CAPABILITY\";\nexport const SUBAGENT_STEER_ACK_DIR_ENV = \"PI_SUBAGENT_STEER_ACK_DIR\";\n\ninterface BuildPiArgsInput {\n\tparentSessionId?: string;\n\tbaseArgs: string[];\n\ttask: string;\n\tsessionEnabled: boolean;\n\tsessionDir?: string;\n\tsessionFile?: string;\n\tmodel?: string;\n\tthinking?: string | false;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\trequireReadTool?: boolean;\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tsystemPrompt?: string | null;\n\tmcpDirectTools?: string[];\n\tcwd?: string;\n\tpromptFileStem?: string;\n\tintercomSessionName?: string;\n\torchestratorIntercomTarget?: string;\n\trunId?: string;\n\tchildAgentName?: string;\n\tchildIndex?: number;\n\tparentEventSink?: string;\n\tparentControlInbox?: string;\n\tparentRootRunId?: string;\n\tparentRunId?: string;\n\tparentChildIndex?: number;\n\tparentDepth?: number;\n\tparentPath?: NestedPathEntry[];\n\tparentCapabilityToken?: string;\n\tsteerInboxDir?: string;\n\tsteerCapabilityPath?: string;\n\tsteerAckDir?: string;\n\tstructuredOutput?: {\n\t\tschema: JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\ttoolBudget?: ResolvedToolBudget;\n\tchildWatchdog?: ChildWatchdogConfig;\n\twaitToolEnabled?: boolean;\n\tparentPermissionMode?: string;\n}\n\ninterface BuildPiArgsResult {\n\targs: string[];\n\tenv: Record<string, string | undefined>;\n\ttempDir?: string;\n\ttoolDiagnosticPath?: string;\n}\n\nfunction sanitizeSupervisorChannelSegment(value: string): string {\n\treturn value.trim().replace(/[^A-Za-z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"unknown\";\n}\n\nfunction supervisorChannelDir(runId: string, agent: string, childIndex: number): string {\n\treturn path.join(TEMP_ROOT_DIR, \"supervisor-channels\", `${sanitizeSupervisorChannelSegment(runId)}-${sanitizeSupervisorChannelSegment(agent)}-${childIndex}`);\n}\n\nexport function applyThinkingSuffix(model: string | undefined, thinking: string | false | undefined, replaceExisting = false): string | undefined {\n\tif (!model || !thinking) return model;\n\tconst colonIdx = model.lastIndexOf(\":\");\n\tif (colonIdx !== -1 && THINKING_LEVELS.some((level) => level === model.substring(colonIdx + 1))) {\n\t\treturn replaceExisting ? `${model.slice(0, colonIdx)}:${thinking}` : model;\n\t}\n\treturn `${model}:${thinking}`;\n}\n\nexport function buildPiArgs(input: BuildPiArgsInput): BuildPiArgsResult {\n\tconst args = [...input.baseArgs];\n\n\tif (input.sessionFile) {\n\t\tfs.mkdirSync(path.dirname(input.sessionFile), { recursive: true });\n\t\targs.push(\"--session\", input.sessionFile);\n\t} else {\n\t\tif (!input.sessionEnabled) {\n\t\t\targs.push(\"--no-session\");\n\t\t}\n\t\tif (input.sessionDir) {\n\t\t\tfs.mkdirSync(input.sessionDir, { recursive: true });\n\t\t\targs.push(\"--session-dir\", input.sessionDir);\n\t\t}\n\t}\n\n\tconst modelArg = applyThinkingSuffix(input.model, input.thinking);\n\tif (modelArg) {\n\t\targs.push(\"--model\", modelArg);\n\t}\n\n\tconst declaredBuiltinToolsBase = input.tools?.filter((tool) => !(tool.includes(\"/\") || tool.endsWith(\".ts\") || tool.endsWith(\".js\"))) ?? [];\n\tconst declaredBuiltinTools = input.requireReadTool && input.tools?.length && !declaredBuiltinToolsBase.includes(\"read\")\n\t\t? [\"read\", ...declaredBuiltinToolsBase]\n\t\t: declaredBuiltinToolsBase;\n\tconst fanoutAuthorized = declaredBuiltinTools.includes(\"subagent\");\n\tconst toolExtensionPaths: string[] = [];\n\tlet requiredChildTools: string[] = [];\n\tif (input.tools?.length) {\n\t\tconst allowedTools = [...declaredBuiltinTools];\n\t\tfor (const tool of input.tools) {\n\t\t\tif (!declaredBuiltinTools.includes(tool) && (tool.includes(\"/\") || tool.endsWith(\".ts\") || tool.endsWith(\".js\"))) {\n\t\t\t\ttoolExtensionPaths.push(tool);\n\t\t\t}\n\t\t}\n\t\tif (allowedTools.length > 0) {\n\t\t\tif (input.mcpDirectTools?.length) {\n\t\t\t\tallowedTools.push(...resolveMcpDirectToolNames(input.mcpDirectTools, input.cwd));\n\t\t\t}\n\t\t\tif (input.structuredOutput) allowedTools.push(\"structured_output\");\n\t\t\trequiredChildTools = [...new Set(allowedTools)];\n\t\t\targs.push(\"--tools\", requiredChildTools.join(\",\"));\n\t\t}\n\t}\n\n\tconst runtimeExtensions = fanoutAuthorized\n\t\t? [PROMPT_RUNTIME_EXTENSION_PATH, FANOUT_CHILD_EXTENSION_PATH]\n\t\t: [PROMPT_RUNTIME_EXTENSION_PATH];\n\tif (input.extensions !== undefined) {\n\t\targs.push(\"--no-extensions\");\n\t\tfor (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...input.extensions, ...(input.subagentOnlyExtensions ?? [])])]) {\n\t\t\targs.push(\"--extension\", extPath);\n\t\t}\n\t} else {\n\t\tfor (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...(input.subagentOnlyExtensions ?? [])])]) {\n\t\t\targs.push(\"--extension\", extPath);\n\t\t}\n\t}\n\n\tif (!input.inheritSkills) {\n\t\targs.push(\"--no-skills\");\n\t}\n\n\tlet tempDir: string | undefined;\n\tif (input.systemPrompt !== undefined && input.systemPrompt !== null) {\n\t\ttempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\tconst stem = (input.promptFileStem ?? \"prompt\").replace(/[^\\w.-]/g, \"_\");\n\t\tconst promptPath = path.join(tempDir, `${stem}.md`);\n\t\tfs.writeFileSync(promptPath, input.systemPrompt, { mode: 0o600 });\n\t\targs.push(input.systemPromptMode === \"replace\" ? \"--system-prompt\" : \"--append-system-prompt\", promptPath);\n\t}\n\n\tif (input.task.length > TASK_ARG_LIMIT) {\n\t\tif (!tempDir) {\n\t\t\ttempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\t}\n\t\tconst taskFilePath = path.join(tempDir, \"task.md\");\n\t\tfs.writeFileSync(taskFilePath, `Task: ${input.task}`, { mode: 0o600 });\n\t\targs.push(`@${taskFilePath}`);\n\t} else {\n\t\targs.push(`Task: ${input.task}`);\n\t}\n\n\tconst env: Record<string, string | undefined> = {};\n\tlet toolDiagnosticPath: string | undefined;\n\tif (requiredChildTools.length > 0) {\n\t\tif (!tempDir) tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\ttoolDiagnosticPath = path.join(tempDir, \"tool-diagnostic.json\");\n\t\tenv[REQUIRED_CHILD_TOOLS_ENV] = JSON.stringify(requiredChildTools);\n\t\tenv[CHILD_TOOL_DIAGNOSTIC_PATH_ENV] = toolDiagnosticPath;\n\t}\n\tenv[SUBAGENT_CHILD_ENV] = \"1\";\n\tenv[SUBAGENT_PARENT_PERMISSION_MODE_ENV] = input.parentPermissionMode ?? process.env[SUBAGENT_PARENT_PERMISSION_MODE_ENV] ?? \"\";\n\tenv[SUBAGENT_FANOUT_CHILD_ENV] = fanoutAuthorized ? \"1\" : \"0\";\n\tif (input.waitToolEnabled !== undefined) {\n\t\tenv[WAIT_TOOL_ENABLED_ENV] = input.waitToolEnabled ? \"true\" : \"false\";\n\t}\n\tconst inheritedNestedRoute = Boolean(process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] && process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] && process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV]);\n\tconst parentRunId = input.parentRunId ?? input.runId ?? (inheritedNestedRoute ? process.env[SUBAGENT_RUN_ID_ENV] : undefined) ?? process.env[SUBAGENT_PARENT_RUN_ID_ENV] ?? \"\";\n\tconst parentChildIndex = input.parentChildIndex !== undefined\n\t\t? String(input.parentChildIndex)\n\t\t: input.childIndex !== undefined\n\t\t\t? String(input.childIndex)\n\t\t\t: process.env[SUBAGENT_PARENT_CHILD_INDEX_ENV] ?? \"\";\n\tconst inheritedDepth = Number(process.env[SUBAGENT_PARENT_DEPTH_ENV]);\n\tconst parentDepth = input.parentDepth ?? (inheritedNestedRoute && Number.isFinite(inheritedDepth) ? inheritedDepth + 1 : 1);\n\tconst parentPath = input.parentPath ?? [\n\t\t...parseNestedPathEnv(process.env[SUBAGENT_PARENT_PATH_ENV]),\n\t\t...(parentRunId ? [{\n\t\t\trunId: parentRunId,\n\t\t\t...(parentChildIndex && /^\\d+$/.test(parentChildIndex) ? { stepIndex: Number(parentChildIndex) } : {}),\n\t\t\t...(input.childAgentName ? { agent: input.childAgentName } : {}),\n\t\t}] : []),\n\t];\n\tenv[SUBAGENT_PARENT_EVENT_SINK_ENV] = fanoutAuthorized\n\t\t? input.parentEventSink ?? process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_CONTROL_INBOX_ENV] = fanoutAuthorized\n\t\t? input.parentControlInbox ?? process.env[SUBAGENT_PARENT_CONTROL_INBOX_ENV] ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] = fanoutAuthorized\n\t\t? input.parentRootRunId ?? process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] ?? input.runId ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_RUN_ID_ENV] = fanoutAuthorized ? parentRunId : \"\";\n\tenv[SUBAGENT_PARENT_CHILD_INDEX_ENV] = fanoutAuthorized ? parentChildIndex : \"\";\n\tenv[SUBAGENT_PARENT_DEPTH_ENV] = fanoutAuthorized ? String(parentDepth) : \"\";\n\tenv[SUBAGENT_PARENT_PATH_ENV] = fanoutAuthorized ? encodeNestedPathEnv(parentPath) : \"\";\n\tenv[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] = fanoutAuthorized\n\t\t? input.parentCapabilityToken ?? process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] ?? \"\"\n\t\t: \"\";\n\tenv.PI_SUBAGENT_INHERIT_PROJECT_CONTEXT = input.inheritProjectContext ? \"1\" : \"0\";\n\tenv.PI_SUBAGENT_INHERIT_SKILLS = input.inheritSkills ? \"1\" : \"0\";\n\tif (input.intercomSessionName) {\n\t\tenv.PI_SUBAGENT_INTERCOM_SESSION_NAME = input.intercomSessionName;\n\t}\n\tif (input.orchestratorIntercomTarget) {\n\t\tenv[SUBAGENT_ORCHESTRATOR_TARGET_ENV] = input.orchestratorIntercomTarget;\n\t}\n\tif (input.parentSessionId) {\n\t\tenv[SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV] = input.parentSessionId;\n\t}\n\tif (input.orchestratorIntercomTarget && input.parentSessionId && input.runId && input.childAgentName) {\n\t\tconst childIndex = input.childIndex ?? 0;\n\t\tconst channelDir = supervisorChannelDir(input.runId, input.childAgentName, childIndex);\n\t\tfs.mkdirSync(path.join(channelDir, \"requests\"), { recursive: true });\n\t\tfs.mkdirSync(path.join(channelDir, \"replies\"), { recursive: true });\n\t\tenv[SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV] = channelDir;\n\t}\n\tif (input.runId) {\n\t\tenv[SUBAGENT_RUN_ID_ENV] = input.runId;\n\t}\n\tif (input.childAgentName) {\n\t\tenv[SUBAGENT_CHILD_AGENT_ENV] = input.childAgentName;\n\t}\n\tif (input.childIndex !== undefined) {\n\t\tenv[SUBAGENT_CHILD_INDEX_ENV] = String(input.childIndex);\n\t}\n\tif (input.mcpDirectTools?.length) {\n\t\tenv.MCP_DIRECT_TOOLS = input.mcpDirectTools.join(\",\");\n\t} else {\n\t\tenv.MCP_DIRECT_TOOLS = \"__none__\";\n\t}\n\tif (input.structuredOutput) {\n\t\tenv[STRUCTURED_OUTPUT_CAPTURE_ENV] = input.structuredOutput.outputPath;\n\t\tenv[STRUCTURED_OUTPUT_SCHEMA_ENV] = input.structuredOutput.schemaPath;\n\t}\n\tif (input.steerInboxDir) {\n\t\tenv[SUBAGENT_STEER_INBOX_ENV] = input.steerInboxDir;\n\t}\n\tif (input.steerCapabilityPath) env[SUBAGENT_STEER_CAPABILITY_ENV] = input.steerCapabilityPath;\n\tif (input.steerAckDir) env[SUBAGENT_STEER_ACK_DIR_ENV] = input.steerAckDir;\n\tconst encodedToolBudget = encodeToolBudgetEnv(input.toolBudget);\n\tif (encodedToolBudget) env[TOOL_BUDGET_ENV] = encodedToolBudget;\n\tconst encodedChildWatchdog = encodeChildWatchdogConfig(input.childWatchdog);\n\tif (encodedChildWatchdog) env[CHILD_WATCHDOG_CONFIG_ENV] = encodedChildWatchdog;\n\n\tenv[SUBAGENT_PARENT_SESSION_ENV] = input.parentSessionId ?? process.env[SUBAGENT_PARENT_SESSION_ENV] ?? \"\";\n\n\treturn { args, env, tempDir, toolDiagnosticPath };\n}\n\nexport const parseParentPathEnv = parseNestedPathEnv;\n\nexport function cleanupTempDir(tempDir: string | null | undefined): void {\n\tif (!tempDir) return;\n\ttry {\n\t\tfs.rmSync(tempDir, { recursive: true, force: true });\n\t} catch {\n\t\t// Temp cleanup is best effort.\n\t}\n}\n"]}
@@ -41,6 +41,7 @@ export const SUBAGENT_PARENT_DEPTH_ENV = "PI_SUBAGENT_PARENT_DEPTH";
41
41
  export const SUBAGENT_PARENT_PATH_ENV = "PI_SUBAGENT_PARENT_PATH";
42
42
  export const SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV = "PI_SUBAGENT_PARENT_CAPABILITY_TOKEN";
43
43
  export const SUBAGENT_PARENT_SESSION_ENV = "PI_SUBAGENT_PARENT_SESSION";
44
+ export const SUBAGENT_PARENT_PERMISSION_MODE_ENV = "PI_SUBAGENT_PARENT_PERMISSION_MODE";
44
45
  export const SUBAGENT_STEER_INBOX_ENV = "PI_SUBAGENT_STEER_INBOX";
45
46
  export const SUBAGENT_STEER_CAPABILITY_ENV = "PI_SUBAGENT_STEER_CAPABILITY";
46
47
  export const SUBAGENT_STEER_ACK_DIR_ENV = "PI_SUBAGENT_STEER_ACK_DIR";
@@ -148,6 +149,7 @@ export function buildPiArgs(input) {
148
149
  env[CHILD_TOOL_DIAGNOSTIC_PATH_ENV] = toolDiagnosticPath;
149
150
  }
150
151
  env[SUBAGENT_CHILD_ENV] = "1";
152
+ env[SUBAGENT_PARENT_PERMISSION_MODE_ENV] = input.parentPermissionMode ?? process.env[SUBAGENT_PARENT_PERMISSION_MODE_ENV] ?? "";
151
153
  env[SUBAGENT_FANOUT_CHILD_ENV] = fanoutAuthorized ? "1" : "0";
152
154
  if (input.waitToolEnabled !== undefined) {
153
155
  env[WAIT_TOOL_ENABLED_ENV] = input.waitToolEnabled ? "true" : "false";