@north-light/crouter 0.3.154
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -0
- package/bin/crouter +4 -0
- package/bin/crtr +4 -0
- package/bin/crtrd +4 -0
- package/bin/runtime-generation-manifest.mjs +263 -0
- package/bin/runtime-selector.mjs +378 -0
- package/dist/api/__tests__/client.test.d.ts +1 -0
- package/dist/api/__tests__/client.test.js +274 -0
- package/dist/api/client.d.ts +249 -0
- package/dist/api/client.js +616 -0
- package/dist/api/dto/attach.d.ts +16 -0
- package/dist/api/dto/attach.js +13 -0
- package/dist/api/dto/broker.d.ts +45 -0
- package/dist/api/dto/broker.js +20 -0
- package/dist/api/dto/canvas.d.ts +253 -0
- package/dist/api/dto/canvas.js +2 -0
- package/dist/api/dto/common.d.ts +27 -0
- package/dist/api/dto/common.js +15 -0
- package/dist/api/dto/config.d.ts +19 -0
- package/dist/api/dto/config.js +3 -0
- package/dist/api/dto/crons.d.ts +124 -0
- package/dist/api/dto/crons.js +10 -0
- package/dist/api/dto/files.d.ts +11 -0
- package/dist/api/dto/files.js +7 -0
- package/dist/api/dto/focus.d.ts +24 -0
- package/dist/api/dto/focus.js +10 -0
- package/dist/api/dto/health.d.ts +41 -0
- package/dist/api/dto/health.js +2 -0
- package/dist/api/dto/human.d.ts +57 -0
- package/dist/api/dto/human.js +4 -0
- package/dist/api/dto/inbox.d.ts +105 -0
- package/dist/api/dto/inbox.js +10 -0
- package/dist/api/dto/lifecycle.d.ts +79 -0
- package/dist/api/dto/lifecycle.js +3 -0
- package/dist/api/dto/messages.d.ts +55 -0
- package/dist/api/dto/messages.js +2 -0
- package/dist/api/dto/modelauth.d.ts +41 -0
- package/dist/api/dto/modelauth.js +3 -0
- package/dist/api/dto/nodes.d.ts +209 -0
- package/dist/api/dto/nodes.js +3 -0
- package/dist/api/dto/profiles.d.ts +14 -0
- package/dist/api/dto/profiles.js +3 -0
- package/dist/api/dto/reports.d.ts +41 -0
- package/dist/api/dto/reports.js +2 -0
- package/dist/api/dto/subscriptions.d.ts +14 -0
- package/dist/api/dto/subscriptions.js +2 -0
- package/dist/api/dto/worktree.d.ts +19 -0
- package/dist/api/dto/worktree.js +6 -0
- package/dist/api/errors.d.ts +19 -0
- package/dist/api/errors.js +30 -0
- package/dist/api/index.d.ts +24 -0
- package/dist/api/index.js +25 -0
- package/dist/api/routes.d.ts +64 -0
- package/dist/api/routes.js +92 -0
- package/dist/build-root.d.ts +43 -0
- package/dist/build-root.js +96 -0
- package/dist/builtin-memory/00-runtime-base.md +51 -0
- package/dist/builtin-memory/01-spine/00-has-manager.md +23 -0
- package/dist/builtin-memory/01-spine/01-no-manager.md +10 -0
- package/dist/builtin-memory/02-lifecycle/00-terminal.md +19 -0
- package/dist/builtin-memory/02-lifecycle/01-resident.md +10 -0
- package/dist/builtin-memory/04-base-worker.md +18 -0
- package/dist/builtin-memory/04-orchestration-kernel.md +109 -0
- package/dist/builtin-memory/05-kinds/advisor/00-base.md +19 -0
- package/dist/builtin-memory/05-kinds/advisor/01-orchestrator.md +26 -0
- package/dist/builtin-memory/05-kinds/design/00-base.md +20 -0
- package/dist/builtin-memory/05-kinds/design/01-orchestrator.md +13 -0
- package/dist/builtin-memory/05-kinds/developer/00-base.md +22 -0
- package/dist/builtin-memory/05-kinds/developer/01-orchestrator.md +21 -0
- package/dist/builtin-memory/05-kinds/explore/00-base.md +20 -0
- package/dist/builtin-memory/05-kinds/explore/01-orchestrator.md +16 -0
- package/dist/builtin-memory/05-kinds/general/00-base.md +15 -0
- package/dist/builtin-memory/05-kinds/general/01-orchestrator.md +11 -0
- package/dist/builtin-memory/05-kinds/plan/00-base.md +20 -0
- package/dist/builtin-memory/05-kinds/plan/01-orchestrator.md +17 -0
- package/dist/builtin-memory/05-kinds/plan/reviewers/architecture-fit.md +17 -0
- package/dist/builtin-memory/05-kinds/plan/reviewers/code-smells.md +17 -0
- package/dist/builtin-memory/05-kinds/plan/reviewers/pattern-consistency.md +19 -0
- package/dist/builtin-memory/05-kinds/plan/reviewers/requirements-coverage.md +17 -0
- package/dist/builtin-memory/05-kinds/plan/reviewers/security.md +20 -0
- package/dist/builtin-memory/05-kinds/product/00-base.md +25 -0
- package/dist/builtin-memory/05-kinds/product/01-orchestrator.md +15 -0
- package/dist/builtin-memory/05-kinds/product/teardown.md +15 -0
- package/dist/builtin-memory/05-kinds/review/00-base.md +19 -0
- package/dist/builtin-memory/05-kinds/review/01-orchestrator.md +17 -0
- package/dist/builtin-memory/05-kinds/spec/00-base.md +20 -0
- package/dist/builtin-memory/05-kinds/spec/01-orchestrator.md +15 -0
- package/dist/builtin-memory/05-kinds/spec/requirements.md +13 -0
- package/dist/builtin-memory/design.md +62 -0
- package/dist/builtin-memory/development.md +120 -0
- package/dist/builtin-memory/internal/INDEX.md +26 -0
- package/dist/builtin-memory/internal/agent-shaping.md +77 -0
- package/dist/builtin-memory/internal/examples/INDEX.md +15 -0
- package/dist/builtin-memory/internal/examples/imessage-assistant.md +100 -0
- package/dist/builtin-memory/internal/marketplaces.md +164 -0
- package/dist/builtin-memory/internal/nodes-and-canvas.md +51 -0
- package/dist/builtin-memory/internal/plugins.md +249 -0
- package/dist/builtin-memory/internal/storage-tiers.md +41 -0
- package/dist/builtin-memory/planning.md +43 -0
- package/dist/builtin-memory/product.md +80 -0
- package/dist/builtin-memory/spec.md +98 -0
- package/dist/builtin-memory/wedged-child-on-runaway-bash.md +34 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/README.md +47 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/claude-plugin-commands.test.ts +49 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/crtr-commands.test.ts +93 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/memory-slash-commands.test.ts +194 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/provider-rotation.test.ts +2632 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/__tests__/statusline.test.ts +68 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/claude-plugin-commands.ts +492 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crouter-help.ts +95 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/filters.json +7 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/crtr-commands/index.ts +191 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/index.ts +448 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/frontmatter-rules/test.ts +119 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/memory-slash-commands.ts +195 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/provider-rotation.ts +1232 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/statusline.ts +255 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/strip-skills-docs.ts +47 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/extensions/sysprompt-window.ts +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/lib/package.json +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.js +1 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/lib/subscription-state.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/LICENSE +13 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/README.md +172 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/bin.mjs +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/composer.js +219 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +225 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/Document.js +335 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/doc/directives.js +176 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/errors.js +57 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/index.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/log.js +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Alias.js +116 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/cst.js +98 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/parse/parser.js +975 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/public-api.js +102 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/tags.js +96 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/util.js +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/dist/visit.js +233 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/index.js +5 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/browser/package.json +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.d.ts +8 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/cli.mjs +201 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-collection.js +90 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-doc.js +45 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-node.js +112 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.d.ts +63 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/composer.js +224 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-end.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/resolve-props.js +148 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.d.ts +141 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/Document.js +337 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/anchors.js +76 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/applyReviver.js +57 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/createNode.js +90 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.d.ts +49 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/doc/directives.js +178 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.d.ts +21 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/errors.js +62 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.d.ts +25 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/index.js +50 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.d.ts +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/log.js +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Alias.js +118 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Collection.js +151 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Node.js +40 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Pair.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/Scalar.js +27 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/identity.js +53 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/nodes/toJS.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/options.d.ts +350 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst-visit.js +99 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.d.ts +109 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/cst.js +112 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/lexer.js +723 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/line-counter.js +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.d.ts +84 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/parse/parser.js +980 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.d.ts +44 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/public-api.js +107 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/Schema.js +39 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/map.js +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/null.js +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/seq.js +19 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/common/string.js +16 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/bool.js +21 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/float.js +47 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/int.js +42 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/core/schema.js +25 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json/schema.js +64 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.d.ts +48 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/tags.js +99 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/types.d.ts +92 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringify.js +132 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.d.ts +4 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/test-events.js +134 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.d.ts +16 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/util.js +28 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.d.ts +102 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/dist/visit.js +236 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/package.json +97 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/node_modules/yaml/util.js +2 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/package-lock.json +3385 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/package.json +25 -0
- package/dist/builtin-pi-packages/pi-crtr-extensions/tsconfig.json +10 -0
- package/dist/builtin-pi-packages/pi-mode-switch/README.md +36 -0
- package/dist/builtin-pi-packages/pi-mode-switch/bin/mode +36 -0
- package/dist/builtin-pi-packages/pi-mode-switch/extensions/index.ts +449 -0
- package/dist/builtin-pi-packages/pi-mode-switch/package.json +14 -0
- package/dist/builtin-pi-packages/pi-mode-switch/tsconfig.json +9 -0
- package/dist/builtin-views/_lib/states.mjs +161 -0
- package/dist/builtin-views/canvas/core.mjs +657 -0
- package/dist/builtin-views/canvas/text.mjs +58 -0
- package/dist/builtin-views/canvas/tui.mjs +168 -0
- package/dist/builtin-views/canvas/web.jsx +121 -0
- package/dist/builtin-views/chat/core.mjs +684 -0
- package/dist/builtin-views/chat/text.mjs +101 -0
- package/dist/builtin-views/chat/tui.mjs +360 -0
- package/dist/builtin-views/chat/web.jsx +362 -0
- package/dist/builtin-views/git-pr/core.mjs +673 -0
- package/dist/builtin-views/git-pr/text.mjs +84 -0
- package/dist/builtin-views/git-pr/tui.mjs +301 -0
- package/dist/builtin-views/git-pr/web.jsx +216 -0
- package/dist/builtin-views/inbox/_lib/render.mjs +175 -0
- package/dist/builtin-views/inbox/core.mjs +1273 -0
- package/dist/builtin-views/inbox/text.mjs +73 -0
- package/dist/builtin-views/inbox/tui.mjs +314 -0
- package/dist/builtin-views/inbox/web.jsx +188 -0
- package/dist/builtin-views/linkedin/core.mjs +906 -0
- package/dist/builtin-views/linkedin/text.mjs +69 -0
- package/dist/builtin-views/linkedin/tui.mjs +413 -0
- package/dist/builtin-views/linkedin/web.jsx +206 -0
- package/dist/builtin-views/prompt-review/core.mjs +735 -0
- package/dist/builtin-views/prompt-review/text.mjs +15 -0
- package/dist/builtin-views/prompt-review/tui.mjs +196 -0
- package/dist/builtin-views/prompt-review/web.jsx +484 -0
- package/dist/builtin-views/workspace-sidebar/__tests__/core.test.d.ts +1 -0
- package/dist/builtin-views/workspace-sidebar/__tests__/core.test.js +50 -0
- package/dist/builtin-views/workspace-sidebar/__tests__/core.test.ts +53 -0
- package/dist/builtin-views/workspace-sidebar/core.mjs +670 -0
- package/dist/builtin-views/workspace-sidebar/text.mjs +53 -0
- package/dist/builtin-views/workspace-sidebar/tui.mjs +141 -0
- package/dist/builtin-views/workspace-sidebar/web.jsx +109 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +86 -0
- package/dist/clients/attach/__tests__/attach-chrome-remote.test.d.ts +1 -0
- package/dist/clients/attach/__tests__/attach-chrome-remote.test.js +467 -0
- package/dist/clients/attach/__tests__/attach-keybindings.test.d.ts +1 -0
- package/dist/clients/attach/__tests__/attach-keybindings.test.js +141 -0
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.d.ts +1 -0
- package/dist/clients/attach/__tests__/attach-remote-readonly.test.js +191 -0
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.d.ts +1 -0
- package/dist/clients/attach/__tests__/chat-view-snapshot-ordering.test.js +236 -0
- package/dist/clients/attach/__tests__/context-message.test.d.ts +1 -0
- package/dist/clients/attach/__tests__/context-message.test.js +46 -0
- package/dist/clients/attach/__tests__/crtr-output-coverage.test.d.ts +1 -0
- package/dist/clients/attach/__tests__/crtr-output-coverage.test.js +55 -0
- package/dist/clients/attach/__tests__/crtr-output.test.d.ts +1 -0
- package/dist/clients/attach/__tests__/crtr-output.test.js +2103 -0
- package/dist/clients/attach/__tests__/diagram.test.d.ts +1 -0
- package/dist/clients/attach/__tests__/diagram.test.js +42 -0
- package/dist/clients/attach/__tests__/markdown-headings.test.d.ts +1 -0
- package/dist/clients/attach/__tests__/markdown-headings.test.js +27 -0
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.d.ts +1 -0
- package/dist/clients/attach/__tests__/oauth-dialog-lifecycle.test.js +133 -0
- package/dist/clients/attach/__tests__/prompt-preview.test.d.ts +1 -0
- package/dist/clients/attach/__tests__/prompt-preview.test.js +87 -0
- package/dist/clients/attach/__tests__/ref-autocomplete.test.d.ts +1 -0
- package/dist/clients/attach/__tests__/ref-autocomplete.test.js +176 -0
- package/dist/clients/attach/__tests__/titled-editor-preview.test.d.ts +1 -0
- package/dist/clients/attach/__tests__/titled-editor-preview.test.js +271 -0
- package/dist/clients/attach/__tests__/visible-paths.test.d.ts +1 -0
- package/dist/clients/attach/__tests__/visible-paths.test.js +19 -0
- package/dist/clients/attach/chrome/bash-jobs.d.ts +9 -0
- package/dist/clients/attach/chrome/bash-jobs.js +43 -0
- package/dist/clients/attach/chrome/canvas-panels.d.ts +36 -0
- package/dist/clients/attach/chrome/canvas-panels.js +172 -0
- package/dist/clients/attach/chrome/completion-bell.d.ts +10 -0
- package/dist/clients/attach/chrome/completion-bell.js +89 -0
- package/dist/clients/attach/chrome/cron-wait.d.ts +3 -0
- package/dist/clients/attach/chrome/cron-wait.js +34 -0
- package/dist/clients/attach/chrome/git-info.d.ts +20 -0
- package/dist/clients/attach/chrome/git-info.js +44 -0
- package/dist/clients/attach/chrome/roster.d.ts +26 -0
- package/dist/clients/attach/chrome/roster.js +233 -0
- package/dist/clients/attach/chrome/status-line.d.ts +35 -0
- package/dist/clients/attach/chrome/status-line.js +133 -0
- package/dist/clients/attach/chrome/widgets.d.ts +9 -0
- package/dist/clients/attach/chrome/widgets.js +61 -0
- package/dist/clients/attach/command.d.ts +2 -0
- package/dist/clients/attach/command.js +96 -0
- package/dist/clients/attach/config.d.ts +91 -0
- package/dist/clients/attach/config.js +271 -0
- package/dist/clients/attach/input/clipboard-image.d.ts +55 -0
- package/dist/clients/attach/input/clipboard-image.js +237 -0
- package/dist/clients/attach/input/controller.d.ts +210 -0
- package/dist/clients/attach/input/controller.js +689 -0
- package/dist/clients/attach/input/ref-autocomplete.d.ts +75 -0
- package/dist/clients/attach/input/ref-autocomplete.js +135 -0
- package/dist/clients/attach/input/titled-editor.d.ts +209 -0
- package/dist/clients/attach/input/titled-editor.js +801 -0
- package/dist/clients/attach/overlays/auth.d.ts +13 -0
- package/dist/clients/attach/overlays/auth.js +245 -0
- package/dist/clients/attach/overlays/dialogs.d.ts +27 -0
- package/dist/clients/attach/overlays/dialogs.js +102 -0
- package/dist/clients/attach/overlays/file-review.d.ts +9 -0
- package/dist/clients/attach/overlays/file-review.js +181 -0
- package/dist/clients/attach/overlays/graph.d.ts +76 -0
- package/dist/clients/attach/overlays/graph.js +657 -0
- package/dist/clients/attach/overlays/mcp.d.ts +32 -0
- package/dist/clients/attach/overlays/mcp.js +310 -0
- package/dist/clients/attach/overlays/pickers.d.ts +59 -0
- package/dist/clients/attach/overlays/pickers.js +170 -0
- package/dist/clients/attach/render/chat-view.d.ts +185 -0
- package/dist/clients/attach/render/chat-view.js +946 -0
- package/dist/clients/attach/render/context-message.d.ts +14 -0
- package/dist/clients/attach/render/context-message.js +81 -0
- package/dist/clients/attach/render/crtr-output.d.ts +48 -0
- package/dist/clients/attach/render/crtr-output.js +694 -0
- package/dist/clients/attach/render/diagram.d.ts +14 -0
- package/dist/clients/attach/render/diagram.js +135 -0
- package/dist/clients/attach/render/edit-diff.d.ts +6 -0
- package/dist/clients/attach/render/edit-diff.js +263 -0
- package/dist/clients/attach/render/frozen-history.d.ts +38 -0
- package/dist/clients/attach/render/frozen-history.js +100 -0
- package/dist/clients/attach/render/markdown-headings.d.ts +11 -0
- package/dist/clients/attach/render/markdown-headings.js +82 -0
- package/dist/clients/attach/session/banner.d.ts +9 -0
- package/dist/clients/attach/session/banner.js +29 -0
- package/dist/clients/attach/session/bindings.d.ts +12 -0
- package/dist/clients/attach/session/bindings.js +52 -0
- package/dist/clients/attach/session/chrome-refresh.d.ts +34 -0
- package/dist/clients/attach/session/chrome-refresh.js +93 -0
- package/dist/clients/attach/session/connection.d.ts +44 -0
- package/dist/clients/attach/session/connection.js +178 -0
- package/dist/clients/attach/session/context.d.ts +54 -0
- package/dist/clients/attach/session/context.js +16 -0
- package/dist/clients/attach/session/editor-frame.d.ts +43 -0
- package/dist/clients/attach/session/editor-frame.js +136 -0
- package/dist/clients/attach/session/editor-inventory.d.ts +59 -0
- package/dist/clients/attach/session/editor-inventory.js +161 -0
- package/dist/clients/attach/session/focus-events.d.ts +4 -0
- package/dist/clients/attach/session/focus-events.js +12 -0
- package/dist/clients/attach/session/frames.d.ts +43 -0
- package/dist/clients/attach/session/frames.js +170 -0
- package/dist/clients/attach/session/identity.d.ts +16 -0
- package/dist/clients/attach/session/identity.js +25 -0
- package/dist/clients/attach/session/input-wiring.d.ts +31 -0
- package/dist/clients/attach/session/input-wiring.js +128 -0
- package/dist/clients/attach/session/keys.d.ts +22 -0
- package/dist/clients/attach/session/keys.js +60 -0
- package/dist/clients/attach/session/layout.d.ts +20 -0
- package/dist/clients/attach/session/layout.js +56 -0
- package/dist/clients/attach/session/mode.d.ts +25 -0
- package/dist/clients/attach/session/mode.js +97 -0
- package/dist/clients/attach/session/pane-tag.d.ts +15 -0
- package/dist/clients/attach/session/pane-tag.js +43 -0
- package/dist/clients/attach/session/pi-assets.d.ts +1 -0
- package/dist/clients/attach/session/pi-assets.js +24 -0
- package/dist/clients/attach/session/pi-oauth-flows.d.ts +1 -0
- package/dist/clients/attach/session/pi-oauth-flows.js +21 -0
- package/dist/clients/attach/session/reconnect.d.ts +37 -0
- package/dist/clients/attach/session/reconnect.js +127 -0
- package/dist/clients/attach/session/state-sync.d.ts +38 -0
- package/dist/clients/attach/session/state-sync.js +68 -0
- package/dist/clients/attach/session/teardown.d.ts +30 -0
- package/dist/clients/attach/session/teardown.js +96 -0
- package/dist/clients/attach/slash/dispatch.d.ts +124 -0
- package/dist/clients/attach/slash/dispatch.js +696 -0
- package/dist/clients/attach/slash/prompt-preview.d.ts +30 -0
- package/dist/clients/attach/slash/prompt-preview.js +121 -0
- package/dist/clients/attach/viewer.d.ts +8 -0
- package/dist/clients/attach/viewer.js +1559 -0
- package/dist/clients/attach/visible-paths.d.ts +9 -0
- package/dist/clients/attach/visible-paths.js +76 -0
- package/dist/clients/web/__tests__/push-engine.test.d.ts +1 -0
- package/dist/clients/web/__tests__/push-engine.test.js +302 -0
- package/dist/clients/web/__tests__/push-registry.test.d.ts +1 -0
- package/dist/clients/web/__tests__/push-registry.test.js +177 -0
- package/dist/clients/web/dev-server.d.ts +7 -0
- package/dist/clients/web/dev-server.js +60 -0
- package/dist/clients/web/events.d.ts +19 -0
- package/dist/clients/web/events.js +165 -0
- package/dist/clients/web/push-engine.d.ts +108 -0
- package/dist/clients/web/push-engine.js +256 -0
- package/dist/clients/web/push-registry.d.ts +89 -0
- package/dist/clients/web/push-registry.js +378 -0
- package/dist/clients/web/server.d.ts +19 -0
- package/dist/clients/web/server.js +693 -0
- package/dist/clients/web/web-client/shared/protocol.d.ts +322 -0
- package/dist/clients/web/web-client/shared/protocol.js +8 -0
- package/dist/clients/web/web-cmd.d.ts +2 -0
- package/dist/clients/web/web-cmd.js +141 -0
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.d.ts +1 -0
- package/dist/commands/__tests__/api-client-cold-start-diagnostic.test.js +96 -0
- package/dist/commands/__tests__/canvas-config.test.d.ts +1 -0
- package/dist/commands/__tests__/canvas-config.test.js +107 -0
- package/dist/commands/__tests__/human.test.d.ts +1 -0
- package/dist/commands/__tests__/human.test.js +344 -0
- package/dist/commands/__tests__/node-no-kickoff-flag.test.d.ts +1 -0
- package/dist/commands/__tests__/node-no-kickoff-flag.test.js +73 -0
- package/dist/commands/__tests__/node-worktree-flag.test.d.ts +1 -0
- package/dist/commands/__tests__/node-worktree-flag.test.js +49 -0
- package/dist/commands/__tests__/revive-now-gate.test.d.ts +1 -0
- package/dist/commands/__tests__/revive-now-gate.test.js +60 -0
- package/dist/commands/api-client.d.ts +100 -0
- package/dist/commands/api-client.js +377 -0
- package/dist/commands/attention.d.ts +2 -0
- package/dist/commands/attention.js +223 -0
- package/dist/commands/canvas-browse.d.ts +2 -0
- package/dist/commands/canvas-browse.js +95 -0
- package/dist/commands/canvas-config.d.ts +2 -0
- package/dist/commands/canvas-config.js +210 -0
- package/dist/commands/canvas-history/grep.d.ts +1 -0
- package/dist/commands/canvas-history/grep.js +104 -0
- package/dist/commands/canvas-history/read.d.ts +1 -0
- package/dist/commands/canvas-history/read.js +48 -0
- package/dist/commands/canvas-history/search.d.ts +1 -0
- package/dist/commands/canvas-history/search.js +118 -0
- package/dist/commands/canvas-history/shared.d.ts +27 -0
- package/dist/commands/canvas-history/shared.js +76 -0
- package/dist/commands/canvas-history.d.ts +2 -0
- package/dist/commands/canvas-history.js +30 -0
- package/dist/commands/canvas-issue.d.ts +2 -0
- package/dist/commands/canvas-issue.js +149 -0
- package/dist/commands/canvas-prune.d.ts +2 -0
- package/dist/commands/canvas-prune.js +108 -0
- package/dist/commands/canvas-rebuild-index.d.ts +2 -0
- package/dist/commands/canvas-rebuild-index.js +46 -0
- package/dist/commands/canvas-roster.d.ts +2 -0
- package/dist/commands/canvas-roster.js +62 -0
- package/dist/commands/canvas-snapshot.d.ts +2 -0
- package/dist/commands/canvas-snapshot.js +34 -0
- package/dist/commands/canvas-use.d.ts +1 -0
- package/dist/commands/canvas-use.js +63 -0
- package/dist/commands/canvas.d.ts +3 -0
- package/dist/commands/canvas.js +50 -0
- package/dist/commands/chord.d.ts +2 -0
- package/dist/commands/chord.js +242 -0
- package/dist/commands/cron.d.ts +2 -0
- package/dist/commands/cron.js +524 -0
- package/dist/commands/dashboard.d.ts +2 -0
- package/dist/commands/dashboard.js +80 -0
- package/dist/commands/human/prompts.d.ts +8 -0
- package/dist/commands/human/prompts.js +427 -0
- package/dist/commands/human/queue.d.ts +12 -0
- package/dist/commands/human/queue.js +531 -0
- package/dist/commands/human/shared.d.ts +80 -0
- package/dist/commands/human/shared.js +194 -0
- package/dist/commands/human.d.ts +2 -0
- package/dist/commands/human.js +44 -0
- package/dist/commands/memory/delete.d.ts +1 -0
- package/dist/commands/memory/delete.js +77 -0
- package/dist/commands/memory/find.d.ts +1 -0
- package/dist/commands/memory/find.js +192 -0
- package/dist/commands/memory/lint.d.ts +9 -0
- package/dist/commands/memory/lint.js +217 -0
- package/dist/commands/memory/list.d.ts +1 -0
- package/dist/commands/memory/list.js +84 -0
- package/dist/commands/memory/origin.d.ts +1 -0
- package/dist/commands/memory/origin.js +100 -0
- package/dist/commands/memory/read.d.ts +1 -0
- package/dist/commands/memory/read.js +72 -0
- package/dist/commands/memory/shared.d.ts +54 -0
- package/dist/commands/memory/shared.js +225 -0
- package/dist/commands/memory/write.d.ts +1 -0
- package/dist/commands/memory/write.js +142 -0
- package/dist/commands/memory.d.ts +2 -0
- package/dist/commands/memory.js +26 -0
- package/dist/commands/node-context.d.ts +2 -0
- package/dist/commands/node-context.js +157 -0
- package/dist/commands/node-inspect-artifacts.d.ts +1 -0
- package/dist/commands/node-inspect-artifacts.js +109 -0
- package/dist/commands/node-lifecycle-revive.d.ts +12 -0
- package/dist/commands/node-lifecycle-revive.js +287 -0
- package/dist/commands/node-snapshot.d.ts +2 -0
- package/dist/commands/node-snapshot.js +37 -0
- package/dist/commands/node-transcript.d.ts +2 -0
- package/dist/commands/node-transcript.js +62 -0
- package/dist/commands/node-worktree.d.ts +2 -0
- package/dist/commands/node-worktree.js +102 -0
- package/dist/commands/node.d.ts +44 -0
- package/dist/commands/node.js +1943 -0
- package/dist/commands/pkg/cli-inspect.d.ts +17 -0
- package/dist/commands/pkg/cli-inspect.js +190 -0
- package/dist/commands/pkg/cli-manage.d.ts +3 -0
- package/dist/commands/pkg/cli-manage.js +206 -0
- package/dist/commands/pkg/cli.d.ts +1 -0
- package/dist/commands/pkg/cli.js +14 -0
- package/dist/commands/pkg/market-inspect.d.ts +2 -0
- package/dist/commands/pkg/market-inspect.js +141 -0
- package/dist/commands/pkg/market-manage.d.ts +3 -0
- package/dist/commands/pkg/market-manage.js +224 -0
- package/dist/commands/pkg/market.d.ts +1 -0
- package/dist/commands/pkg/market.js +14 -0
- package/dist/commands/pkg/plugin-inspect.d.ts +2 -0
- package/dist/commands/pkg/plugin-inspect.js +150 -0
- package/dist/commands/pkg/plugin-manage.d.ts +19 -0
- package/dist/commands/pkg/plugin-manage.js +398 -0
- package/dist/commands/pkg/plugin.d.ts +1 -0
- package/dist/commands/pkg/plugin.js +14 -0
- package/dist/commands/pkg/shared.d.ts +5 -0
- package/dist/commands/pkg/shared.js +61 -0
- package/dist/commands/pkg.d.ts +2 -0
- package/dist/commands/pkg.js +24 -0
- package/dist/commands/profile/default.d.ts +2 -0
- package/dist/commands/profile/default.js +143 -0
- package/dist/commands/profile/delete.d.ts +1 -0
- package/dist/commands/profile/delete.js +39 -0
- package/dist/commands/profile/env.d.ts +2 -0
- package/dist/commands/profile/env.js +194 -0
- package/dist/commands/profile/list.d.ts +1 -0
- package/dist/commands/profile/list.js +35 -0
- package/dist/commands/profile/new.d.ts +1 -0
- package/dist/commands/profile/new.js +75 -0
- package/dist/commands/profile/project.d.ts +2 -0
- package/dist/commands/profile/project.js +97 -0
- package/dist/commands/profile/rename.d.ts +1 -0
- package/dist/commands/profile/rename.js +42 -0
- package/dist/commands/profile/show.d.ts +1 -0
- package/dist/commands/profile/show.js +50 -0
- package/dist/commands/profile.d.ts +2 -0
- package/dist/commands/profile.js +37 -0
- package/dist/commands/push.d.ts +2 -0
- package/dist/commands/push.js +166 -0
- package/dist/commands/revive.d.ts +2 -0
- package/dist/commands/revive.js +174 -0
- package/dist/commands/search/answer.d.ts +1 -0
- package/dist/commands/search/answer.js +50 -0
- package/dist/commands/search/contents.d.ts +1 -0
- package/dist/commands/search/contents.js +96 -0
- package/dist/commands/search/exa.d.ts +53 -0
- package/dist/commands/search/exa.js +157 -0
- package/dist/commands/search/puremd.d.ts +11 -0
- package/dist/commands/search/puremd.js +53 -0
- package/dist/commands/search/web.d.ts +1 -0
- package/dist/commands/search/web.js +65 -0
- package/dist/commands/search.d.ts +2 -0
- package/dist/commands/search.js +24 -0
- package/dist/commands/surface-edit.d.ts +2 -0
- package/dist/commands/surface-edit.js +159 -0
- package/dist/commands/surface-inspect.d.ts +2 -0
- package/dist/commands/surface-inspect.js +38 -0
- package/dist/commands/surface-node.d.ts +2 -0
- package/dist/commands/surface-node.js +16 -0
- package/dist/commands/surface-reload.d.ts +2 -0
- package/dist/commands/surface-reload.js +127 -0
- package/dist/commands/surface-tmux-spread.d.ts +2 -0
- package/dist/commands/surface-tmux-spread.js +220 -0
- package/dist/commands/surface.d.ts +2 -0
- package/dist/commands/surface.js +48 -0
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.d.ts +1 -0
- package/dist/commands/sys/__tests__/config-broker-thresholds.test.js +95 -0
- package/dist/commands/sys/__tests__/config-keybindings.test.d.ts +1 -0
- package/dist/commands/sys/__tests__/config-keybindings.test.js +55 -0
- package/dist/commands/sys/__tests__/config-model-ladders.test.d.ts +1 -0
- package/dist/commands/sys/__tests__/config-model-ladders.test.js +121 -0
- package/dist/commands/sys/__tests__/helpers/setup-runtime.d.ts +5 -0
- package/dist/commands/sys/__tests__/helpers/setup-runtime.js +19 -0
- package/dist/commands/sys/__tests__/setup-core.test.d.ts +1 -0
- package/dist/commands/sys/__tests__/setup-core.test.js +291 -0
- package/dist/commands/sys/__tests__/setup-front-door.test.d.ts +1 -0
- package/dist/commands/sys/__tests__/setup-front-door.test.js +137 -0
- package/dist/commands/sys/__tests__/setup-models.test.d.ts +1 -0
- package/dist/commands/sys/__tests__/setup-models.test.js +205 -0
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.d.ts +1 -0
- package/dist/commands/sys/__tests__/setup-providers-viewport.test.js +155 -0
- package/dist/commands/sys/__tests__/sync-deps.test.d.ts +1 -0
- package/dist/commands/sys/__tests__/sync-deps.test.js +188 -0
- package/dist/commands/sys/__tests__/sync-import.test.d.ts +1 -0
- package/dist/commands/sys/__tests__/sync-import.test.js +314 -0
- package/dist/commands/sys/config.d.ts +1 -0
- package/dist/commands/sys/config.js +292 -0
- package/dist/commands/sys/daemon.d.ts +2 -0
- package/dist/commands/sys/daemon.js +188 -0
- package/dist/commands/sys/doctor.d.ts +1 -0
- package/dist/commands/sys/doctor.js +528 -0
- package/dist/commands/sys/feedback.d.ts +1 -0
- package/dist/commands/sys/feedback.js +174 -0
- package/dist/commands/sys/logs.d.ts +1 -0
- package/dist/commands/sys/logs.js +127 -0
- package/dist/commands/sys/prompt-review.d.ts +1 -0
- package/dist/commands/sys/prompt-review.js +291 -0
- package/dist/commands/sys/promptstudio.d.ts +2 -0
- package/dist/commands/sys/promptstudio.js +65 -0
- package/dist/commands/sys/setup-core.d.ts +138 -0
- package/dist/commands/sys/setup-core.js +582 -0
- package/dist/commands/sys/setup-wizard.d.ts +130 -0
- package/dist/commands/sys/setup-wizard.js +2310 -0
- package/dist/commands/sys/setup.d.ts +6 -0
- package/dist/commands/sys/setup.js +36 -0
- package/dist/commands/sys/shared.d.ts +51 -0
- package/dist/commands/sys/shared.js +81 -0
- package/dist/commands/sys/support/prepare.d.ts +13 -0
- package/dist/commands/sys/support/prepare.js +235 -0
- package/dist/commands/sys/support/submit.d.ts +19 -0
- package/dist/commands/sys/support/submit.js +525 -0
- package/dist/commands/sys/support.d.ts +2 -0
- package/dist/commands/sys/support.js +18 -0
- package/dist/commands/sys/sync-deps.d.ts +19 -0
- package/dist/commands/sys/sync-deps.js +508 -0
- package/dist/commands/sys/sync-project-guidance.d.ts +1 -0
- package/dist/commands/sys/sync-project-guidance.js +345 -0
- package/dist/commands/sys/sync-shared.d.ts +7 -0
- package/dist/commands/sys/sync-shared.js +49 -0
- package/dist/commands/sys/sync-skills.d.ts +1 -0
- package/dist/commands/sys/sync-skills.js +306 -0
- package/dist/commands/sys/sync.d.ts +2 -0
- package/dist/commands/sys/sync.js +18 -0
- package/dist/commands/sys/sysprompt.d.ts +1 -0
- package/dist/commands/sys/sysprompt.js +97 -0
- package/dist/commands/sys/update.d.ts +2 -0
- package/dist/commands/sys/update.js +139 -0
- package/dist/commands/sys.d.ts +2 -0
- package/dist/commands/sys.js +30 -0
- package/dist/commands/view-cycle.d.ts +2 -0
- package/dist/commands/view-cycle.js +130 -0
- package/dist/commands/view-list.d.ts +2 -0
- package/dist/commands/view-list.js +66 -0
- package/dist/commands/view-new.d.ts +2 -0
- package/dist/commands/view-new.js +74 -0
- package/dist/commands/view-pick.d.ts +6 -0
- package/dist/commands/view-pick.js +129 -0
- package/dist/commands/view-run.d.ts +2 -0
- package/dist/commands/view-run.js +214 -0
- package/dist/commands/view.d.ts +2 -0
- package/dist/commands/view.js +31 -0
- package/dist/commands/workspace.d.ts +2 -0
- package/dist/commands/workspace.js +165 -0
- package/dist/core/__tests__/base-worker-prompt.test.d.ts +1 -0
- package/dist/core/__tests__/base-worker-prompt.test.js +60 -0
- package/dist/core/__tests__/boot-fault-attempt.test.d.ts +1 -0
- package/dist/core/__tests__/boot-fault-attempt.test.js +83 -0
- package/dist/core/__tests__/boot.test.d.ts +1 -0
- package/dist/core/__tests__/boot.test.js +275 -0
- package/dist/core/__tests__/branded-host-concurrency.test.d.ts +1 -0
- package/dist/core/__tests__/branded-host-concurrency.test.js +72 -0
- package/dist/core/__tests__/broker-fork-seam.test.d.ts +1 -0
- package/dist/core/__tests__/broker-fork-seam.test.js +118 -0
- package/dist/core/__tests__/broker-launch-candidates.test.d.ts +1 -0
- package/dist/core/__tests__/broker-launch-candidates.test.js +241 -0
- package/dist/core/__tests__/broker-preflight.test.d.ts +1 -0
- package/dist/core/__tests__/broker-preflight.test.js +95 -0
- package/dist/core/__tests__/broker-sdk-wiring.test.d.ts +1 -0
- package/dist/core/__tests__/broker-sdk-wiring.test.js +732 -0
- package/dist/core/__tests__/broker-snapshot-history.test.d.ts +1 -0
- package/dist/core/__tests__/broker-snapshot-history.test.js +213 -0
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.d.ts +1 -0
- package/dist/core/__tests__/canvas-inbox-watcher-hold.test.js +502 -0
- package/dist/core/__tests__/canvas-inbox-watcher.test.d.ts +1 -0
- package/dist/core/__tests__/canvas-inbox-watcher.test.js +255 -0
- package/dist/core/__tests__/canvas.test.d.ts +1 -0
- package/dist/core/__tests__/canvas.test.js +201 -0
- package/dist/core/__tests__/chat-view-reconnect.test.d.ts +1 -0
- package/dist/core/__tests__/chat-view-reconnect.test.js +105 -0
- package/dist/core/__tests__/child-death-wake.test.d.ts +1 -0
- package/dist/core/__tests__/child-death-wake.test.js +161 -0
- package/dist/core/__tests__/close.test.d.ts +1 -0
- package/dist/core/__tests__/close.test.js +254 -0
- package/dist/core/__tests__/command-plugins-surfaces.test.d.ts +1 -0
- package/dist/core/__tests__/command-plugins-surfaces.test.js +325 -0
- package/dist/core/__tests__/command-plugins.test.d.ts +1 -0
- package/dist/core/__tests__/command-plugins.test.js +448 -0
- package/dist/core/__tests__/connection-reconnect-resume.test.d.ts +1 -0
- package/dist/core/__tests__/connection-reconnect-resume.test.js +36 -0
- package/dist/core/__tests__/context-intro.test.d.ts +1 -0
- package/dist/core/__tests__/context-intro.test.js +256 -0
- package/dist/core/__tests__/cron-broker-capacity.test.d.ts +1 -0
- package/dist/core/__tests__/cron-broker-capacity.test.js +100 -0
- package/dist/core/__tests__/daemon-boot.test.d.ts +1 -0
- package/dist/core/__tests__/daemon-boot.test.js +374 -0
- package/dist/core/__tests__/daemon-wedge.test.d.ts +1 -0
- package/dist/core/__tests__/daemon-wedge.test.js +104 -0
- package/dist/core/__tests__/dead-node-policy-table.test.d.ts +1 -0
- package/dist/core/__tests__/dead-node-policy-table.test.js +103 -0
- package/dist/core/__tests__/deferred-no-wake.test.d.ts +1 -0
- package/dist/core/__tests__/deferred-no-wake.test.js +514 -0
- package/dist/core/__tests__/events-contract.test.d.ts +1 -0
- package/dist/core/__tests__/events-contract.test.js +76 -0
- package/dist/core/__tests__/fault-classifier.test.d.ts +1 -0
- package/dist/core/__tests__/fault-classifier.test.js +71 -0
- package/dist/core/__tests__/finalization-migration.test.d.ts +1 -0
- package/dist/core/__tests__/finalization-migration.test.js +38 -0
- package/dist/core/__tests__/fixtures/api-server-host.d.ts +1 -0
- package/dist/core/__tests__/fixtures/api-server-host.js +47 -0
- package/dist/core/__tests__/fixtures/c3-custom-provider-ext.d.ts +2 -0
- package/dist/core/__tests__/fixtures/c3-custom-provider-ext.js +34 -0
- package/dist/core/__tests__/fixtures/c5-command-boundary-ext.d.ts +2 -0
- package/dist/core/__tests__/fixtures/c5-command-boundary-ext.js +8 -0
- package/dist/core/__tests__/fixtures/extra-extension.d.ts +1 -0
- package/dist/core/__tests__/fixtures/extra-extension.js +3 -0
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +310 -0
- package/dist/core/__tests__/fixtures/fake-engine.js +1210 -0
- package/dist/core/__tests__/fixtures/fake-pi-host.d.ts +2 -0
- package/dist/core/__tests__/fixtures/fake-pi-host.js +311 -0
- package/dist/core/__tests__/fixtures/metadata-migration-race.d.ts +1 -0
- package/dist/core/__tests__/fixtures/metadata-migration-race.js +49 -0
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.d.ts +1 -0
- package/dist/core/__tests__/fixtures/spawn-proof-target.test.js +15 -0
- package/dist/core/__tests__/flagship-lifecycle.test.d.ts +1 -0
- package/dist/core/__tests__/flagship-lifecycle.test.js +303 -0
- package/dist/core/__tests__/focuses.test.d.ts +1 -0
- package/dist/core/__tests__/focuses.test.js +208 -0
- package/dist/core/__tests__/fork.test.d.ts +1 -0
- package/dist/core/__tests__/fork.test.js +108 -0
- package/dist/core/__tests__/full/broker-attach-limits.test.d.ts +1 -0
- package/dist/core/__tests__/full/broker-attach-limits.test.js +147 -0
- package/dist/core/__tests__/full/broker-attach-stream.test.d.ts +1 -0
- package/dist/core/__tests__/full/broker-attach-stream.test.js +133 -0
- package/dist/core/__tests__/full/broker-crash-teardown.test.d.ts +1 -0
- package/dist/core/__tests__/full/broker-crash-teardown.test.js +122 -0
- package/dist/core/__tests__/full/broker-deliver-ack.test.d.ts +1 -0
- package/dist/core/__tests__/full/broker-deliver-ack.test.js +73 -0
- package/dist/core/__tests__/full/broker-dialogs.test.d.ts +1 -0
- package/dist/core/__tests__/full/broker-dialogs.test.js +180 -0
- package/dist/core/__tests__/full/broker-display-snapshot.test.d.ts +1 -0
- package/dist/core/__tests__/full/broker-display-snapshot.test.js +75 -0
- package/dist/core/__tests__/full/broker-dormant-wake.test.d.ts +1 -0
- package/dist/core/__tests__/full/broker-dormant-wake.test.js +130 -0
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +1 -0
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +57 -0
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +1 -0
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +80 -0
- package/dist/core/__tests__/full/broker-pane-resolution.test.d.ts +1 -0
- package/dist/core/__tests__/full/broker-pane-resolution.test.js +155 -0
- package/dist/core/__tests__/full/broker-provider-retry.test.d.ts +1 -0
- package/dist/core/__tests__/full/broker-provider-retry.test.js +387 -0
- package/dist/core/__tests__/full/cascade-close.test.d.ts +1 -0
- package/dist/core/__tests__/full/cascade-close.test.js +240 -0
- package/dist/core/__tests__/full/consult-startup-failure.test.d.ts +1 -0
- package/dist/core/__tests__/full/consult-startup-failure.test.js +124 -0
- package/dist/core/__tests__/full/detach-focus.test.d.ts +1 -0
- package/dist/core/__tests__/full/detach-focus.test.js +126 -0
- package/dist/core/__tests__/full/idle-release-settlement.test.d.ts +1 -0
- package/dist/core/__tests__/full/idle-release-settlement.test.js +108 -0
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.d.ts +1 -0
- package/dist/core/__tests__/full/issue-146-yield-spawn-focus.test.js +107 -0
- package/dist/core/__tests__/full/park-clock-release.test.d.ts +1 -0
- package/dist/core/__tests__/full/park-clock-release.test.js +56 -0
- package/dist/core/__tests__/full/yield-message-transaction.test.d.ts +1 -0
- package/dist/core/__tests__/full/yield-message-transaction.test.js +70 -0
- package/dist/core/__tests__/helpers/broker-clients.d.ts +43 -0
- package/dist/core/__tests__/helpers/broker-clients.js +182 -0
- package/dist/core/__tests__/helpers/fleet.d.ts +12 -0
- package/dist/core/__tests__/helpers/fleet.js +45 -0
- package/dist/core/__tests__/helpers/harness.d.ts +128 -0
- package/dist/core/__tests__/helpers/harness.js +867 -0
- package/dist/core/__tests__/helpers/viewer-panes.d.ts +12 -0
- package/dist/core/__tests__/helpers/viewer-panes.js +133 -0
- package/dist/core/__tests__/history-inbox.test.d.ts +1 -0
- package/dist/core/__tests__/history-inbox.test.js +105 -0
- package/dist/core/__tests__/host-teardown-process-group.test.d.ts +1 -0
- package/dist/core/__tests__/host-teardown-process-group.test.js +476 -0
- package/dist/core/__tests__/human-cancel-guard.test.d.ts +1 -0
- package/dist/core/__tests__/human-cancel-guard.test.js +71 -0
- package/dist/core/__tests__/human-deliver-e2e.test.d.ts +1 -0
- package/dist/core/__tests__/human-deliver-e2e.test.js +123 -0
- package/dist/core/__tests__/human-deliver.test.d.ts +1 -0
- package/dist/core/__tests__/human-deliver.test.js +399 -0
- package/dist/core/__tests__/human-node-not-supervised.test.d.ts +1 -0
- package/dist/core/__tests__/human-node-not-supervised.test.js +94 -0
- package/dist/core/__tests__/inline-memory-refs.test.d.ts +1 -0
- package/dist/core/__tests__/inline-memory-refs.test.js +320 -0
- package/dist/core/__tests__/kickoff.test.d.ts +1 -0
- package/dist/core/__tests__/kickoff.test.js +148 -0
- package/dist/core/__tests__/lifecycle.test.d.ts +1 -0
- package/dist/core/__tests__/lifecycle.test.js +165 -0
- package/dist/core/__tests__/live-lifecycle-prompt.test.d.ts +1 -0
- package/dist/core/__tests__/live-lifecycle-prompt.test.js +51 -0
- package/dist/core/__tests__/live-mutation-verbs.test.d.ts +1 -0
- package/dist/core/__tests__/live-mutation-verbs.test.js +195 -0
- package/dist/core/__tests__/live-mutation.test.d.ts +1 -0
- package/dist/core/__tests__/live-mutation.test.js +197 -0
- package/dist/core/__tests__/memory-index-render.test.d.ts +1 -0
- package/dist/core/__tests__/memory-index-render.test.js +60 -0
- package/dist/core/__tests__/memory-resolver-precedence.test.d.ts +1 -0
- package/dist/core/__tests__/memory-resolver-precedence.test.js +169 -0
- package/dist/core/__tests__/migration.test.d.ts +1 -0
- package/dist/core/__tests__/migration.test.js +717 -0
- package/dist/core/__tests__/model-pin-durability.test.d.ts +1 -0
- package/dist/core/__tests__/model-pin-durability.test.js +124 -0
- package/dist/core/__tests__/on-read-crouter-home-fence.test.d.ts +1 -0
- package/dist/core/__tests__/on-read-crouter-home-fence.test.js +67 -0
- package/dist/core/__tests__/on-read-dedup-resume.test.d.ts +1 -0
- package/dist/core/__tests__/on-read-dedup-resume.test.js +121 -0
- package/dist/core/__tests__/on-read-identity.test.d.ts +1 -0
- package/dist/core/__tests__/on-read-identity.test.js +68 -0
- package/dist/core/__tests__/parse-argv-stdin-secret.test.d.ts +1 -0
- package/dist/core/__tests__/parse-argv-stdin-secret.test.js +26 -0
- package/dist/core/__tests__/passive-subscription.test.d.ts +1 -0
- package/dist/core/__tests__/passive-subscription.test.js +212 -0
- package/dist/core/__tests__/pid-identity-match.test.d.ts +1 -0
- package/dist/core/__tests__/pid-identity-match.test.js +145 -0
- package/dist/core/__tests__/pid-zombie.test.d.ts +1 -0
- package/dist/core/__tests__/pid-zombie.test.js +42 -0
- package/dist/core/__tests__/preview-registry-sync.test.d.ts +1 -0
- package/dist/core/__tests__/preview-registry-sync.test.js +65 -0
- package/dist/core/__tests__/prune-to-limit.test.d.ts +1 -0
- package/dist/core/__tests__/prune-to-limit.test.js +126 -0
- package/dist/core/__tests__/prune.test.d.ts +1 -0
- package/dist/core/__tests__/prune.test.js +135 -0
- package/dist/core/__tests__/push-final-guard.test.d.ts +1 -0
- package/dist/core/__tests__/push-final-guard.test.js +184 -0
- package/dist/core/__tests__/refresh-stall-recycle.test.d.ts +1 -0
- package/dist/core/__tests__/refresh-stall-recycle.test.js +101 -0
- package/dist/core/__tests__/relaunch-root.test.d.ts +1 -0
- package/dist/core/__tests__/relaunch-root.test.js +114 -0
- package/dist/core/__tests__/remote-canvas-target.test.d.ts +1 -0
- package/dist/core/__tests__/remote-canvas-target.test.js +87 -0
- package/dist/core/__tests__/reset.test.d.ts +1 -0
- package/dist/core/__tests__/reset.test.js +69 -0
- package/dist/core/__tests__/respawn-throttle.test.d.ts +1 -0
- package/dist/core/__tests__/respawn-throttle.test.js +154 -0
- package/dist/core/__tests__/review-model-floor.test.d.ts +1 -0
- package/dist/core/__tests__/review-model-floor.test.js +104 -0
- package/dist/core/__tests__/revive-all.test.d.ts +1 -0
- package/dist/core/__tests__/revive-all.test.js +147 -0
- package/dist/core/__tests__/revive.test.d.ts +1 -0
- package/dist/core/__tests__/revive.test.js +575 -0
- package/dist/core/__tests__/scope-crouter-home-fence.test.d.ts +1 -0
- package/dist/core/__tests__/scope-crouter-home-fence.test.js +55 -0
- package/dist/core/__tests__/secrets.test.d.ts +1 -0
- package/dist/core/__tests__/secrets.test.js +55 -0
- package/dist/core/__tests__/session-branch.test.d.ts +1 -0
- package/dist/core/__tests__/session-branch.test.js +61 -0
- package/dist/core/__tests__/session-cycles.test.d.ts +1 -0
- package/dist/core/__tests__/session-cycles.test.js +77 -0
- package/dist/core/__tests__/session-model.test.d.ts +1 -0
- package/dist/core/__tests__/session-model.test.js +129 -0
- package/dist/core/__tests__/spawn-no-kickoff.test.d.ts +1 -0
- package/dist/core/__tests__/spawn-no-kickoff.test.js +119 -0
- package/dist/core/__tests__/spawn-root.test.d.ts +1 -0
- package/dist/core/__tests__/spawn-root.test.js +320 -0
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.d.ts +1 -0
- package/dist/core/__tests__/spawn-worktree-id-conflict.test.js +59 -0
- package/dist/core/__tests__/stdin-body-no-discard.test.d.ts +1 -0
- package/dist/core/__tests__/stdin-body-no-discard.test.js +33 -0
- package/dist/core/__tests__/stdout-errors.test.d.ts +1 -0
- package/dist/core/__tests__/stdout-errors.test.js +16 -0
- package/dist/core/__tests__/steer-note.test.d.ts +1 -0
- package/dist/core/__tests__/steer-note.test.js +41 -0
- package/dist/core/__tests__/stop-guard.test.d.ts +1 -0
- package/dist/core/__tests__/stop-guard.test.js +157 -0
- package/dist/core/__tests__/stream-watchdog.test.d.ts +1 -0
- package/dist/core/__tests__/stream-watchdog.test.js +154 -0
- package/dist/core/__tests__/subcommand-tier.test.d.ts +1 -0
- package/dist/core/__tests__/subcommand-tier.test.js +99 -0
- package/dist/core/__tests__/subscription-delivery.test.d.ts +1 -0
- package/dist/core/__tests__/subscription-delivery.test.js +211 -0
- package/dist/core/__tests__/subscription-pool-credential-guard.test.d.ts +1 -0
- package/dist/core/__tests__/subscription-pool-credential-guard.test.js +94 -0
- package/dist/core/__tests__/test-runner-cheap-sharding.test.d.ts +1 -0
- package/dist/core/__tests__/test-runner-cheap-sharding.test.js +97 -0
- package/dist/core/__tests__/tmux-surface.test.d.ts +1 -0
- package/dist/core/__tests__/tmux-surface.test.js +470 -0
- package/dist/core/__tests__/wake-bearings.test.d.ts +1 -0
- package/dist/core/__tests__/wake-bearings.test.js +102 -0
- package/dist/core/__tests__/worktree.test.d.ts +1 -0
- package/dist/core/__tests__/worktree.test.js +876 -0
- package/dist/core/__tests__/yield-ensures-daemon.test.d.ts +1 -0
- package/dist/core/__tests__/yield-ensures-daemon.test.js +54 -0
- package/dist/core/auth-file.d.ts +40 -0
- package/dist/core/auth-file.js +177 -0
- package/dist/core/auth-interaction.d.ts +19 -0
- package/dist/core/auth-interaction.js +94 -0
- package/dist/core/auto-update.d.ts +1 -0
- package/dist/core/auto-update.js +93 -0
- package/dist/core/bash-jobs.d.ts +55 -0
- package/dist/core/bash-jobs.js +150 -0
- package/dist/core/bootstrap.d.ts +5 -0
- package/dist/core/bootstrap.js +98 -0
- package/dist/core/broker-client/__tests__/transport-relay.test.d.ts +1 -0
- package/dist/core/broker-client/__tests__/transport-relay.test.js +213 -0
- package/dist/core/broker-client/client.d.ts +97 -0
- package/dist/core/broker-client/client.js +189 -0
- package/dist/core/broker-client/index.d.ts +1 -0
- package/dist/core/broker-client/index.js +13 -0
- package/dist/core/broker-client/transport-relay.d.ts +51 -0
- package/dist/core/broker-client/transport-relay.js +169 -0
- package/dist/core/broker-client/transport-socket.d.ts +29 -0
- package/dist/core/broker-client/transport-socket.js +164 -0
- package/dist/core/broker-client/transport.d.ts +32 -0
- package/dist/core/broker-client/transport.js +26 -0
- package/dist/core/canvas/__tests__/attention.test.d.ts +1 -0
- package/dist/core/canvas/__tests__/attention.test.js +97 -0
- package/dist/core/canvas/__tests__/human-work-outbox.test.d.ts +1 -0
- package/dist/core/canvas/__tests__/human-work-outbox.test.js +123 -0
- package/dist/core/canvas/__tests__/remote-canvas-source.test.d.ts +1 -0
- package/dist/core/canvas/__tests__/remote-canvas-source.test.js +372 -0
- package/dist/core/canvas/__tests__/remote-event-stream.test.d.ts +1 -0
- package/dist/core/canvas/__tests__/remote-event-stream.test.js +146 -0
- package/dist/core/canvas/__tests__/render-remote.test.d.ts +1 -0
- package/dist/core/canvas/__tests__/render-remote.test.js +241 -0
- package/dist/core/canvas/__tests__/source-resolve.test.d.ts +1 -0
- package/dist/core/canvas/__tests__/source-resolve.test.js +77 -0
- package/dist/core/canvas/attention.d.ts +19 -0
- package/dist/core/canvas/attention.js +87 -0
- package/dist/core/canvas/boot-id.d.ts +6 -0
- package/dist/core/canvas/boot-id.js +26 -0
- package/dist/core/canvas/boot.d.ts +93 -0
- package/dist/core/canvas/boot.js +190 -0
- package/dist/core/canvas/browse/__tests__/model.test.d.ts +1 -0
- package/dist/core/canvas/browse/__tests__/model.test.js +290 -0
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.d.ts +1 -0
- package/dist/core/canvas/browse/__tests__/rebuild-coalescer.test.js +134 -0
- package/dist/core/canvas/browse/__tests__/render.test.d.ts +1 -0
- package/dist/core/canvas/browse/__tests__/render.test.js +111 -0
- package/dist/core/canvas/browse/app.d.ts +41 -0
- package/dist/core/canvas/browse/app.js +916 -0
- package/dist/core/canvas/browse/model.d.ts +169 -0
- package/dist/core/canvas/browse/model.js +485 -0
- package/dist/core/canvas/browse/pins.d.ts +4 -0
- package/dist/core/canvas/browse/pins.js +29 -0
- package/dist/core/canvas/browse/rebuild-coalescer.d.ts +7 -0
- package/dist/core/canvas/browse/rebuild-coalescer.js +61 -0
- package/dist/core/canvas/browse/render.d.ts +59 -0
- package/dist/core/canvas/browse/render.js +550 -0
- package/dist/core/canvas/canvas.d.ts +358 -0
- package/dist/core/canvas/canvas.js +897 -0
- package/dist/core/canvas/crons.d.ts +222 -0
- package/dist/core/canvas/crons.js +367 -0
- package/dist/core/canvas/daemon-owner.d.ts +67 -0
- package/dist/core/canvas/daemon-owner.js +141 -0
- package/dist/core/canvas/db.d.ts +30 -0
- package/dist/core/canvas/db.js +1167 -0
- package/dist/core/canvas/extensions.d.ts +5 -0
- package/dist/core/canvas/extensions.js +39 -0
- package/dist/core/canvas/focuses.d.ts +22 -0
- package/dist/core/canvas/focuses.js +81 -0
- package/dist/core/canvas/history.d.ts +91 -0
- package/dist/core/canvas/history.js +490 -0
- package/dist/core/canvas/human-work-outbox.d.ts +73 -0
- package/dist/core/canvas/human-work-outbox.js +261 -0
- package/dist/core/canvas/index.d.ts +11 -0
- package/dist/core/canvas/index.js +13 -0
- package/dist/core/canvas/install-id.d.ts +9 -0
- package/dist/core/canvas/install-id.js +84 -0
- package/dist/core/canvas/labels.d.ts +28 -0
- package/dist/core/canvas/labels.js +38 -0
- package/dist/core/canvas/meta-file.d.ts +20 -0
- package/dist/core/canvas/meta-file.js +98 -0
- package/dist/core/canvas/nav-model.d.ts +55 -0
- package/dist/core/canvas/nav-model.js +284 -0
- package/dist/core/canvas/nav-render.d.ts +124 -0
- package/dist/core/canvas/nav-render.js +266 -0
- package/dist/core/canvas/paths.d.ts +81 -0
- package/dist/core/canvas/paths.js +164 -0
- package/dist/core/canvas/pid.d.ts +335 -0
- package/dist/core/canvas/pid.js +636 -0
- package/dist/core/canvas/remote-canvas-source.d.ts +62 -0
- package/dist/core/canvas/remote-canvas-source.js +231 -0
- package/dist/core/canvas/remote-event-stream.d.ts +24 -0
- package/dist/core/canvas/remote-event-stream.js +94 -0
- package/dist/core/canvas/render-source.d.ts +132 -0
- package/dist/core/canvas/render-source.js +457 -0
- package/dist/core/canvas/render.d.ts +47 -0
- package/dist/core/canvas/render.js +237 -0
- package/dist/core/canvas/source.d.ts +35 -0
- package/dist/core/canvas/source.js +44 -0
- package/dist/core/canvas/status-glyph.d.ts +42 -0
- package/dist/core/canvas/status-glyph.js +116 -0
- package/dist/core/canvas/telemetry.d.ts +14 -0
- package/dist/core/canvas/telemetry.js +35 -0
- package/dist/core/canvas/types.d.ts +302 -0
- package/dist/core/canvas/types.js +8 -0
- package/dist/core/clipboard-text.d.ts +3 -0
- package/dist/core/clipboard-text.js +39 -0
- package/dist/core/command-manifests/registry.d.ts +43 -0
- package/dist/core/command-manifests/registry.js +103 -0
- package/dist/core/command-manifests/schema.d.ts +87 -0
- package/dist/core/command-manifests/schema.js +849 -0
- package/dist/core/command-plugins/adapter.d.ts +22 -0
- package/dist/core/command-plugins/adapter.js +160 -0
- package/dist/core/command-plugins/compose.d.ts +11 -0
- package/dist/core/command-plugins/compose.js +88 -0
- package/dist/core/command-plugins/discovery.d.ts +74 -0
- package/dist/core/command-plugins/discovery.js +291 -0
- package/dist/core/command.d.ts +175 -0
- package/dist/core/command.js +636 -0
- package/dist/core/config.d.ts +125 -0
- package/dist/core/config.js +620 -0
- package/dist/core/configured-clis/cache.d.ts +16 -0
- package/dist/core/configured-clis/cache.js +57 -0
- package/dist/core/configured-clis/compose.d.ts +14 -0
- package/dist/core/configured-clis/compose.js +60 -0
- package/dist/core/configured-clis/discovery.d.ts +47 -0
- package/dist/core/configured-clis/discovery.js +173 -0
- package/dist/core/configured-clis/fetch.d.ts +51 -0
- package/dist/core/configured-clis/fetch.js +156 -0
- package/dist/core/configured-clis/invoker.d.ts +36 -0
- package/dist/core/configured-clis/invoker.js +547 -0
- package/dist/core/configured-clis/manifest.d.ts +24 -0
- package/dist/core/configured-clis/manifest.js +284 -0
- package/dist/core/configured-clis/registration.d.ts +40 -0
- package/dist/core/configured-clis/registration.js +201 -0
- package/dist/core/errors.d.ts +27 -0
- package/dist/core/errors.js +48 -0
- package/dist/core/events/emit.d.ts +4 -0
- package/dist/core/events/emit.js +17 -0
- package/dist/core/events/envelope.d.ts +2 -0
- package/dist/core/events/envelope.js +84 -0
- package/dist/core/events/errors.d.ts +4 -0
- package/dist/core/events/errors.js +69 -0
- package/dist/core/events/index.d.ts +5 -0
- package/dist/core/events/index.js +4 -0
- package/dist/core/events/operation-id.d.ts +4 -0
- package/dist/core/events/operation-id.js +24 -0
- package/dist/core/events/read.d.ts +40 -0
- package/dist/core/events/read.js +639 -0
- package/dist/core/events/serialize.d.ts +4 -0
- package/dist/core/events/serialize.js +199 -0
- package/dist/core/events/source.d.ts +18 -0
- package/dist/core/events/source.js +47 -0
- package/dist/core/events/types.d.ts +68 -0
- package/dist/core/events/types.js +11 -0
- package/dist/core/fault-classifier.d.ts +43 -0
- package/dist/core/fault-classifier.js +143 -0
- package/dist/core/feed/__tests__/coalesce-human.test.d.ts +1 -0
- package/dist/core/feed/__tests__/coalesce-human.test.js +36 -0
- package/dist/core/feed/__tests__/empty-node-guard.test.d.ts +1 -0
- package/dist/core/feed/__tests__/empty-node-guard.test.js +45 -0
- package/dist/core/feed/__tests__/inbox-migrate.test.d.ts +1 -0
- package/dist/core/feed/__tests__/inbox-migrate.test.js +53 -0
- package/dist/core/feed/feed.d.ts +31 -0
- package/dist/core/feed/feed.js +159 -0
- package/dist/core/feed/inbox-migrate.d.ts +11 -0
- package/dist/core/feed/inbox-migrate.js +135 -0
- package/dist/core/feed/inbox.d.ts +84 -0
- package/dist/core/feed/inbox.js +407 -0
- package/dist/core/feed/passive.d.ts +14 -0
- package/dist/core/feed/passive.js +114 -0
- package/dist/core/frontmatter.d.ts +8 -0
- package/dist/core/frontmatter.js +35 -0
- package/dist/core/fs-utils.d.ts +21 -0
- package/dist/core/fs-utils.js +149 -0
- package/dist/core/git.d.ts +22 -0
- package/dist/core/git.js +72 -0
- package/dist/core/help.d.ts +223 -0
- package/dist/core/help.js +275 -0
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.d.ts +1 -0
- package/dist/core/host-exports/__tests__/export-prunes-boot-skill.test.js +84 -0
- package/dist/core/host-exports/builtins.d.ts +50 -0
- package/dist/core/host-exports/builtins.js +68 -0
- package/dist/core/host-exports/export.d.ts +32 -0
- package/dist/core/host-exports/export.js +128 -0
- package/dist/core/inspector/core.d.ts +23 -0
- package/dist/core/inspector/core.js +148 -0
- package/dist/core/inspector/model.d.ts +54 -0
- package/dist/core/inspector/model.js +182 -0
- package/dist/core/inspector/text.d.ts +5 -0
- package/dist/core/inspector/text.js +32 -0
- package/dist/core/inspector/tui.d.ts +3 -0
- package/dist/core/inspector/tui.js +220 -0
- package/dist/core/io.d.ts +73 -0
- package/dist/core/io.js +254 -0
- package/dist/core/keybindings/__tests__/bespoke-consumers.test.d.ts +1 -0
- package/dist/core/keybindings/__tests__/bespoke-consumers.test.js +40 -0
- package/dist/core/keybindings/__tests__/inbox-affordance.test.d.ts +1 -0
- package/dist/core/keybindings/__tests__/inbox-affordance.test.js +38 -0
- package/dist/core/keybindings/__tests__/resolve.test.d.ts +1 -0
- package/dist/core/keybindings/__tests__/resolve.test.js +233 -0
- package/dist/core/keybindings/background-bash.d.ts +13 -0
- package/dist/core/keybindings/background-bash.js +34 -0
- package/dist/core/keybindings/catalog.d.ts +15 -0
- package/dist/core/keybindings/catalog.js +285 -0
- package/dist/core/keybindings/inbox.d.ts +21 -0
- package/dist/core/keybindings/inbox.js +35 -0
- package/dist/core/keybindings/index.d.ts +7 -0
- package/dist/core/keybindings/index.js +6 -0
- package/dist/core/keybindings/match.d.ts +29 -0
- package/dist/core/keybindings/match.js +105 -0
- package/dist/core/keybindings/persistence.d.ts +14 -0
- package/dist/core/keybindings/persistence.js +31 -0
- package/dist/core/keybindings/resolve.d.ts +22 -0
- package/dist/core/keybindings/resolve.js +333 -0
- package/dist/core/keybindings/types.d.ts +37 -0
- package/dist/core/keybindings/types.js +1 -0
- package/dist/core/locked-file.d.ts +24 -0
- package/dist/core/locked-file.js +91 -0
- package/dist/core/log.d.ts +3 -0
- package/dist/core/log.js +27 -0
- package/dist/core/manifest.d.ts +5 -0
- package/dist/core/manifest.js +15 -0
- package/dist/core/memory/inline-ref-grammar.d.ts +53 -0
- package/dist/core/memory/inline-ref-grammar.js +99 -0
- package/dist/core/memory/inline-ref-guidance.d.ts +8 -0
- package/dist/core/memory/inline-ref-guidance.js +35 -0
- package/dist/core/memory/inline-ref-inventory.d.ts +13 -0
- package/dist/core/memory/inline-ref-inventory.js +79 -0
- package/dist/core/memory-resolver.d.ts +106 -0
- package/dist/core/memory-resolver.js +422 -0
- package/dist/core/output.d.ts +35 -0
- package/dist/core/output.js +99 -0
- package/dist/core/pagination.d.ts +33 -0
- package/dist/core/pagination.js +89 -0
- package/dist/core/pool-credential-store.d.ts +34 -0
- package/dist/core/pool-credential-store.js +116 -0
- package/dist/core/predicate.d.ts +65 -0
- package/dist/core/predicate.js +191 -0
- package/dist/core/preview-registry.d.ts +25 -0
- package/dist/core/preview-registry.js +2841 -0
- package/dist/core/profiles/__tests__/env-store.test.d.ts +1 -0
- package/dist/core/profiles/__tests__/env-store.test.js +97 -0
- package/dist/core/profiles/__tests__/root-profile.test.d.ts +1 -0
- package/dist/core/profiles/__tests__/root-profile.test.js +69 -0
- package/dist/core/profiles/default-binding.d.ts +6 -0
- package/dist/core/profiles/default-binding.js +46 -0
- package/dist/core/profiles/env-store.d.ts +22 -0
- package/dist/core/profiles/env-store.js +157 -0
- package/dist/core/profiles/manifest.d.ts +35 -0
- package/dist/core/profiles/manifest.js +371 -0
- package/dist/core/profiles/select.d.ts +42 -0
- package/dist/core/profiles/select.js +673 -0
- package/dist/core/profiles/state-block.d.ts +4 -0
- package/dist/core/profiles/state-block.js +16 -0
- package/dist/core/provider-management.d.ts +12 -0
- package/dist/core/provider-management.js +22 -0
- package/dist/core/render.d.ts +12 -0
- package/dist/core/render.js +127 -0
- package/dist/core/resolver.d.ts +14 -0
- package/dist/core/resolver.js +136 -0
- package/dist/core/runtime/__tests__/command-expansion.test.d.ts +1 -0
- package/dist/core/runtime/__tests__/command-expansion.test.js +25 -0
- package/dist/core/runtime/__tests__/engine-route.test.d.ts +1 -0
- package/dist/core/runtime/__tests__/engine-route.test.js +36 -0
- package/dist/core/runtime/__tests__/install-id-cache-scoping.test.d.ts +1 -0
- package/dist/core/runtime/__tests__/install-id-cache-scoping.test.js +41 -0
- package/dist/core/runtime/__tests__/node-env.test.d.ts +1 -0
- package/dist/core/runtime/__tests__/node-env.test.js +73 -0
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.d.ts +1 -0
- package/dist/core/runtime/__tests__/spawn-at-given-id.test.js +34 -0
- package/dist/core/runtime/__tests__/spawn-env.test.d.ts +1 -0
- package/dist/core/runtime/__tests__/spawn-env.test.js +268 -0
- package/dist/core/runtime/auth-reload.d.ts +7 -0
- package/dist/core/runtime/auth-reload.js +67 -0
- package/dist/core/runtime/banner.d.ts +13 -0
- package/dist/core/runtime/banner.js +51 -0
- package/dist/core/runtime/bearings.d.ts +99 -0
- package/dist/core/runtime/bearings.js +429 -0
- package/dist/core/runtime/boot-root.d.ts +24 -0
- package/dist/core/runtime/boot-root.js +102 -0
- package/dist/core/runtime/branded-host.d.ts +25 -0
- package/dist/core/runtime/branded-host.js +342 -0
- package/dist/core/runtime/broker-cli.d.ts +1 -0
- package/dist/core/runtime/broker-cli.js +81 -0
- package/dist/core/runtime/broker-protocol.d.ts +642 -0
- package/dist/core/runtime/broker-protocol.js +146 -0
- package/dist/core/runtime/broker-request.d.ts +37 -0
- package/dist/core/runtime/broker-request.js +85 -0
- package/dist/core/runtime/broker-sdk.d.ts +36 -0
- package/dist/core/runtime/broker-sdk.js +128 -0
- package/dist/core/runtime/broker.d.ts +245 -0
- package/dist/core/runtime/broker.js +3711 -0
- package/dist/core/runtime/busy.d.ts +32 -0
- package/dist/core/runtime/busy.js +107 -0
- package/dist/core/runtime/canvas-extensions.d.ts +20 -0
- package/dist/core/runtime/canvas-extensions.js +70 -0
- package/dist/core/runtime/close.d.ts +34 -0
- package/dist/core/runtime/close.js +223 -0
- package/dist/core/runtime/command-expansion.d.ts +19 -0
- package/dist/core/runtime/command-expansion.js +104 -0
- package/dist/core/runtime/connectivity.d.ts +12 -0
- package/dist/core/runtime/connectivity.js +73 -0
- package/dist/core/runtime/deliver-live.d.ts +26 -0
- package/dist/core/runtime/deliver-live.js +63 -0
- package/dist/core/runtime/fault-recovery-nudge.d.ts +3 -0
- package/dist/core/runtime/fault-recovery-nudge.js +3 -0
- package/dist/core/runtime/fault-recovery.d.ts +23 -0
- package/dist/core/runtime/fault-recovery.js +83 -0
- package/dist/core/runtime/fault.d.ts +64 -0
- package/dist/core/runtime/fault.js +260 -0
- package/dist/core/runtime/fleet.d.ts +57 -0
- package/dist/core/runtime/fleet.js +35 -0
- package/dist/core/runtime/front-door.d.ts +16 -0
- package/dist/core/runtime/front-door.js +186 -0
- package/dist/core/runtime/host.d.ts +43 -0
- package/dist/core/runtime/host.js +432 -0
- package/dist/core/runtime/interactive-deliver.d.ts +15 -0
- package/dist/core/runtime/interactive-deliver.js +41 -0
- package/dist/core/runtime/kickoff.d.ts +53 -0
- package/dist/core/runtime/kickoff.js +289 -0
- package/dist/core/runtime/launch-prompt.d.ts +8 -0
- package/dist/core/runtime/launch-prompt.js +13 -0
- package/dist/core/runtime/launch.d.ts +191 -0
- package/dist/core/runtime/launch.js +442 -0
- package/dist/core/runtime/lifecycle.d.ts +12 -0
- package/dist/core/runtime/lifecycle.js +121 -0
- package/dist/core/runtime/managed-provider-cooling.d.ts +38 -0
- package/dist/core/runtime/managed-provider-cooling.js +81 -0
- package/dist/core/runtime/memory.d.ts +3 -0
- package/dist/core/runtime/memory.js +18 -0
- package/dist/core/runtime/model-selection.d.ts +41 -0
- package/dist/core/runtime/model-selection.js +118 -0
- package/dist/core/runtime/model-swap.d.ts +27 -0
- package/dist/core/runtime/model-swap.js +70 -0
- package/dist/core/runtime/naming-persist.d.ts +11 -0
- package/dist/core/runtime/naming-persist.js +41 -0
- package/dist/core/runtime/naming.d.ts +26 -0
- package/dist/core/runtime/naming.js +174 -0
- package/dist/core/runtime/node-read.d.ts +36 -0
- package/dist/core/runtime/node-read.js +255 -0
- package/dist/core/runtime/nodes.d.ts +113 -0
- package/dist/core/runtime/nodes.js +330 -0
- package/dist/core/runtime/package-health.d.ts +49 -0
- package/dist/core/runtime/package-health.js +217 -0
- package/dist/core/runtime/persona.d.ts +25 -0
- package/dist/core/runtime/persona.js +132 -0
- package/dist/core/runtime/pi-cli.d.ts +8 -0
- package/dist/core/runtime/pi-cli.js +65 -0
- package/dist/core/runtime/pi-vendored.d.ts +26 -0
- package/dist/core/runtime/pi-vendored.js +77 -0
- package/dist/core/runtime/placement-tmux.d.ts +42 -0
- package/dist/core/runtime/placement-tmux.js +151 -0
- package/dist/core/runtime/placement.d.ts +97 -0
- package/dist/core/runtime/placement.js +394 -0
- package/dist/core/runtime/promote.d.ts +44 -0
- package/dist/core/runtime/promote.js +176 -0
- package/dist/core/runtime/recap.d.ts +8 -0
- package/dist/core/runtime/recap.js +136 -0
- package/dist/core/runtime/recycle.d.ts +14 -0
- package/dist/core/runtime/recycle.js +158 -0
- package/dist/core/runtime/reopen.d.ts +32 -0
- package/dist/core/runtime/reopen.js +119 -0
- package/dist/core/runtime/reset.d.ts +68 -0
- package/dist/core/runtime/reset.js +198 -0
- package/dist/core/runtime/resume-root.d.ts +6 -0
- package/dist/core/runtime/resume-root.js +292 -0
- package/dist/core/runtime/revive-all.d.ts +61 -0
- package/dist/core/runtime/revive-all.js +106 -0
- package/dist/core/runtime/revive.d.ts +58 -0
- package/dist/core/runtime/revive.js +357 -0
- package/dist/core/runtime/roadmap.d.ts +13 -0
- package/dist/core/runtime/roadmap.js +45 -0
- package/dist/core/runtime/session-branch.d.ts +13 -0
- package/dist/core/runtime/session-branch.js +46 -0
- package/dist/core/runtime/session-cycles.d.ts +30 -0
- package/dist/core/runtime/session-cycles.js +77 -0
- package/dist/core/runtime/session-list-cache.d.ts +53 -0
- package/dist/core/runtime/session-list-cache.js +406 -0
- package/dist/core/runtime/situational-context.d.ts +12 -0
- package/dist/core/runtime/situational-context.js +48 -0
- package/dist/core/runtime/situational-live.d.ts +9 -0
- package/dist/core/runtime/situational-live.js +40 -0
- package/dist/core/runtime/spawn-env.d.ts +31 -0
- package/dist/core/runtime/spawn-env.js +179 -0
- package/dist/core/runtime/spawn.d.ts +118 -0
- package/dist/core/runtime/spawn.js +473 -0
- package/dist/core/runtime/stop-guard.d.ts +18 -0
- package/dist/core/runtime/stop-guard.js +77 -0
- package/dist/core/runtime/stop-signals.d.ts +14 -0
- package/dist/core/runtime/stop-signals.js +46 -0
- package/dist/core/runtime/stream-watchdog.d.ts +55 -0
- package/dist/core/runtime/stream-watchdog.js +140 -0
- package/dist/core/runtime/structured-output.d.ts +12 -0
- package/dist/core/runtime/structured-output.js +90 -0
- package/dist/core/runtime/surface-bg.d.ts +11 -0
- package/dist/core/runtime/surface-bg.js +68 -0
- package/dist/core/runtime/tmux-chrome.d.ts +1 -0
- package/dist/core/runtime/tmux-chrome.js +4 -0
- package/dist/core/runtime/tmux.d.ts +247 -0
- package/dist/core/runtime/tmux.js +858 -0
- package/dist/core/runtime/warm-pool.d.ts +51 -0
- package/dist/core/runtime/warm-pool.js +373 -0
- package/dist/core/scope.d.ts +47 -0
- package/dist/core/scope.js +255 -0
- package/dist/core/secrets.d.ts +25 -0
- package/dist/core/secrets.js +55 -0
- package/dist/core/self-update.d.ts +21 -0
- package/dist/core/self-update.js +105 -0
- package/dist/core/session-model/session-state.d.ts +51 -0
- package/dist/core/session-model/session-state.js +170 -0
- package/dist/core/spawn.d.ts +16 -0
- package/dist/core/spawn.js +30 -0
- package/dist/core/stdout-errors.d.ts +3 -0
- package/dist/core/stdout-errors.js +14 -0
- package/dist/core/subscription-state.d.ts +138 -0
- package/dist/core/subscription-state.js +918 -0
- package/dist/core/substrate/ceiling.d.ts +20 -0
- package/dist/core/substrate/ceiling.js +69 -0
- package/dist/core/substrate/gate.d.ts +13 -0
- package/dist/core/substrate/gate.js +21 -0
- package/dist/core/substrate/index.d.ts +11 -0
- package/dist/core/substrate/index.js +25 -0
- package/dist/core/substrate/injected-store.d.ts +10 -0
- package/dist/core/substrate/injected-store.js +55 -0
- package/dist/core/substrate/on-read.d.ts +14 -0
- package/dist/core/substrate/on-read.js +404 -0
- package/dist/core/substrate/render-node.d.ts +11 -0
- package/dist/core/substrate/render-node.js +29 -0
- package/dist/core/substrate/render.d.ts +21 -0
- package/dist/core/substrate/render.js +547 -0
- package/dist/core/substrate/schema.d.ts +125 -0
- package/dist/core/substrate/schema.js +191 -0
- package/dist/core/substrate/session-cache.d.ts +25 -0
- package/dist/core/substrate/session-cache.js +101 -0
- package/dist/core/substrate/subject-fields.d.ts +45 -0
- package/dist/core/substrate/subject-fields.js +38 -0
- package/dist/core/substrate/subject.d.ts +12 -0
- package/dist/core/substrate/subject.js +47 -0
- package/dist/core/timing.d.ts +11 -0
- package/dist/core/timing.js +94 -0
- package/dist/core/tui/__tests__/host-keybindings.test.d.ts +1 -0
- package/dist/core/tui/__tests__/host-keybindings.test.js +113 -0
- package/dist/core/tui/draw.d.ts +100 -0
- package/dist/core/tui/draw.js +359 -0
- package/dist/core/tui/host.d.ts +66 -0
- package/dist/core/tui/host.js +689 -0
- package/dist/core/tui/terminal.d.ts +23 -0
- package/dist/core/tui/terminal.js +101 -0
- package/dist/core/view/__tests__/transport-cache.test.d.ts +1 -0
- package/dist/core/view/__tests__/transport-cache.test.js +62 -0
- package/dist/core/view/__tests__/transport-remote.test.d.ts +1 -0
- package/dist/core/view/__tests__/transport-remote.test.js +98 -0
- package/dist/core/view/bridge.d.ts +10 -0
- package/dist/core/view/bridge.js +31 -0
- package/dist/core/view/chrome.d.ts +9 -0
- package/dist/core/view/chrome.js +22 -0
- package/dist/core/view/contract.d.ts +205 -0
- package/dist/core/view/contract.js +23 -0
- package/dist/core/view/loader.d.ts +31 -0
- package/dist/core/view/loader.js +188 -0
- package/dist/core/view/remote-canvas-target.d.ts +4 -0
- package/dist/core/view/remote-canvas-target.js +30 -0
- package/dist/core/view/stream-local.d.ts +3 -0
- package/dist/core/view/stream-local.js +231 -0
- package/dist/core/view/transport-cache.d.ts +8 -0
- package/dist/core/view/transport-cache.js +38 -0
- package/dist/core/view/transport-local.d.ts +7 -0
- package/dist/core/view/transport-local.js +83 -0
- package/dist/core/view/transport-remote.d.ts +2 -0
- package/dist/core/view/transport-remote.js +58 -0
- package/dist/core/view/transport.d.ts +10 -0
- package/dist/core/view/transport.js +15 -0
- package/dist/core/wake.d.ts +86 -0
- package/dist/core/wake.js +307 -0
- package/dist/core/worktree.d.ts +111 -0
- package/dist/core/worktree.js +732 -0
- package/dist/daemon/__tests__/broker-ownership.test.d.ts +1 -0
- package/dist/daemon/__tests__/broker-ownership.test.js +25 -0
- package/dist/daemon/__tests__/daemon-ownership.test.d.ts +1 -0
- package/dist/daemon/__tests__/daemon-ownership.test.js +27 -0
- package/dist/daemon/api/__tests__/error-seam.test.d.ts +1 -0
- package/dist/daemon/api/__tests__/error-seam.test.js +56 -0
- package/dist/daemon/api/__tests__/full/api-server.test.d.ts +1 -0
- package/dist/daemon/api/__tests__/full/api-server.test.js +369 -0
- package/dist/daemon/api/__tests__/full/b10-attach-modelauth.test.d.ts +1 -0
- package/dist/daemon/api/__tests__/full/b10-attach-modelauth.test.js +220 -0
- package/dist/daemon/api/__tests__/full/push-parity.test.d.ts +1 -0
- package/dist/daemon/api/__tests__/full/push-parity.test.js +199 -0
- package/dist/daemon/api/__tests__/full/worktree-parity.test.d.ts +1 -0
- package/dist/daemon/api/__tests__/full/worktree-parity.test.js +160 -0
- package/dist/daemon/api/__tests__/inbox.test.d.ts +1 -0
- package/dist/daemon/api/__tests__/inbox.test.js +578 -0
- package/dist/daemon/api/bridge.d.ts +21 -0
- package/dist/daemon/api/bridge.js +351 -0
- package/dist/daemon/api/handlers/attach.d.ts +2 -0
- package/dist/daemon/api/handlers/attach.js +56 -0
- package/dist/daemon/api/handlers/canvas.d.ts +2 -0
- package/dist/daemon/api/handlers/canvas.js +463 -0
- package/dist/daemon/api/handlers/crons.d.ts +2 -0
- package/dist/daemon/api/handlers/crons.js +354 -0
- package/dist/daemon/api/handlers/daemon.d.ts +2 -0
- package/dist/daemon/api/handlers/daemon.js +35 -0
- package/dist/daemon/api/handlers/files.d.ts +2 -0
- package/dist/daemon/api/handlers/files.js +64 -0
- package/dist/daemon/api/handlers/focus.d.ts +2 -0
- package/dist/daemon/api/handlers/focus.js +92 -0
- package/dist/daemon/api/handlers/health.d.ts +2 -0
- package/dist/daemon/api/handlers/health.js +65 -0
- package/dist/daemon/api/handlers/human.d.ts +12 -0
- package/dist/daemon/api/handlers/human.js +741 -0
- package/dist/daemon/api/handlers/inbox.d.ts +2 -0
- package/dist/daemon/api/handlers/inbox.js +423 -0
- package/dist/daemon/api/handlers/messages.d.ts +2 -0
- package/dist/daemon/api/handlers/messages.js +290 -0
- package/dist/daemon/api/handlers/modelauth.d.ts +2 -0
- package/dist/daemon/api/handlers/modelauth.js +116 -0
- package/dist/daemon/api/handlers/nodes.d.ts +2 -0
- package/dist/daemon/api/handlers/nodes.js +540 -0
- package/dist/daemon/api/handlers/profiles.d.ts +2 -0
- package/dist/daemon/api/handlers/profiles.js +69 -0
- package/dist/daemon/api/handlers/reports.d.ts +2 -0
- package/dist/daemon/api/handlers/reports.js +144 -0
- package/dist/daemon/api/handlers/subscriptions.d.ts +2 -0
- package/dist/daemon/api/handlers/subscriptions.js +53 -0
- package/dist/daemon/api/handlers/worktree.d.ts +2 -0
- package/dist/daemon/api/handlers/worktree.js +40 -0
- package/dist/daemon/api/map.d.ts +100 -0
- package/dist/daemon/api/map.js +360 -0
- package/dist/daemon/api/router.d.ts +56 -0
- package/dist/daemon/api/router.js +190 -0
- package/dist/daemon/api/server.d.ts +23 -0
- package/dist/daemon/api/server.js +258 -0
- package/dist/daemon/control.d.ts +21 -0
- package/dist/daemon/control.js +22 -0
- package/dist/daemon/cron-run.d.ts +64 -0
- package/dist/daemon/cron-run.js +944 -0
- package/dist/daemon/cron-sink.d.ts +26 -0
- package/dist/daemon/cron-sink.js +43 -0
- package/dist/daemon/crtrd-cli.d.ts +1 -0
- package/dist/daemon/crtrd-cli.js +18 -0
- package/dist/daemon/crtrd.d.ts +89 -0
- package/dist/daemon/crtrd.js +1953 -0
- package/dist/daemon/fleet.d.ts +81 -0
- package/dist/daemon/fleet.js +405 -0
- package/dist/daemon/manage.d.ts +103 -0
- package/dist/daemon/manage.js +389 -0
- package/dist/daemon/pidfile.d.ts +8 -0
- package/dist/daemon/pidfile.js +37 -0
- package/dist/daemon/supervise-cadence.d.ts +1 -0
- package/dist/daemon/supervise-cadence.js +6 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +44 -0
- package/dist/pi-extensions/__tests__/canvas-bash-valve.test.d.ts +1 -0
- package/dist/pi-extensions/__tests__/canvas-bash-valve.test.js +31 -0
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.d.ts +1 -0
- package/dist/pi-extensions/__tests__/canvas-context-intro.test.js +182 -0
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.d.ts +1 -0
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +467 -0
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.d.ts +1 -0
- package/dist/pi-extensions/__tests__/canvas-stophook-context-nudge.test.js +121 -0
- package/dist/pi-extensions/canvas-bash-valve.d.ts +8 -0
- package/dist/pi-extensions/canvas-bash-valve.js +297 -0
- package/dist/pi-extensions/canvas-context-intro.d.ts +91 -0
- package/dist/pi-extensions/canvas-context-intro.js +230 -0
- package/dist/pi-extensions/canvas-doc-substrate.d.ts +44 -0
- package/dist/pi-extensions/canvas-doc-substrate.js +151 -0
- package/dist/pi-extensions/canvas-goal-capture.d.ts +21 -0
- package/dist/pi-extensions/canvas-goal-capture.js +83 -0
- package/dist/pi-extensions/canvas-inbox-watcher.d.ts +25 -0
- package/dist/pi-extensions/canvas-inbox-watcher.js +942 -0
- package/dist/pi-extensions/canvas-passive-context.d.ts +32 -0
- package/dist/pi-extensions/canvas-passive-context.js +134 -0
- package/dist/pi-extensions/canvas-recap.d.ts +41 -0
- package/dist/pi-extensions/canvas-recap.js +263 -0
- package/dist/pi-extensions/canvas-stophook.d.ts +53 -0
- package/dist/pi-extensions/canvas-stophook.js +985 -0
- package/dist/pi-extensions/canvas-structured-output.d.ts +9 -0
- package/dist/pi-extensions/canvas-structured-output.js +155 -0
- package/dist/prompts/review.d.ts +2 -0
- package/dist/prompts/review.js +130 -0
- package/dist/prompts/view.d.ts +7 -0
- package/dist/prompts/view.js +172 -0
- package/dist/suppress-experimental-warnings.d.ts +1 -0
- package/dist/suppress-experimental-warnings.js +15 -0
- package/dist/types.d.ts +297 -0
- package/dist/types.js +153 -0
- package/dist/web/ViewChrome.d.ts +7 -0
- package/dist/web/ViewChrome.js +28 -0
- package/dist/web/ViewPane.d.ts +39 -0
- package/dist/web/ViewPane.js +48 -0
- package/dist/web/index.d.ts +8 -0
- package/dist/web/index.js +22 -0
- package/dist/web/runtime.d.ts +39 -0
- package/dist/web/runtime.js +232 -0
- package/dist/web/states.d.ts +24 -0
- package/dist/web/states.js +24 -0
- package/dist/web/transport-http.d.ts +5 -0
- package/dist/web/transport-http.js +34 -0
- package/dist/web/transport-stream.d.ts +3 -0
- package/dist/web/transport-stream.js +204 -0
- package/dist/web-client/apple-touch-icon.png +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-BYwT3kSJ.woff +0 -0
- package/dist/web-client/assets/fragment-mono-latin-400-normal-yxdJ5AmL.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-BbKYyvR9.woff2 +0 -0
- package/dist/web-client/assets/fragment-mono-latin-ext-400-normal-CT4YFKeK.woff +0 -0
- package/dist/web-client/assets/index-BpyZGBhI.js +79 -0
- package/dist/web-client/assets/index-CpEl9LTS.css +2 -0
- package/dist/web-client/assets/martian-mono-cyrillic-wght-normal-B84CD5C_.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-ext-wght-normal-DlL6xMw5.woff2 +0 -0
- package/dist/web-client/assets/martian-mono-latin-wght-normal-5W32yIyr.woff2 +0 -0
- package/dist/web-client/assets/workbox-window.prod.es5-Bd17z0YL.js +2 -0
- package/dist/web-client/icon-192.png +0 -0
- package/dist/web-client/icon-512.png +0 -0
- package/dist/web-client/icon-maskable-512.png +0 -0
- package/dist/web-client/index.html +17 -0
- package/dist/web-client/manifest.webmanifest +1 -0
- package/dist/web-client/sw.js +1 -0
- package/docs/compat/hearth-crtr-v1.md +187 -0
- package/docs/compat/hearth-crtr-v2.md +185 -0
- package/docs/compat/hearth-crtr-v3.md +184 -0
- package/docs/compat/hearth-crtr-v4.md +188 -0
- package/docs/compat/hearth-crtr-v5.md +175 -0
- package/docs/public-api.md +77 -0
- package/package.json +156 -0
- package/runtime.lock.json +12919 -0
- package/scripts/install-runtime.mjs +308 -0
- package/scripts/patch-pi-tree-root-ordering.mjs +57 -0
- package/scripts/postinstall.mjs +33 -0
- package/scripts/runtime-lock.mjs +26 -0
|
@@ -0,0 +1,1232 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
import {
|
|
4
|
+
createAssistantMessageEventStream,
|
|
5
|
+
type AssistantMessage,
|
|
6
|
+
type AssistantMessageEventStream,
|
|
7
|
+
type AuthEvent,
|
|
8
|
+
type AuthPrompt,
|
|
9
|
+
type Context,
|
|
10
|
+
type Model,
|
|
11
|
+
type OAuthAuth,
|
|
12
|
+
type SimpleStreamOptions,
|
|
13
|
+
} from "@earendil-works/pi-ai";
|
|
14
|
+
import { streamSimpleAnthropic, streamSimpleOpenAICodexResponses } from "@earendil-works/pi-ai/compat";
|
|
15
|
+
import {
|
|
16
|
+
ANTHROPIC_PROVIDER_ID,
|
|
17
|
+
OPENAI_CODEX_PROVIDER_ID,
|
|
18
|
+
INVALID_REFRESH_TOKEN_BACKOFF_MS,
|
|
19
|
+
formatStatusLine,
|
|
20
|
+
getLadderProviderId,
|
|
21
|
+
getProviderLabel,
|
|
22
|
+
isManagedProvider,
|
|
23
|
+
isInvalidRefreshTokenError,
|
|
24
|
+
addSubscription,
|
|
25
|
+
enrichManagedLoginIdentity,
|
|
26
|
+
markSubscriptionAuthenticationFailed,
|
|
27
|
+
markSubscriptionRateLimited,
|
|
28
|
+
markSubscriptionSuccess,
|
|
29
|
+
parseRetryAfterHeader,
|
|
30
|
+
promoteSubscription,
|
|
31
|
+
readRotationConfig,
|
|
32
|
+
readSubscriptionPool,
|
|
33
|
+
refreshSubscriptionCredential,
|
|
34
|
+
removeManagedAccount,
|
|
35
|
+
resolveFallbackTarget,
|
|
36
|
+
resolveProviderCandidates,
|
|
37
|
+
restorePreferredModelIfPossible,
|
|
38
|
+
switchToFallbackIfPossible,
|
|
39
|
+
upsertSubscriptionWithUniqueAccount,
|
|
40
|
+
type FallbackTarget,
|
|
41
|
+
type ManagedProviderId,
|
|
42
|
+
type SubscriptionCredential,
|
|
43
|
+
} from "../../../core/subscription-state.js";
|
|
44
|
+
import {
|
|
45
|
+
ManagedProviderCoolingError,
|
|
46
|
+
readManagedProviderRotationPolicy,
|
|
47
|
+
} from "../../../core/runtime/managed-provider-cooling.js";
|
|
48
|
+
|
|
49
|
+
// A response without Retry-After proves only that THIS attempt was throttled; it
|
|
50
|
+
// does not authorize crouter to invent a five-minute provider-wide outage. Keep
|
|
51
|
+
// a short turn-local probe backoff to avoid an immediate retry loop, then let a
|
|
52
|
+
// fresh turn prove whether the credential is usable again. Real
|
|
53
|
+
// server-provided Retry-After deadlines are still honored exactly.
|
|
54
|
+
const DEFAULT_RATE_LIMIT_BACKOFF_MS = 15 * 1000;
|
|
55
|
+
// Short in-place retry budget for a transient network/5xx blip on the same credential.
|
|
56
|
+
// Once this budget is exhausted, surface the error and rotate to another candidate.
|
|
57
|
+
const TRANSIENT_RETRY_BACKOFFS_MS = [250, 750];
|
|
58
|
+
// After the in-place transient retry budget is exhausted, rotate instead of failing: the
|
|
59
|
+
// credential itself is probably healthy (this is a provider-side blip like "overloaded"),
|
|
60
|
+
// so cool it down only briefly -- long enough to rotate to another credential / fallback
|
|
61
|
+
// provider, short enough that it comes back quickly if it was the only option.
|
|
62
|
+
const TRANSIENT_ROTATE_COOLDOWN_MS = 60 * 1000;
|
|
63
|
+
// A few short outer retries absorb a normal multi-broker collision; if the metadata file
|
|
64
|
+
// remains busy, the provider call still proceeds. Subscription bookkeeping must never turn a
|
|
65
|
+
// healthy model response into a fatal generation fault.
|
|
66
|
+
const SUBSCRIPTION_LOCK_RETRY_BACKOFFS_MS = [25, 75, 150];
|
|
67
|
+
|
|
68
|
+
let runtimeContext: ExtensionContext | undefined;
|
|
69
|
+
let extensionAPI: ExtensionAPI | undefined;
|
|
70
|
+
|
|
71
|
+
type AttemptResult = {
|
|
72
|
+
result: "success" | "rate_limited" | "transient_exhausted" | "fatal";
|
|
73
|
+
retryAfterMs?: number;
|
|
74
|
+
attemptAt: number;
|
|
75
|
+
attempts?: number;
|
|
76
|
+
classification?: ProviderErrorClassification;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// A genuine rate limit (HTTP 429, or 503 with a real Retry-After header) must
|
|
80
|
+
// cool the credential down and rotate to the next one; a transient network/5xx blip
|
|
81
|
+
// (connection reset, socket errors, timeouts, plain 500/502/504, or 503 with NO
|
|
82
|
+
// retry-after) is not evidence the credential itself is bad -- it gets a short in-place
|
|
83
|
+
// retry on the same credential, never a cooldown. Everything else is fatal. Bare
|
|
84
|
+
// `usage`/`quota` substrings stay out of the message match: they are false-positive
|
|
85
|
+
// magnets (e.g. "usage" appears in normal assistant text), while the precise
|
|
86
|
+
// terminal usage-limit signals above still cool the credential down and rotate to the
|
|
87
|
+
// next one.
|
|
88
|
+
type ProviderErrorClassification = {
|
|
89
|
+
kind: "rate_limit" | "transient" | "fatal";
|
|
90
|
+
status?: number;
|
|
91
|
+
reason: string;
|
|
92
|
+
hadRetryAfterHeader: boolean;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const TRANSIENT_MESSAGE_PATTERN =
|
|
96
|
+
/connection|network|fetch failed|socket|econnreset|econnrefused|enotfound|etimedout|timed? out|timeout|overloaded|service.?unavailable|temporarily unavailable/i;
|
|
97
|
+
const RATE_LIMIT_MESSAGE_PATTERN = /\b429\b|rate.?limit|too many requests/i;
|
|
98
|
+
// Precise terminal usage-limit signals (as opposed to the bare `usage`/`quota` substrings
|
|
99
|
+
// dropped above): pi-ai's Codex adapter surfaces `usage_limit_reached` / `usage_not_included`
|
|
100
|
+
// as the friendly "You have hit your ChatGPT usage limit..." message, often on a non-429
|
|
101
|
+
// status, so the status-code check above misses it. These are specific enough not to false-
|
|
102
|
+
// positive on ordinary assistant text mentioning "usage".
|
|
103
|
+
const USAGE_LIMIT_MESSAGE_PATTERN = /usage[ _]limit|usage_not_included|usagelimiterror|insufficient_quota|quota exceeded/i;
|
|
104
|
+
|
|
105
|
+
function classifyProviderError(error: unknown, observed: { status?: number; retryAfterMs?: number }): ProviderErrorClassification {
|
|
106
|
+
const value = error as { status?: unknown; errorMessage?: unknown; message?: unknown } | undefined;
|
|
107
|
+
const errorStatus = typeof value?.status === "number" ? value.status : undefined;
|
|
108
|
+
const status = observed.status ?? errorStatus;
|
|
109
|
+
const message = [value?.errorMessage, value?.message, error instanceof Error ? error.message : ""]
|
|
110
|
+
.filter((part): part is string => typeof part === "string" && part.length > 0)
|
|
111
|
+
.join(" ");
|
|
112
|
+
const hadRetryAfterHeader = observed.retryAfterMs !== undefined;
|
|
113
|
+
|
|
114
|
+
if (status === 429) return { kind: "rate_limit", status, reason: "http 429", hadRetryAfterHeader };
|
|
115
|
+
if (status === 503 && hadRetryAfterHeader) return { kind: "rate_limit", status, reason: "http 503 with retry-after", hadRetryAfterHeader };
|
|
116
|
+
if (status === 500 || status === 502 || status === 503 || status === 504) {
|
|
117
|
+
return { kind: "transient", status, reason: `http ${status}`, hadRetryAfterHeader };
|
|
118
|
+
}
|
|
119
|
+
const transientMatch = message.match(TRANSIENT_MESSAGE_PATTERN);
|
|
120
|
+
if (transientMatch) return { kind: "transient", status, reason: transientMatch[0].toLowerCase(), hadRetryAfterHeader };
|
|
121
|
+
const rateLimitMatch = message.match(RATE_LIMIT_MESSAGE_PATTERN);
|
|
122
|
+
if (rateLimitMatch) return { kind: "rate_limit", status, reason: rateLimitMatch[0].toLowerCase(), hadRetryAfterHeader };
|
|
123
|
+
const usageLimitMatch = message.match(USAGE_LIMIT_MESSAGE_PATTERN);
|
|
124
|
+
if (usageLimitMatch) return { kind: "rate_limit", status, reason: usageLimitMatch[0].toLowerCase(), hadRetryAfterHeader };
|
|
125
|
+
return { kind: "fatal", status, reason: "unclassified", hadRetryAfterHeader };
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
async function defaultSleep(ms: number): Promise<void> {
|
|
129
|
+
await new Promise<void>((resolve) => setTimeout(resolve, ms));
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Indirection so tests can inject deterministic waits without real timers.
|
|
133
|
+
let activeSleep: typeof defaultSleep = defaultSleep;
|
|
134
|
+
|
|
135
|
+
/** Test-only seam: override the sleep implementation used for in-place/wait-out retries. Pass undefined to restore the default. */
|
|
136
|
+
export function __setSleepForTest(fn: typeof defaultSleep | undefined): void {
|
|
137
|
+
activeSleep = fn ?? defaultSleep;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function isSubscriptionLockContention(error: unknown): boolean {
|
|
141
|
+
const value = error as { code?: unknown; message?: unknown } | undefined;
|
|
142
|
+
return value?.code === "ELOCKED" || (typeof value?.message === "string" && /lock file is already being held/i.test(value.message));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async function recordSubscriptionMutation(description: string, mutate: () => Promise<unknown>): Promise<boolean> {
|
|
146
|
+
for (let attempt = 0; ; attempt++) {
|
|
147
|
+
try {
|
|
148
|
+
await mutate();
|
|
149
|
+
return true;
|
|
150
|
+
} catch (error) {
|
|
151
|
+
if (!isSubscriptionLockContention(error)) throw error;
|
|
152
|
+
const backoffMs = SUBSCRIPTION_LOCK_RETRY_BACKOFFS_MS[attempt];
|
|
153
|
+
if (backoffMs === undefined) {
|
|
154
|
+
logRotation(`subscription metadata lock remained busy while ${description}; continuing without failing the provider turn`);
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
await activeSleep(backoffMs);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/** Test-only seam for the bounded, non-fatal subscription bookkeeping path. */
|
|
163
|
+
export async function __recordSubscriptionMutationForTest(description: string, mutate: () => Promise<unknown>): Promise<boolean> {
|
|
164
|
+
return recordSubscriptionMutation(description, mutate);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// A user/host abort (ESC, a critical-tier interrupt, a torn-down window) is NOT a provider
|
|
168
|
+
// failure — it must never cool down a credential or rotate providers. The upstream pi-ai
|
|
169
|
+
// providers set `reason: "aborted"` / `stopReason: "aborted"` (and throw "Request was aborted")
|
|
170
|
+
// ONLY when the request's AbortSignal fired, so those markers alone are a reliable abort
|
|
171
|
+
// signal; we do NOT require the signal to be threaded back through our own options (it may not
|
|
172
|
+
// be), which is what made an ESC drain both provider pools.
|
|
173
|
+
function isUserAbortEvent(event: Parameters<AssistantMessageEventStream["push"]>[0], signal: AbortSignal | undefined): boolean {
|
|
174
|
+
if (signal?.aborted) return true;
|
|
175
|
+
if (event.type !== "error") return false;
|
|
176
|
+
return event.reason === "aborted" || event.error.stopReason === "aborted" || /request was aborted/i.test(event.error.errorMessage ?? "");
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function isUserAbortError(error: unknown, signal: AbortSignal | undefined): boolean {
|
|
180
|
+
if (signal?.aborted) return true;
|
|
181
|
+
const value = error as { name?: unknown; errorMessage?: unknown; message?: unknown } | undefined;
|
|
182
|
+
const message = [value?.errorMessage, value?.message, error instanceof Error ? error.message : String(error ?? "")]
|
|
183
|
+
.filter((part): part is string => typeof part === "string" && part.length > 0)
|
|
184
|
+
.join(" ");
|
|
185
|
+
return (error instanceof Error && /abort/i.test(error.name)) || /request was aborted|operation was aborted|the user aborted/i.test(message);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function setStatus(text: string): void {
|
|
189
|
+
runtimeContext?.ui.setStatus("provider-rotation", text);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function logRotation(message: string): void {
|
|
193
|
+
process.stderr.write(`[provider-rotation] ${message}\n`);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
function getCurrentModelRef(model?: Model<any>): { providerId: ManagedProviderId; modelId: string } | undefined {
|
|
197
|
+
return isManagedProvider(model?.provider) ? { providerId: model.provider, modelId: model.id } : undefined;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function toAssistantError(model: Model<any>, errorMessage: string): AssistantMessage {
|
|
201
|
+
return {
|
|
202
|
+
role: "assistant",
|
|
203
|
+
content: [],
|
|
204
|
+
api: model.api,
|
|
205
|
+
provider: model.provider,
|
|
206
|
+
model: model.id,
|
|
207
|
+
usage: {
|
|
208
|
+
input: 0,
|
|
209
|
+
output: 0,
|
|
210
|
+
cacheRead: 0,
|
|
211
|
+
cacheWrite: 0,
|
|
212
|
+
totalTokens: 0,
|
|
213
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
214
|
+
},
|
|
215
|
+
stopReason: "error",
|
|
216
|
+
errorMessage,
|
|
217
|
+
timestamp: Date.now(),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function retryAfterMs(headers: Record<string, string>): number | undefined {
|
|
222
|
+
const retryAfterMsHeader = headers["retry-after-ms"];
|
|
223
|
+
if (retryAfterMsHeader) {
|
|
224
|
+
const millis = Number(retryAfterMsHeader);
|
|
225
|
+
if (Number.isFinite(millis)) return Math.max(0, millis);
|
|
226
|
+
}
|
|
227
|
+
return parseRetryAfterHeader(headers["retry-after"]);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
type RefreshedCredential = { refresh: string; access: string; expires: number };
|
|
231
|
+
// Codex login carries the ChatGPT `accountId`; Anthropic identity is enriched from its OAuth
|
|
232
|
+
// profile after login. Optional so both providers and the test seam fit.
|
|
233
|
+
type LoginCredential = { refresh: string; access: string; expires: number; accountId?: string };
|
|
234
|
+
|
|
235
|
+
// Extract an account identity supplied directly by the OAuth credential.
|
|
236
|
+
function loginAccountId(cred: { accountId?: unknown }): string | undefined {
|
|
237
|
+
return typeof cred.accountId === "string" && cred.accountId.trim() ? cred.accountId.trim() : undefined;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Short, display-only rendering of a Codex account id for `/provider-sub list`, so distinct
|
|
241
|
+
// accounts are observable without dumping the full opaque id.
|
|
242
|
+
function shortAccountId(accountId: string): string {
|
|
243
|
+
return accountId.length > 12 ? `${accountId.slice(0, 8)}\u2026${accountId.slice(-4)}` : accountId;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// A credential that has been through refresh/reauth for this turn: `.access` is guaranteed
|
|
247
|
+
// populated. Every account stores its own value in the pool, so downstream stream-attempt code
|
|
248
|
+
// can rely on `.access` directly.
|
|
249
|
+
type ResolvedCredential = SubscriptionCredential & { access: string };
|
|
250
|
+
|
|
251
|
+
// The registered provider exposes its OAuth flow through `provider.auth.oauth`. Composed managed
|
|
252
|
+
// providers retain that flow, so the session registry supplies the Anthropic and Codex flows.
|
|
253
|
+
function oauthFlow(providerId: ManagedProviderId, ctx?: ExtensionContext): OAuthAuth {
|
|
254
|
+
const oauth = (ctx ?? runtimeContext)?.modelRegistry.getProvider(providerId)?.auth.oauth;
|
|
255
|
+
if (!oauth) throw new Error(`${getProviderLabel(providerId)} has no OAuth flow registered`);
|
|
256
|
+
return oauth;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// `refresh` is a pure token exchange that reads only `credential.refresh` and persists
|
|
260
|
+
// nothing; crouter records the rotated token in the selected pool row.
|
|
261
|
+
async function defaultRefreshForProvider(providerId: ManagedProviderId, refreshToken: string): Promise<RefreshedCredential> {
|
|
262
|
+
return oauthFlow(providerId).refresh({ type: "oauth", refresh: refreshToken, access: "", expires: 0 });
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// Indirection so tests can inject refresh failures without real network calls.
|
|
266
|
+
let activeRefreshForProvider: typeof defaultRefreshForProvider = defaultRefreshForProvider;
|
|
267
|
+
|
|
268
|
+
/** Test-only seam: override the per-provider refresh function. Pass undefined to restore the default. */
|
|
269
|
+
export function __setRefreshForProviderForTest(fn: typeof defaultRefreshForProvider | undefined): void {
|
|
270
|
+
activeRefreshForProvider = fn ?? defaultRefreshForProvider;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
function openBrowser(url: string): void {
|
|
274
|
+
const [cmd, args] =
|
|
275
|
+
process.platform === "darwin"
|
|
276
|
+
? ["open", [url]]
|
|
277
|
+
: process.platform === "win32"
|
|
278
|
+
? ["cmd", ["/c", "start", "", url]]
|
|
279
|
+
: ["xdg-open", [url]];
|
|
280
|
+
try {
|
|
281
|
+
const child = spawn(cmd, args, { stdio: "ignore", detached: true });
|
|
282
|
+
child.on("error", () => {
|
|
283
|
+
/* best effort -- the manual-code dialog's title carries the URL too */
|
|
284
|
+
});
|
|
285
|
+
child.unref();
|
|
286
|
+
} catch {
|
|
287
|
+
/* best effort */
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Every account refreshes the same way: the pool holds its value, so an expired token is a
|
|
292
|
+
// token exchange serialized on the pool file's lock. A still-fresh access token takes the
|
|
293
|
+
// side-effect-free fast path and never joins the lock. We do NOT route through pi's public
|
|
294
|
+
// `getApiKey`, which wraps pi-ai's `getOAuthApiKey` and collapses a refresh failure into a
|
|
295
|
+
// generic message; calling `activeRefreshForProvider` directly keeps the real error intact so
|
|
296
|
+
// `isInvalidRefreshTokenError` can classify it (cooldown -> reauth -> cross-provider-fallback).
|
|
297
|
+
async function refreshCredentialIfNeeded(providerId: ManagedProviderId, credential: SubscriptionCredential): Promise<ResolvedCredential> {
|
|
298
|
+
if (!credential.refresh || !credential.access || credential.expires === undefined) {
|
|
299
|
+
throw new Error(`${getProviderLabel(providerId)} subscription "${credential.label}" is missing its credential value`);
|
|
300
|
+
}
|
|
301
|
+
if (credential.expires > Date.now()) return credential as ResolvedCredential;
|
|
302
|
+
const refreshed = await refreshSubscriptionCredential(providerId, credential.label, (token) => activeRefreshForProvider(providerId, token));
|
|
303
|
+
return { ...credential, ...refreshed } as ResolvedCredential;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/** Test-only seam: exercises the real `refreshCredentialIfNeeded` (including its locked refresh
|
|
307
|
+
* transaction) without duplicating its logic. */
|
|
308
|
+
export async function __refreshCredentialIfNeededForTest(providerId: ManagedProviderId, credential: SubscriptionCredential): Promise<ResolvedCredential> {
|
|
309
|
+
return refreshCredentialIfNeeded(providerId, credential);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
async function defaultLoginForProvider(providerId: ManagedProviderId, ctx: ExtensionContext): Promise<LoginCredential> {
|
|
313
|
+
return loginProvider(providerId, ctx);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
let activeLoginForProvider: typeof defaultLoginForProvider = defaultLoginForProvider;
|
|
317
|
+
|
|
318
|
+
/** Test-only seam: override the per-provider login function. Pass undefined to restore the default. */
|
|
319
|
+
export function __setLoginForProviderForTest(fn: typeof defaultLoginForProvider | undefined): void {
|
|
320
|
+
activeLoginForProvider = fn ?? defaultLoginForProvider;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
async function reauthenticateCredential(providerId: ManagedProviderId, credential: SubscriptionCredential): Promise<ResolvedCredential | undefined> {
|
|
324
|
+
const ctx = runtimeContext;
|
|
325
|
+
if (!ctx?.hasUI) return undefined;
|
|
326
|
+
ctx.ui.notify(`${getProviderLabel(providerId)} subscription "${credential.label}" needs re-authentication. Opening OAuth login...`, "warning");
|
|
327
|
+
const authenticated = await activeLoginForProvider(providerId, ctx);
|
|
328
|
+
const identity = await enrichManagedLoginIdentity(providerId, authenticated);
|
|
329
|
+
// A failed Anthropic profile lookup leaves identity unknown. Do not carry the old row's identity
|
|
330
|
+
// onto newly issued tokens: it could describe a different account and bypass that account's
|
|
331
|
+
// duplicate check. Codex supplies its identity directly, so it can retain its existing claim
|
|
332
|
+
// only when that provider's login result omits one.
|
|
333
|
+
const reauthedAccountId =
|
|
334
|
+
identity.accountId ?? (providerId === ANTHROPIC_PROVIDER_ID ? undefined : loginAccountId(authenticated) ?? credential.accountId);
|
|
335
|
+
const { authFailure: _authFailure, ...healthyCredential } = credential;
|
|
336
|
+
const next: SubscriptionCredential = {
|
|
337
|
+
...healthyCredential,
|
|
338
|
+
refresh: authenticated.refresh,
|
|
339
|
+
access: authenticated.access,
|
|
340
|
+
expires: authenticated.expires,
|
|
341
|
+
...(reauthedAccountId ? { accountId: reauthedAccountId } : {}),
|
|
342
|
+
rateLimitedUntil: 0,
|
|
343
|
+
lastAttemptAt: Date.now(),
|
|
344
|
+
lastRateLimitedAt: credential.lastRateLimitedAt,
|
|
345
|
+
};
|
|
346
|
+
// Identity-checked upsert: reauthenticating this explicit slot into an account already held by
|
|
347
|
+
// ANOTHER slot throws DuplicateSubscriptionError rather than creating a duplicate quota entry.
|
|
348
|
+
return ((await upsertSubscriptionWithUniqueAccount(providerId, next)).find((entry) => entry.label === next.label) ?? next) as ResolvedCredential;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
function defaultStreamForProvider(model: Model<any>, context: Context, options: SimpleStreamOptions | undefined): AssistantMessageEventStream {
|
|
352
|
+
if (model.provider === ANTHROPIC_PROVIDER_ID) {
|
|
353
|
+
return streamSimpleAnthropic(model as Model<"anthropic-messages">, context, options);
|
|
354
|
+
}
|
|
355
|
+
return streamSimpleOpenAICodexResponses(model as Model<"openai-codex-responses">, context, options);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// Indirection so tests can inject a fake per-provider stream without real network calls.
|
|
359
|
+
let activeStreamForProvider: typeof defaultStreamForProvider = defaultStreamForProvider;
|
|
360
|
+
|
|
361
|
+
function streamForProvider(model: Model<any>, context: Context, options: SimpleStreamOptions | undefined): AssistantMessageEventStream {
|
|
362
|
+
return activeStreamForProvider(model, context, options);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/** Test-only seam: override the per-provider stream factory. Pass undefined to restore the default. */
|
|
366
|
+
export function __setStreamForProviderForTest(fn: typeof defaultStreamForProvider | undefined): void {
|
|
367
|
+
activeStreamForProvider = fn ?? defaultStreamForProvider;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/** Test-only seam: exercise `fallbackRejectionHint` for one rejection discriminant
|
|
371
|
+
* (with an optional resolved-but-rejected candidate) without staging a full turn. */
|
|
372
|
+
export function __fallbackRejectionHintForTest(reason: FallbackRejectionReason, candidate?: FallbackTarget): string {
|
|
373
|
+
return fallbackRejectionHint({ reason, candidate });
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// Drives one credential, retrying transient (non-rate-limit) failures in place on the
|
|
377
|
+
// same credential and reporting a classified result for rotation logging.
|
|
378
|
+
// A genuine rate limit ends the attempt immediately (the caller cools the credential down
|
|
379
|
+
// and rotates); a transient blip gets a short in-place retry budget before giving up.
|
|
380
|
+
async function streamProviderAttempt(
|
|
381
|
+
providerId: ManagedProviderId,
|
|
382
|
+
model: Model<any>,
|
|
383
|
+
context: Context,
|
|
384
|
+
options: SimpleStreamOptions | undefined,
|
|
385
|
+
credential: ResolvedCredential,
|
|
386
|
+
outer: AssistantMessageEventStream,
|
|
387
|
+
): Promise<AttemptResult> {
|
|
388
|
+
for (let attempt = 1; ; attempt++) {
|
|
389
|
+
const attemptAt = Date.now();
|
|
390
|
+
let observedStatus: number | undefined;
|
|
391
|
+
let requestedRetryAfterMs: number | undefined;
|
|
392
|
+
const inner = streamForProvider(model, context, {
|
|
393
|
+
...options,
|
|
394
|
+
apiKey: credential.access,
|
|
395
|
+
onResponse: async (response, responseModel) => {
|
|
396
|
+
observedStatus = response.status;
|
|
397
|
+
if (response.status === 429 || response.status === 503) {
|
|
398
|
+
requestedRetryAfterMs = retryAfterMs(response.headers);
|
|
399
|
+
}
|
|
400
|
+
await options?.onResponse?.(response, responseModel);
|
|
401
|
+
},
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
const bufferedEvents: Parameters<AssistantMessageEventStream["push"]>[0][] = [];
|
|
405
|
+
let sawContent = false;
|
|
406
|
+
let committed = false;
|
|
407
|
+
let classification: ProviderErrorClassification | undefined;
|
|
408
|
+
|
|
409
|
+
// Events are buffered ONLY until this attempt commits to the provider -- i.e. until the
|
|
410
|
+
// first real content event (thinking/text/toolcall) arrives, after which rotating away is
|
|
411
|
+
// no longer possible. Before commit the buffer lets a clean pre-content rate-limit rotate
|
|
412
|
+
// to another credential with nothing yet shown. Once committed we flush and forward every
|
|
413
|
+
// subsequent event LIVE, so viewers stream token-by-token instead of receiving the whole
|
|
414
|
+
// message at once when the turn finally completes.
|
|
415
|
+
const emit = (event: Parameters<AssistantMessageEventStream["push"]>[0]): void => {
|
|
416
|
+
if (committed) outer.push(event);
|
|
417
|
+
else bufferedEvents.push(event);
|
|
418
|
+
};
|
|
419
|
+
const flush = (): void => {
|
|
420
|
+
for (const event of bufferedEvents) outer.push(event);
|
|
421
|
+
bufferedEvents.length = 0;
|
|
422
|
+
committed = true;
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
try {
|
|
426
|
+
for await (const event of inner) {
|
|
427
|
+
if (event.type === "error") {
|
|
428
|
+
if (isUserAbortEvent(event, options?.signal)) {
|
|
429
|
+
emit(event);
|
|
430
|
+
flush();
|
|
431
|
+
return { result: "fatal", attemptAt };
|
|
432
|
+
}
|
|
433
|
+
classification = classifyProviderError(event.error, { status: observedStatus, retryAfterMs: requestedRetryAfterMs });
|
|
434
|
+
if (classification.kind === "fatal" || sawContent) {
|
|
435
|
+
emit(event);
|
|
436
|
+
flush();
|
|
437
|
+
return { result: "fatal", attemptAt, classification };
|
|
438
|
+
}
|
|
439
|
+
break;
|
|
440
|
+
}
|
|
441
|
+
if (event.type !== "start" && event.type !== "done") sawContent = true;
|
|
442
|
+
emit(event);
|
|
443
|
+
// First content event: commit to this provider -- flush the buffer and switch to live
|
|
444
|
+
// forwarding so the rest of the turn streams incrementally.
|
|
445
|
+
if (sawContent && !committed) flush();
|
|
446
|
+
}
|
|
447
|
+
} catch (error) {
|
|
448
|
+
if (isUserAbortError(error, options?.signal)) {
|
|
449
|
+
emit({
|
|
450
|
+
type: "error",
|
|
451
|
+
reason: "aborted",
|
|
452
|
+
error: { ...toAssistantError(model, error instanceof Error ? error.message : String(error)), stopReason: "aborted" },
|
|
453
|
+
});
|
|
454
|
+
flush();
|
|
455
|
+
return { result: "fatal", attemptAt };
|
|
456
|
+
}
|
|
457
|
+
classification = classifyProviderError(error, { status: observedStatus, retryAfterMs: requestedRetryAfterMs });
|
|
458
|
+
if (classification.kind === "fatal" || sawContent) {
|
|
459
|
+
emit({
|
|
460
|
+
type: "error",
|
|
461
|
+
reason: "error",
|
|
462
|
+
error: toAssistantError(model, error instanceof Error ? error.message : String(error)),
|
|
463
|
+
});
|
|
464
|
+
flush();
|
|
465
|
+
return { result: "fatal", attemptAt, classification };
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
if (!classification && requestedRetryAfterMs !== undefined && !sawContent) {
|
|
470
|
+
// Some providers signal a 429/503 purely via the response header without ever raising
|
|
471
|
+
// a stream "error" event; treat that the same as an explicit rate-limit classification.
|
|
472
|
+
classification = { kind: "rate_limit", status: observedStatus, reason: "retry-after header on success path", hadRetryAfterHeader: true };
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
if (!classification) {
|
|
476
|
+
flush();
|
|
477
|
+
return { result: "success", attemptAt };
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
if (classification.kind === "rate_limit") {
|
|
481
|
+
return { result: "rate_limited", retryAfterMs: requestedRetryAfterMs, attemptAt, classification };
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// Transient: retry the SAME credential/provider in place first -- no cooldown for the
|
|
485
|
+
// quick in-place budget.
|
|
486
|
+
const backoffMs = TRANSIENT_RETRY_BACKOFFS_MS[attempt - 1];
|
|
487
|
+
if (backoffMs === undefined) {
|
|
488
|
+
// In-place retry budget exhausted. Rather than hard-failing the turn, hand back a
|
|
489
|
+
// transient-exhausted result so the caller surfaces the error to the user AND rotates
|
|
490
|
+
// to another credential / fallback provider. Nothing is emitted into the stream here:
|
|
491
|
+
// the buffered (pre-content) events are discarded exactly like the rate-limit path, so
|
|
492
|
+
// the rotation target streams a clean turn.
|
|
493
|
+
return { result: "transient_exhausted", attemptAt, classification, attempts: attempt };
|
|
494
|
+
}
|
|
495
|
+
logRotation(
|
|
496
|
+
`${getProviderLabel(providerId)} subscription "${credential.label}" hit a transient error (${classification.reason}, status=${classification.status ?? "n/a"}); retrying same credential in ${backoffMs}ms (attempt ${attempt + 1})`,
|
|
497
|
+
);
|
|
498
|
+
await activeSleep(backoffMs);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
function emitTerminalError(stream: AssistantMessageEventStream, model: Model<any>, message: string): void {
|
|
503
|
+
stream.push({ type: "error", reason: "error", error: toAssistantError(model, message) });
|
|
504
|
+
stream.end();
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// Why a candidate fallback was rejected -- each reason gets its OWN accurate hint
|
|
508
|
+
// (`fallbackRejectionHint`) so the terminal error never gives advice that can't fix the
|
|
509
|
+
// actual blocker. Only `no_credentials` is a genuine "go authenticate" case; the others
|
|
510
|
+
// are config/exhaustion states where telling the user to authenticate would be misleading.
|
|
511
|
+
type FallbackRejectionReason =
|
|
512
|
+
| "no_ladder_entry"
|
|
513
|
+
| "already_attempted"
|
|
514
|
+
| "no_credentials"
|
|
515
|
+
| "model_unregistered"
|
|
516
|
+
| "cooling"
|
|
517
|
+
| "provider_pinned";
|
|
518
|
+
|
|
519
|
+
// On rejection we carry the resolved-but-rejected `candidate` FallbackTarget whenever one
|
|
520
|
+
// exists (every reason except `no_ladder_entry`, where no target resolved at all), so the
|
|
521
|
+
// hint can name the exact provider/model and build an executable repair command from the
|
|
522
|
+
// candidate's config ladder key + strength.
|
|
523
|
+
type FallbackResolution =
|
|
524
|
+
| { target: FallbackTarget }
|
|
525
|
+
| { target?: undefined; reason: FallbackRejectionReason; candidate?: FallbackTarget };
|
|
526
|
+
|
|
527
|
+
// Cross-provider fallback requires a target that is usable right now: authenticated
|
|
528
|
+
// (its subscription pool has at least one credential, even if currently
|
|
529
|
+
// cooling down) AND registered in the model registry -- rather than blindly switching the
|
|
530
|
+
// session model to a provider nobody logged into. Returns the rejection reason (config has
|
|
531
|
+
// no ladder rung, the target was already tried this turn, the target has zero credentials,
|
|
532
|
+
// or its resolved model isn't in the registry) rather than just `undefined`, so callers can
|
|
533
|
+
// surface an accurate terminal error instead of always defaulting to "authenticate a
|
|
534
|
+
// fallback provider" -- which is actively wrong when the real blocker is a stale ladder.
|
|
535
|
+
function resolveViableFallback(
|
|
536
|
+
providerId: ManagedProviderId,
|
|
537
|
+
modelId: string | undefined,
|
|
538
|
+
attempted: Set<ManagedProviderId>,
|
|
539
|
+
): FallbackResolution {
|
|
540
|
+
const target = resolveFallbackTarget(providerId, modelId, readRotationConfig(), extensionAPI?.getThinkingLevel?.());
|
|
541
|
+
if (!target) return { reason: "no_ladder_entry" };
|
|
542
|
+
if (attempted.has(target.providerId)) return { reason: "already_attempted", candidate: target };
|
|
543
|
+
// Pool occupancy IS authentication: every stored row carries a token pair, so an empty pool
|
|
544
|
+
// means switching the session model onto this provider would make pi fail the NEXT turn with a
|
|
545
|
+
// non-retryable "Provider is not configured" that no agent can clear from inside its own turn.
|
|
546
|
+
const pool = readSubscriptionPool(target.providerId);
|
|
547
|
+
const resolution = resolveProviderCandidates([{
|
|
548
|
+
providerId: target.providerId,
|
|
549
|
+
modelId: target.modelId,
|
|
550
|
+
thinkingLevel: target.thinkingLevel,
|
|
551
|
+
registered: Boolean(runtimeContext?.modelRegistry.find(target.providerId, target.modelId)),
|
|
552
|
+
authenticated: pool.length > 0,
|
|
553
|
+
coolingUntil: pool.length > 0 && pool.every((entry) => (entry.rateLimitedUntil || 0) > Date.now())
|
|
554
|
+
? Math.min(...pool.map((entry) => entry.rateLimitedUntil || 0))
|
|
555
|
+
: undefined,
|
|
556
|
+
}]);
|
|
557
|
+
if (resolution.candidates.length > 0) return { target };
|
|
558
|
+
switch (resolution.rejected[0]?.reason) {
|
|
559
|
+
case "unauthenticated": return { reason: "no_credentials", candidate: target };
|
|
560
|
+
case "unregistered": return { reason: "model_unregistered", candidate: target };
|
|
561
|
+
// Do not churn the session model merely to wait on an unavailable target.
|
|
562
|
+
// The caller includes this candidate's pool in the typed cooling deadline,
|
|
563
|
+
// so the broker can re-drive when either provider becomes ready.
|
|
564
|
+
case "cooling": return { reason: "cooling", candidate: target };
|
|
565
|
+
default: return { reason: "no_credentials", candidate: target };
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
// Actionable hint appended to a terminal error when no fallback is viable. Each rejection
|
|
570
|
+
// reason gets advice that can resolve it; only `no_credentials` advises authentication because
|
|
571
|
+
// it is the sole case where a login supplies the missing capability.
|
|
572
|
+
function fallbackRejectionHint(resolution: FallbackResolution): string {
|
|
573
|
+
if (resolution.target) return "try again later";
|
|
574
|
+
const candidate = resolution.candidate;
|
|
575
|
+
switch (resolution.reason) {
|
|
576
|
+
case "no_credentials": {
|
|
577
|
+
const who = candidate ? ` (${getProviderLabel(candidate.providerId)}, e.g. /provider-sub ${candidate.providerId} add)` : " with /provider-sub";
|
|
578
|
+
return `authenticate a fallback provider${who}, or try again later`;
|
|
579
|
+
}
|
|
580
|
+
case "model_unregistered": {
|
|
581
|
+
// Repair command must be EXECUTABLE as printed: `--value`, and the CONFIG ladder
|
|
582
|
+
// provider key (`openai`, not the runtime `openai-codex`) plus the candidate's own
|
|
583
|
+
// strength -- so the user pastes it, swaps in an installed model id, and it works.
|
|
584
|
+
const ladderKey = candidate ? getLadderProviderId(candidate.providerId) : "<provider>";
|
|
585
|
+
const strength = candidate?.strength ?? "<strength>";
|
|
586
|
+
const named = candidate ? candidate.label : "the configured fallback";
|
|
587
|
+
return `configured fallback ${named} is not in this build's model registry -- the modelLadders config is out of sync with the installed model catalog. Point it at an installed model with \`crtr sys config set modelLadders.${ladderKey}.${strength} --value <installed-model-id>\`, or upgrade/downgrade to a build whose ladder matches`;
|
|
588
|
+
}
|
|
589
|
+
case "already_attempted":
|
|
590
|
+
return "every managed provider was already tried this turn and is exhausted or cooling down -- try again later";
|
|
591
|
+
case "cooling":
|
|
592
|
+
return "the configured fallback provider is also cooling down -- retrying when the first provider becomes ready";
|
|
593
|
+
case "provider_pinned":
|
|
594
|
+
return "the selected provider is explicitly pinned -- retrying it when its first credential becomes ready";
|
|
595
|
+
case "no_ladder_entry":
|
|
596
|
+
return "no cross-provider fallback is configured for this model -- set one with `crtr sys config set modelLadders.<provider>.<strength> --value <model-id>`, or try again later";
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
// Switches the session model to an already-viability-checked fallback target. On the rare
|
|
601
|
+
// race where the switch itself still fails (e.g. `setModel` rejects it), emits a graceful,
|
|
602
|
+
// actionable terminal error on `stream` instead of throwing a generic "failed to switch".
|
|
603
|
+
async function switchToFallbackModel(
|
|
604
|
+
stream: AssistantMessageEventStream,
|
|
605
|
+
model: Model<any>,
|
|
606
|
+
originalModel: { providerId: ManagedProviderId; modelId: string },
|
|
607
|
+
): Promise<FallbackTarget | undefined> {
|
|
608
|
+
const ctx = runtimeContext;
|
|
609
|
+
if (!extensionAPI || !ctx) {
|
|
610
|
+
emitTerminalError(stream, model, `Provider fallback unavailable: runtime not initialized for ${originalModel.providerId}/${originalModel.modelId}`);
|
|
611
|
+
return undefined;
|
|
612
|
+
}
|
|
613
|
+
const target = await switchToFallbackIfPossible(extensionAPI, ctx, originalModel);
|
|
614
|
+
if (!target) {
|
|
615
|
+
emitTerminalError(stream, model, `Provider fallback unavailable: failed to switch models for ${getProviderLabel(originalModel.providerId)}`);
|
|
616
|
+
return undefined;
|
|
617
|
+
}
|
|
618
|
+
return target;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
// Drives the ordered recovery candidates for one managed turn. Each candidate is a
|
|
622
|
+
// provider/model whose ready credentials are tried in order. A provider returns to
|
|
623
|
+
// the list only for a newly ready label or a success that followed this turn's
|
|
624
|
+
// cooldown, so bookkeeping updates never retry an exhausted pool.
|
|
625
|
+
type ManagedProviderCandidate = {
|
|
626
|
+
model: Model<any>;
|
|
627
|
+
providerId: ManagedProviderId;
|
|
628
|
+
};
|
|
629
|
+
|
|
630
|
+
type ManagedProviderTerminalState = {
|
|
631
|
+
model: Model<any>;
|
|
632
|
+
providerId: ManagedProviderId;
|
|
633
|
+
currentPool: SubscriptionCredential[];
|
|
634
|
+
fallbackResolution: FallbackResolution;
|
|
635
|
+
};
|
|
636
|
+
|
|
637
|
+
function credentialKey(providerId: ManagedProviderId, label: string): string {
|
|
638
|
+
return `${providerId}/${label}`;
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
function enqueueFreshProviderCandidates(
|
|
642
|
+
candidates: ManagedProviderCandidate[],
|
|
643
|
+
queuedProviderIds: Set<ManagedProviderId>,
|
|
644
|
+
knownModels: Map<ManagedProviderId, Model<any>>,
|
|
645
|
+
seenReadyLabels: Map<ManagedProviderId, Set<string>>,
|
|
646
|
+
cooldownAttempts: Map<string, number>,
|
|
647
|
+
localCoolingDeadlines: Map<ManagedProviderId, number>,
|
|
648
|
+
): void {
|
|
649
|
+
const now = Date.now();
|
|
650
|
+
for (const [providerId, model] of knownModels) {
|
|
651
|
+
if (queuedProviderIds.has(providerId) || (localCoolingDeadlines.get(providerId) ?? 0) > now) continue;
|
|
652
|
+
const seenLabels = seenReadyLabels.get(providerId) ?? new Set<string>();
|
|
653
|
+
const hasFreshCredential = readSubscriptionPool(providerId).some((credential) => {
|
|
654
|
+
if (credential.rateLimitedUntil && credential.rateLimitedUntil > now) return false;
|
|
655
|
+
const cooldownAttempt = cooldownAttempts.get(credentialKey(providerId, credential.label));
|
|
656
|
+
return !seenLabels.has(credential.label) || (cooldownAttempt !== undefined && credential.lastAttemptAt > cooldownAttempt);
|
|
657
|
+
});
|
|
658
|
+
if (hasFreshCredential) {
|
|
659
|
+
candidates.push({ model, providerId });
|
|
660
|
+
queuedProviderIds.add(providerId);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
// Drives managed providers through an explicit candidate list. The list is exhausted
|
|
666
|
+
// only when no provider has a newly-ready credential or recovered cooldown and no viable fallback remains.
|
|
667
|
+
// The broker owns delayed retry through typed cooling errors; this loop never sleeps
|
|
668
|
+
// while waiting for a provider pool to recover.
|
|
669
|
+
async function runManagedProvider(
|
|
670
|
+
model: Model<any>,
|
|
671
|
+
context: Context,
|
|
672
|
+
options: SimpleStreamOptions | undefined,
|
|
673
|
+
stream: AssistantMessageEventStream,
|
|
674
|
+
): Promise<void> {
|
|
675
|
+
const initialProviderId = model.provider as ManagedProviderId;
|
|
676
|
+
const candidates: ManagedProviderCandidate[] = [{ model, providerId: initialProviderId }];
|
|
677
|
+
const queuedProviderIds = new Set<ManagedProviderId>([initialProviderId]);
|
|
678
|
+
const knownModels = new Map<ManagedProviderId, Model<any>>([[initialProviderId, model]]);
|
|
679
|
+
const attempted = new Set<ManagedProviderId>();
|
|
680
|
+
const authFailures = new Set<string>();
|
|
681
|
+
const localCoolingDeadlines = new Map<ManagedProviderId, number>();
|
|
682
|
+
const seenReadyLabels = new Map<ManagedProviderId, Set<string>>();
|
|
683
|
+
const cooldownAttempts = new Map<string, number>();
|
|
684
|
+
let terminal: ManagedProviderTerminalState | undefined;
|
|
685
|
+
|
|
686
|
+
for (let candidate = candidates.shift(); candidate !== undefined; candidate = candidates.shift()) {
|
|
687
|
+
const { model: candidateModel, providerId } = candidate;
|
|
688
|
+
queuedProviderIds.delete(providerId);
|
|
689
|
+
knownModels.set(providerId, candidateModel);
|
|
690
|
+
attempted.add(providerId);
|
|
691
|
+
|
|
692
|
+
const liveModel = getCurrentModelRef(runtimeContext?.model);
|
|
693
|
+
if (liveModel && (liveModel.providerId !== providerId || liveModel.modelId !== candidateModel.id)) {
|
|
694
|
+
const target = await switchToFallbackModel(stream, candidateModel, liveModel);
|
|
695
|
+
if (!target) return; // terminal error already emitted
|
|
696
|
+
if (target.providerId !== providerId || target.modelId !== candidateModel.id) {
|
|
697
|
+
emitTerminalError(stream, candidateModel, `Provider re-entry unavailable: expected ${providerId}/${candidateModel.id} but switched to ${target.label}`);
|
|
698
|
+
return;
|
|
699
|
+
}
|
|
700
|
+
logRotation(`${getProviderLabel(liveModel.providerId)} pool recovered -> ${target.label}`);
|
|
701
|
+
setStatus(`${getProviderLabel(liveModel.providerId)} -> ${target.label}`);
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
const rawPool = readSubscriptionPool(providerId);
|
|
705
|
+
for (const entry of rawPool) {
|
|
706
|
+
if (entry.authFailure === "invalid_grant") authFailures.add(`${providerId}/${entry.label}`);
|
|
707
|
+
}
|
|
708
|
+
const available = rawPool.filter((entry) => !entry.rateLimitedUntil || entry.rateLimitedUntil <= Date.now());
|
|
709
|
+
const seenLabels = seenReadyLabels.get(providerId) ?? new Set<string>();
|
|
710
|
+
for (const credential of available) seenLabels.add(credential.label);
|
|
711
|
+
seenReadyLabels.set(providerId, seenLabels);
|
|
712
|
+
|
|
713
|
+
for (const credential of available) {
|
|
714
|
+
let freshCredential: ResolvedCredential;
|
|
715
|
+
try {
|
|
716
|
+
freshCredential = await refreshCredentialIfNeeded(providerId, credential);
|
|
717
|
+
} catch (error) {
|
|
718
|
+
const attemptAt = Date.now();
|
|
719
|
+
if (isInvalidRefreshTokenError(error)) {
|
|
720
|
+
let reauthenticated: ResolvedCredential | undefined;
|
|
721
|
+
try {
|
|
722
|
+
reauthenticated = await reauthenticateCredential(providerId, credential);
|
|
723
|
+
} catch (loginError) {
|
|
724
|
+
runtimeContext?.ui.notify(
|
|
725
|
+
`${getProviderLabel(providerId)} re-authentication failed: ${loginError instanceof Error ? loginError.message : String(loginError)}`,
|
|
726
|
+
"error",
|
|
727
|
+
);
|
|
728
|
+
}
|
|
729
|
+
if (reauthenticated) {
|
|
730
|
+
freshCredential = reauthenticated;
|
|
731
|
+
} else {
|
|
732
|
+
// Keep the unusable credential out of ordinary rotation, but retain
|
|
733
|
+
// its auth cause for this turn. A 30-day exclusion is not a transient
|
|
734
|
+
// rate limit and must never author an auto rate-limit recovery fault.
|
|
735
|
+
await recordSubscriptionMutation(
|
|
736
|
+
`recording ${getProviderLabel(providerId)} authentication failure`,
|
|
737
|
+
() => markSubscriptionAuthenticationFailed(providerId, credential.label, INVALID_REFRESH_TOKEN_BACKOFF_MS, attemptAt),
|
|
738
|
+
);
|
|
739
|
+
authFailures.add(`${providerId}/${credential.label}`);
|
|
740
|
+
setStatus(formatStatusLine(providerId));
|
|
741
|
+
continue;
|
|
742
|
+
}
|
|
743
|
+
} else {
|
|
744
|
+
throw error;
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
const result = await streamProviderAttempt(providerId, candidateModel, context, options, freshCredential, stream);
|
|
748
|
+
|
|
749
|
+
if (result.result === "success") {
|
|
750
|
+
// The common healthy state already has nothing to clear. Avoid two global
|
|
751
|
+
// file locks just to advance display-only lastAttemptAt telemetry.
|
|
752
|
+
if (freshCredential.rateLimitedUntil || freshCredential.authFailure) {
|
|
753
|
+
await recordSubscriptionMutation(
|
|
754
|
+
`recording ${getProviderLabel(providerId)} success`,
|
|
755
|
+
() => markSubscriptionSuccess(providerId, freshCredential.label, result.attemptAt),
|
|
756
|
+
);
|
|
757
|
+
}
|
|
758
|
+
logRotation(`${getProviderLabel(providerId)} subscription "${freshCredential.label}" succeeded; cooldown cleared`);
|
|
759
|
+
setStatus(formatStatusLine(providerId));
|
|
760
|
+
stream.end();
|
|
761
|
+
return;
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
if (result.result === "rate_limited") {
|
|
765
|
+
const cooldownMs = result.retryAfterMs ?? DEFAULT_RATE_LIMIT_BACKOFF_MS;
|
|
766
|
+
if (result.retryAfterMs !== undefined) {
|
|
767
|
+
// A server-declared deadline is authoritative for every broker sharing
|
|
768
|
+
// this credential, so persist it in the cross-process pool.
|
|
769
|
+
const persisted = await recordSubscriptionMutation(
|
|
770
|
+
`recording ${getProviderLabel(providerId)} server cooldown`,
|
|
771
|
+
() => markSubscriptionRateLimited(providerId, freshCredential.label, cooldownMs, result.attemptAt),
|
|
772
|
+
);
|
|
773
|
+
if (persisted) {
|
|
774
|
+
// A zero server deadline is immediately eligible, but it still needs
|
|
775
|
+
// a later causal success before it becomes a new recovery candidate.
|
|
776
|
+
cooldownAttempts.set(credentialKey(providerId, freshCredential.label), result.attemptAt);
|
|
777
|
+
} else {
|
|
778
|
+
localCoolingDeadlines.set(
|
|
779
|
+
providerId,
|
|
780
|
+
Math.max(localCoolingDeadlines.get(providerId) ?? 0, Date.now() + cooldownMs),
|
|
781
|
+
);
|
|
782
|
+
}
|
|
783
|
+
} else {
|
|
784
|
+
// A headerless 429/usage-limit response proves only that this request
|
|
785
|
+
// failed. Persisting an invented deadline globally let one busy node
|
|
786
|
+
// gate unrelated nodes that were succeeding concurrently. Keep the
|
|
787
|
+
// short probe deadline turn-local instead.
|
|
788
|
+
localCoolingDeadlines.set(
|
|
789
|
+
providerId,
|
|
790
|
+
Math.max(localCoolingDeadlines.get(providerId) ?? 0, Date.now() + cooldownMs),
|
|
791
|
+
);
|
|
792
|
+
}
|
|
793
|
+
const retryAfterPart = result.retryAfterMs !== undefined ? `retry-after=${Math.ceil(result.retryAfterMs / 1000)}s` : "no retry-after header (default backoff)";
|
|
794
|
+
logRotation(
|
|
795
|
+
`${getProviderLabel(providerId)} subscription "${freshCredential.label}" rate-limited (status=${result.classification?.status ?? "n/a"}, reason=${result.classification?.reason ?? "unclassified"}, ${retryAfterPart}); ${result.retryAfterMs !== undefined ? "shared cooldown" : "turn-local retry backoff"} ${Math.ceil(cooldownMs / 1000)}s, trying next credential`,
|
|
796
|
+
);
|
|
797
|
+
runtimeContext?.ui.notify?.(
|
|
798
|
+
`${getProviderLabel(providerId)} "${freshCredential.label}" rate-limited (${result.retryAfterMs !== undefined ? "cooling down" : "retrying this turn in"} ${Math.ceil(cooldownMs / 1000)}s); rotating to another credential/provider.`,
|
|
799
|
+
"warning",
|
|
800
|
+
);
|
|
801
|
+
continue;
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
if (result.result === "transient_exhausted") {
|
|
805
|
+
// The credential is likely healthy -- this was a provider-side transient blip (e.g.
|
|
806
|
+
// "overloaded") that survived the in-place retries. Surface it to the user and rotate:
|
|
807
|
+
// cool the credential down briefly so this loop moves on to the next credential or fallback.
|
|
808
|
+
const reason = result.classification?.reason ?? "transient error";
|
|
809
|
+
const persisted = await recordSubscriptionMutation(
|
|
810
|
+
`recording ${getProviderLabel(providerId)} transient cooldown`,
|
|
811
|
+
() => markSubscriptionRateLimited(providerId, freshCredential.label, TRANSIENT_ROTATE_COOLDOWN_MS, result.attemptAt),
|
|
812
|
+
);
|
|
813
|
+
if (persisted) {
|
|
814
|
+
cooldownAttempts.set(credentialKey(providerId, freshCredential.label), result.attemptAt);
|
|
815
|
+
} else {
|
|
816
|
+
localCoolingDeadlines.set(
|
|
817
|
+
providerId,
|
|
818
|
+
Math.max(localCoolingDeadlines.get(providerId) ?? 0, Date.now() + TRANSIENT_ROTATE_COOLDOWN_MS),
|
|
819
|
+
);
|
|
820
|
+
}
|
|
821
|
+
runtimeContext?.ui.notify?.(
|
|
822
|
+
`${getProviderLabel(providerId)} "${freshCredential.label}" hit a transient error after ${result.attempts ?? 1} attempts (${reason}); rotating to another credential/provider.`,
|
|
823
|
+
"warning",
|
|
824
|
+
);
|
|
825
|
+
logRotation(
|
|
826
|
+
`${getProviderLabel(providerId)} subscription "${freshCredential.label}" transient error exhausted (reason=${reason}, status=${result.classification?.status ?? "n/a"}); cooling down ${Math.ceil(TRANSIENT_ROTATE_COOLDOWN_MS / 1000)}s and rotating`,
|
|
827
|
+
);
|
|
828
|
+
setStatus(formatStatusLine(providerId));
|
|
829
|
+
continue;
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
// Fatal (or partial content already streamed): cannot safely switch providers mid-turn.
|
|
833
|
+
if (result.classification) {
|
|
834
|
+
logRotation(
|
|
835
|
+
`${getProviderLabel(providerId)} subscription "${freshCredential.label}" failed fatally (status=${result.classification.status ?? "n/a"}, reason=${result.classification.reason})`,
|
|
836
|
+
);
|
|
837
|
+
}
|
|
838
|
+
stream.end();
|
|
839
|
+
return;
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
// Read a fresh pool after the attempts above so terminal cooling state reflects
|
|
843
|
+
// mutations made by this candidate, not its initial lock-free snapshot.
|
|
844
|
+
const currentPool = readSubscriptionPool(providerId);
|
|
845
|
+
enqueueFreshProviderCandidates(candidates, queuedProviderIds, knownModels, seenReadyLabels, cooldownAttempts, localCoolingDeadlines);
|
|
846
|
+
if (candidates.length > 0) continue;
|
|
847
|
+
|
|
848
|
+
const originalModel = getCurrentModelRef(candidateModel);
|
|
849
|
+
if (!originalModel) throw new Error(`Provider fallback unavailable: missing current model`);
|
|
850
|
+
|
|
851
|
+
const rotationPolicy = readManagedProviderRotationPolicy(runtimeContext?.ui);
|
|
852
|
+
const fallbackResolution: FallbackResolution = rotationPolicy.allowCrossProviderFallback
|
|
853
|
+
? resolveViableFallback(originalModel.providerId, originalModel.modelId, attempted)
|
|
854
|
+
: { reason: "provider_pinned" };
|
|
855
|
+
if (fallbackResolution.target) {
|
|
856
|
+
const target = await switchToFallbackModel(stream, candidateModel, originalModel);
|
|
857
|
+
if (!target) return; // terminal error already emitted
|
|
858
|
+
logRotation(`${getProviderLabel(providerId)} pool exhausted -> ${target.label}`);
|
|
859
|
+
setStatus(`${getProviderLabel(providerId)} -> ${target.label}`);
|
|
860
|
+
|
|
861
|
+
const fallbackModel = runtimeContext?.modelRegistry.find(target.providerId, target.modelId);
|
|
862
|
+
if (!fallbackModel) {
|
|
863
|
+
emitTerminalError(stream, candidateModel, `Provider fallback unavailable: ${target.label} not in model registry`);
|
|
864
|
+
return;
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
candidates.push({ model: fallbackModel, providerId: target.providerId });
|
|
868
|
+
queuedProviderIds.add(target.providerId);
|
|
869
|
+
knownModels.set(target.providerId, fallbackModel);
|
|
870
|
+
continue;
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
terminal = { model: candidateModel, providerId, currentPool, fallbackResolution };
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
if (!terminal) throw new Error("Managed provider recovery exhausted without a terminal state");
|
|
877
|
+
|
|
878
|
+
const { model: terminalModel, providerId, currentPool, fallbackResolution } = terminal;
|
|
879
|
+
const label = getProviderLabel(providerId);
|
|
880
|
+
const triedList = [...attempted].join(", ");
|
|
881
|
+
|
|
882
|
+
if (currentPool.length === 0) {
|
|
883
|
+
emitTerminalError(stream, terminalModel, `${label} not authenticated — run \`crtr sys setup\` (or /provider-sub ${providerId} add) (tried ${triedList})`);
|
|
884
|
+
return;
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
const fallbackHint = fallbackRejectionHint(fallbackResolution);
|
|
888
|
+
const coolingProviders = new Set(attempted);
|
|
889
|
+
if (!fallbackResolution.target && fallbackResolution.reason === "cooling" && fallbackResolution.candidate) {
|
|
890
|
+
coolingProviders.add(fallbackResolution.candidate.providerId);
|
|
891
|
+
}
|
|
892
|
+
const coolingDeadline = earliestCoolingDeadline(coolingProviders, localCoolingDeadlines);
|
|
893
|
+
if (coolingDeadline !== undefined) {
|
|
894
|
+
const coolingSecs = Math.ceil((coolingDeadline - Date.now()) / 1000);
|
|
895
|
+
emitCoolingError(
|
|
896
|
+
stream,
|
|
897
|
+
terminalModel,
|
|
898
|
+
new ManagedProviderCoolingError(
|
|
899
|
+
`All managed providers are rate limited (cooling down ~${coolingSecs}s); ${fallbackHint} (tried ${triedList})`,
|
|
900
|
+
coolingDeadline,
|
|
901
|
+
),
|
|
902
|
+
);
|
|
903
|
+
return;
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
const authFailure = [...authFailures][0];
|
|
907
|
+
if (authFailure !== undefined) {
|
|
908
|
+
emitTerminalError(stream, terminalModel, `Provider authentication failed (invalid_grant) for ${authFailure}; re-authenticate the credential and retry (tried ${triedList})`);
|
|
909
|
+
return;
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
emitTerminalError(
|
|
913
|
+
stream,
|
|
914
|
+
terminalModel,
|
|
915
|
+
`All managed provider pools exhausted; ${fallbackHint} (tried ${triedList})`,
|
|
916
|
+
);
|
|
917
|
+
}
|
|
918
|
+
|
|
919
|
+
// The earliest strictly-future cooldown deadline across every managed pool tried
|
|
920
|
+
// this turn, or undefined unless EVERY existing credential in those pools is
|
|
921
|
+
// cooling (a single ready credential, or an empty attempted set, means this is not
|
|
922
|
+
// an all-cooling condition and must not be typed as such). Read fresh under each
|
|
923
|
+
// pool's lock-free snapshot, mirroring the wait-out math above.
|
|
924
|
+
function earliestCoolingDeadline(
|
|
925
|
+
attempted: Set<ManagedProviderId>,
|
|
926
|
+
localCoolingDeadlines = new Map<ManagedProviderId, number>(),
|
|
927
|
+
): number | undefined {
|
|
928
|
+
const now = Date.now();
|
|
929
|
+
let earliest: number | undefined;
|
|
930
|
+
let sawCredential = false;
|
|
931
|
+
for (const attemptedProvider of attempted) {
|
|
932
|
+
const localUntil = localCoolingDeadlines.get(attemptedProvider) ?? 0;
|
|
933
|
+
if (localUntil > now) {
|
|
934
|
+
sawCredential = true;
|
|
935
|
+
if (earliest === undefined || localUntil < earliest) earliest = localUntil;
|
|
936
|
+
continue;
|
|
937
|
+
}
|
|
938
|
+
for (const entry of readSubscriptionPool(attemptedProvider)) {
|
|
939
|
+
if (entry.authFailure !== undefined) continue;
|
|
940
|
+
sawCredential = true;
|
|
941
|
+
const until = entry.rateLimitedUntil || 0;
|
|
942
|
+
if (until <= now) return undefined; // a ready credential exists — not all cooling
|
|
943
|
+
if (earliest === undefined || until < earliest) earliest = until;
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
return sawCredential ? earliest : undefined;
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
// Emit the typed cooling terminal error, attaching its diagnostic (the earliest
|
|
950
|
+
// deadline) to the assistant error message so the deadline survives verbatim into
|
|
951
|
+
// agent_end.messages for the stophook to read.
|
|
952
|
+
function emitCoolingError(stream: AssistantMessageEventStream, model: Model<any>, error: ManagedProviderCoolingError): void {
|
|
953
|
+
const message = toAssistantError(model, error.message);
|
|
954
|
+
message.diagnostics = [error.toDiagnostic()];
|
|
955
|
+
stream.push({ type: "error", reason: "error", error: message });
|
|
956
|
+
stream.end();
|
|
957
|
+
}
|
|
958
|
+
|
|
959
|
+
function streamManagedProvider(model: Model<any>, context: Context, options?: SimpleStreamOptions): AssistantMessageEventStream {
|
|
960
|
+
if (!isManagedProvider(model.provider)) {
|
|
961
|
+
return streamForProvider(model, context, options);
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
const stream = createAssistantMessageEventStream();
|
|
965
|
+
|
|
966
|
+
runManagedProvider(model, context, options, stream).catch((error) => {
|
|
967
|
+
stream.push({
|
|
968
|
+
type: "error",
|
|
969
|
+
reason: "error",
|
|
970
|
+
error: toAssistantError(model, error instanceof Error ? error.message : String(error)),
|
|
971
|
+
});
|
|
972
|
+
stream.end();
|
|
973
|
+
});
|
|
974
|
+
|
|
975
|
+
return stream;
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
function parseCommand(args: string): string[] {
|
|
979
|
+
return args
|
|
980
|
+
.trim()
|
|
981
|
+
.split(/\s+/)
|
|
982
|
+
.map((part) => part.trim())
|
|
983
|
+
.filter(Boolean);
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
function parseProvider(value: string | undefined): ManagedProviderId | undefined {
|
|
987
|
+
return isManagedProvider(value) ? value : undefined;
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
function updateRotationStatus(ctx: ExtensionContext): void {
|
|
991
|
+
const current = getCurrentModelRef(ctx.model);
|
|
992
|
+
if (current) setStatus(formatStatusLine(current.providerId));
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
// Manual-code input is a human-in-the-loop OAuth round-trip (open link, log in on
|
|
996
|
+
// whatever device, copy the localhost redirect URL back) that routinely exceeds
|
|
997
|
+
// DEFAULT_DIALOG_TIMEOUT_MS -- give it a human-scale bound instead of the ordinary
|
|
998
|
+
// confirm/select default.
|
|
999
|
+
const OAUTH_MANUAL_INPUT_TIMEOUT_MS = 600_000;
|
|
1000
|
+
|
|
1001
|
+
/**
|
|
1002
|
+
* pi-ai races the manual-code-paste dialog against its loopback callback server. When the
|
|
1003
|
+
* callback supplies a code, the manual-input promise can remain pending, so `run` receives:
|
|
1004
|
+
* - `readCode`, a `ctx.ui.input` wrapper with an AbortSignal. Aborting it removes the pending
|
|
1005
|
+
* broker entry and emits an `extension_ui_dismiss` frame for exactly that dialog.
|
|
1006
|
+
* - `dismissManual`, which aborts the signal at the post-code `onProgress` boundary before
|
|
1007
|
+
* the token exchange completes. `onProgress` is emitted only after a code is available, so
|
|
1008
|
+
* dismissing then cannot close a dialog the user still needs; `finally` covers paths without
|
|
1009
|
+
* progress, and repeated AbortController calls are inert.
|
|
1010
|
+
*
|
|
1011
|
+
* `undefined` from `readCode` means cancellation or timeout. It throws so OAuth ends directly
|
|
1012
|
+
* instead of opening a second paste-only dialog.
|
|
1013
|
+
*/
|
|
1014
|
+
export async function loginWithManualInputCleanup<T>(
|
|
1015
|
+
ctx: ExtensionContext,
|
|
1016
|
+
run: (
|
|
1017
|
+
readCode: (title: string, placeholder: string) => Promise<string>,
|
|
1018
|
+
dismissManual: () => void,
|
|
1019
|
+
) => Promise<T>,
|
|
1020
|
+
): Promise<T> {
|
|
1021
|
+
const controller = new AbortController();
|
|
1022
|
+
const readCode = async (title: string, placeholder: string): Promise<string> => {
|
|
1023
|
+
const result = await ctx.ui.input(title, placeholder, { timeout: OAUTH_MANUAL_INPUT_TIMEOUT_MS, signal: controller.signal });
|
|
1024
|
+
if (result === undefined) throw new Error("OAuth login cancelled");
|
|
1025
|
+
return result;
|
|
1026
|
+
};
|
|
1027
|
+
try {
|
|
1028
|
+
return await run(readCode, () => controller.abort());
|
|
1029
|
+
} finally {
|
|
1030
|
+
controller.abort();
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
// The manual-code dialog carries the authorize URL in its title (rendered as a tappable link
|
|
1035
|
+
// on web), so a headless remote box where `openBrowser` opens nothing still has a real path
|
|
1036
|
+
// through login. pi's own `manual_code` message is URL-less, hence these per-provider titles.
|
|
1037
|
+
const MANUAL_CODE_DIALOG: Record<ManagedProviderId, { title: (url: string | undefined) => string; placeholder: string }> = {
|
|
1038
|
+
[ANTHROPIC_PROVIDER_ID]: {
|
|
1039
|
+
title: (url) => `Open this URL to authenticate Claude:\n${url}\n\nPaste the redirect URL or code`,
|
|
1040
|
+
placeholder: "http://localhost:53692/callback?...",
|
|
1041
|
+
},
|
|
1042
|
+
[OPENAI_CODEX_PROVIDER_ID]: {
|
|
1043
|
+
title: (url) => `Open this URL to authenticate OpenAI Codex:\n${url}\n\nPaste the redirect URL or code`,
|
|
1044
|
+
placeholder: "http://localhost:1455/auth/callback?...",
|
|
1045
|
+
},
|
|
1046
|
+
};
|
|
1047
|
+
|
|
1048
|
+
// This extension adapts the provider OAuth interaction onto `ctx.ui`. The attach viewer and
|
|
1049
|
+
// `crtr sys setup` use LoginDialogComponent with `core/auth-interaction.ts`; the broker uses
|
|
1050
|
+
// the dialog primitives below.
|
|
1051
|
+
async function loginProvider(providerId: ManagedProviderId, ctx: ExtensionContext): Promise<LoginCredential> {
|
|
1052
|
+
const oauth = oauthFlow(providerId, ctx);
|
|
1053
|
+
const manual = MANUAL_CODE_DIALOG[providerId];
|
|
1054
|
+
let authorizeUrl: string | undefined;
|
|
1055
|
+
return loginWithManualInputCleanup(ctx, (readCode, dismissManual) =>
|
|
1056
|
+
oauth.login({
|
|
1057
|
+
notify: (event: AuthEvent): void => {
|
|
1058
|
+
switch (event.type) {
|
|
1059
|
+
case "auth_url":
|
|
1060
|
+
authorizeUrl = event.url;
|
|
1061
|
+
openBrowser(event.url);
|
|
1062
|
+
if (event.instructions) ctx.ui.notify(event.instructions, "info");
|
|
1063
|
+
break;
|
|
1064
|
+
case "device_code":
|
|
1065
|
+
openBrowser(event.verificationUri);
|
|
1066
|
+
ctx.ui.notify(`Enter code ${event.userCode} at ${event.verificationUri}`, "info");
|
|
1067
|
+
break;
|
|
1068
|
+
case "progress":
|
|
1069
|
+
// Progress follows receipt of an OAuth code, so dismiss the now-unneeded manual
|
|
1070
|
+
// dialog before token exchange. The browser path may emit no progress; `finally`
|
|
1071
|
+
// closes that dialog when the OAuth attempt settles.
|
|
1072
|
+
dismissManual();
|
|
1073
|
+
ctx.ui.notify(event.message, "info");
|
|
1074
|
+
break;
|
|
1075
|
+
case "info":
|
|
1076
|
+
ctx.ui.notify(event.message, "info");
|
|
1077
|
+
break;
|
|
1078
|
+
}
|
|
1079
|
+
},
|
|
1080
|
+
prompt: async (prompt: AuthPrompt): Promise<string> => {
|
|
1081
|
+
if (prompt.type === "manual_code") return readCode(manual.title(authorizeUrl), manual.placeholder);
|
|
1082
|
+
if (prompt.type === "select") {
|
|
1083
|
+
// Codex now opens its login with a browser-vs-device-code choice.
|
|
1084
|
+
const labels = prompt.options.map((option) => option.label);
|
|
1085
|
+
const chosen = await ctx.ui.select(prompt.message, labels);
|
|
1086
|
+
const selected = chosen === undefined ? undefined : prompt.options[labels.indexOf(chosen)];
|
|
1087
|
+
if (!selected) throw new Error("OAuth login cancelled");
|
|
1088
|
+
return selected.id;
|
|
1089
|
+
}
|
|
1090
|
+
return (await ctx.ui.input(prompt.message, prompt.placeholder ?? "")) ?? "";
|
|
1091
|
+
},
|
|
1092
|
+
}),
|
|
1093
|
+
);
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
export default async function (pi: ExtensionAPI): Promise<void> {
|
|
1097
|
+
extensionAPI = pi;
|
|
1098
|
+
|
|
1099
|
+
pi.registerProvider(ANTHROPIC_PROVIDER_ID, {
|
|
1100
|
+
api: "anthropic-messages",
|
|
1101
|
+
streamSimple: streamManagedProvider,
|
|
1102
|
+
});
|
|
1103
|
+
|
|
1104
|
+
pi.registerProvider(OPENAI_CODEX_PROVIDER_ID, {
|
|
1105
|
+
api: "openai-codex-responses",
|
|
1106
|
+
streamSimple: streamManagedProvider,
|
|
1107
|
+
});
|
|
1108
|
+
|
|
1109
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
1110
|
+
runtimeContext = ctx;
|
|
1111
|
+
const restored = readManagedProviderRotationPolicy(ctx.ui).allowCrossProviderFallback
|
|
1112
|
+
&& await restorePreferredModelIfPossible(pi, ctx);
|
|
1113
|
+
if (restored && ctx.model) {
|
|
1114
|
+
logRotation(`restored preferred ${ctx.model.provider}/${ctx.model.id}`);
|
|
1115
|
+
setStatus(formatStatusLine(ctx.model.provider as ManagedProviderId));
|
|
1116
|
+
}
|
|
1117
|
+
updateRotationStatus(ctx);
|
|
1118
|
+
});
|
|
1119
|
+
|
|
1120
|
+
pi.on("before_agent_start", async (_event, ctx) => {
|
|
1121
|
+
runtimeContext = ctx;
|
|
1122
|
+
const restored = readManagedProviderRotationPolicy(ctx.ui).allowCrossProviderFallback
|
|
1123
|
+
&& await restorePreferredModelIfPossible(pi, ctx);
|
|
1124
|
+
if (restored && ctx.model) {
|
|
1125
|
+
logRotation(`restored preferred ${ctx.model.provider}/${ctx.model.id}`);
|
|
1126
|
+
setStatus(formatStatusLine(ctx.model.provider as ManagedProviderId));
|
|
1127
|
+
}
|
|
1128
|
+
});
|
|
1129
|
+
|
|
1130
|
+
pi.on("model_select", async (_event, ctx) => {
|
|
1131
|
+
runtimeContext = ctx;
|
|
1132
|
+
updateRotationStatus(ctx);
|
|
1133
|
+
});
|
|
1134
|
+
|
|
1135
|
+
pi.registerCommand("provider-sub", {
|
|
1136
|
+
description: "Manage subscription credential pools for provider rotation",
|
|
1137
|
+
handler: async (args, ctx) => {
|
|
1138
|
+
const [providerArg, verb, ...rest] = parseCommand(args);
|
|
1139
|
+
const providerId = parseProvider(providerArg);
|
|
1140
|
+
if (!providerId) {
|
|
1141
|
+
ctx.ui.notify("Usage: /provider-sub <anthropic|openai-codex> <list|add|select|rm>", "error");
|
|
1142
|
+
return;
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
const action = verb === "rm" ? "remove" : verb || "list";
|
|
1146
|
+
|
|
1147
|
+
if (action === "status" || action === "list") {
|
|
1148
|
+
const pool = readSubscriptionPool(providerId);
|
|
1149
|
+
const lines = [formatStatusLine(providerId), ""];
|
|
1150
|
+
for (const [index, entry] of pool.entries()) {
|
|
1151
|
+
const cooldown = entry.rateLimitedUntil > Date.now() ? ` cooldown=${Math.ceil((entry.rateLimitedUntil - Date.now()) / 1000)}s` : "";
|
|
1152
|
+
const account = entry.accountId ? ` account=${shortAccountId(entry.accountId)}` : "";
|
|
1153
|
+
lines.push(`${index + 1}. ${entry.label}${account}${cooldown}`);
|
|
1154
|
+
}
|
|
1155
|
+
ctx.ui.notify(lines.join("\n"), "info");
|
|
1156
|
+
return;
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
if (action === "add") {
|
|
1160
|
+
if (!ctx.hasUI) {
|
|
1161
|
+
ctx.ui.notify(`${getProviderLabel(providerId)} login requires an interactive UI.`, "error");
|
|
1162
|
+
return;
|
|
1163
|
+
}
|
|
1164
|
+
const pool = readSubscriptionPool(providerId);
|
|
1165
|
+
const label = (rest.join(" ") || (await ctx.ui.input(`${getProviderLabel(providerId)} subscription label`, "")) || "").trim();
|
|
1166
|
+
if (!label) return;
|
|
1167
|
+
if (pool.some((entry) => entry.label.toLowerCase() === label.toLowerCase())) {
|
|
1168
|
+
ctx.ui.notify(`${getProviderLabel(providerId)} subscription already exists: ${label}`, "error");
|
|
1169
|
+
return;
|
|
1170
|
+
}
|
|
1171
|
+
try {
|
|
1172
|
+
const cred = await activeLoginForProvider(providerId, ctx);
|
|
1173
|
+
const identity = await enrichManagedLoginIdentity(providerId, cred);
|
|
1174
|
+
// Explicit add always creates a new label, so a matching real account is rejected by
|
|
1175
|
+
// the locked uniqueness gate rather than creating a second quota slot.
|
|
1176
|
+
await addSubscription(providerId, {
|
|
1177
|
+
label,
|
|
1178
|
+
refresh: cred.refresh,
|
|
1179
|
+
access: cred.access,
|
|
1180
|
+
expires: cred.expires,
|
|
1181
|
+
...(identity.accountId ? { accountId: identity.accountId } : {}),
|
|
1182
|
+
rateLimitedUntil: 0,
|
|
1183
|
+
lastAttemptAt: 0,
|
|
1184
|
+
lastRateLimitedAt: 0,
|
|
1185
|
+
});
|
|
1186
|
+
logRotation(`added ${getProviderLabel(providerId)} subscription "${label}"`);
|
|
1187
|
+
ctx.ui.notify(`Added ${getProviderLabel(providerId)} subscription: ${label}`, "info");
|
|
1188
|
+
updateRotationStatus(ctx);
|
|
1189
|
+
} catch (error) {
|
|
1190
|
+
ctx.ui.notify(error instanceof Error ? error.message : String(error), "error");
|
|
1191
|
+
}
|
|
1192
|
+
return;
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
if (action === "select") {
|
|
1196
|
+
const ref = rest.join(" ");
|
|
1197
|
+
if (!ref) {
|
|
1198
|
+
ctx.ui.notify(`Usage: /provider-sub ${providerId} select <label|index>`, "error");
|
|
1199
|
+
return;
|
|
1200
|
+
}
|
|
1201
|
+
try {
|
|
1202
|
+
await promoteSubscription(providerId, ref);
|
|
1203
|
+
logRotation(`selected ${getProviderLabel(providerId)} subscription "${ref}"`);
|
|
1204
|
+
ctx.ui.notify(`Preferred ${getProviderLabel(providerId)} subscription: ${ref}`, "info");
|
|
1205
|
+
updateRotationStatus(ctx);
|
|
1206
|
+
} catch (error) {
|
|
1207
|
+
ctx.ui.notify(error instanceof Error ? error.message : String(error), "error");
|
|
1208
|
+
}
|
|
1209
|
+
return;
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
if (action === "remove") {
|
|
1213
|
+
const ref = rest.join(" ");
|
|
1214
|
+
if (!ref) {
|
|
1215
|
+
ctx.ui.notify(`Usage: /provider-sub ${providerId} rm <label|index>`, "error");
|
|
1216
|
+
return;
|
|
1217
|
+
}
|
|
1218
|
+
try {
|
|
1219
|
+
await removeManagedAccount(providerId, ref);
|
|
1220
|
+
logRotation(`removed ${getProviderLabel(providerId)} subscription "${ref}"`);
|
|
1221
|
+
ctx.ui.notify(`Removed ${getProviderLabel(providerId)} subscription: ${ref}`, "info");
|
|
1222
|
+
updateRotationStatus(ctx);
|
|
1223
|
+
} catch (error) {
|
|
1224
|
+
ctx.ui.notify(error instanceof Error ? error.message : String(error), "error");
|
|
1225
|
+
}
|
|
1226
|
+
return;
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
ctx.ui.notify(`Unknown /provider-sub verb: ${verb}`, "error");
|
|
1230
|
+
},
|
|
1231
|
+
});
|
|
1232
|
+
}
|