open-multi-agent-kit 0.95.1 → 0.96.0
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/CHANGELOG.md +37 -0
- package/README.md +16 -1
- package/dist/approvals/approval-receipt-store.d.ts +18 -0
- package/dist/approvals/approval-receipt-store.d.ts.map +1 -0
- package/dist/approvals/approval-receipt-store.js +194 -0
- package/dist/approvals/approval-receipt-store.js.map +1 -0
- package/dist/approvals/approval-receipt.d.ts +43 -0
- package/dist/approvals/approval-receipt.d.ts.map +1 -0
- package/dist/approvals/approval-receipt.js +208 -0
- package/dist/approvals/approval-receipt.js.map +1 -0
- package/dist/approvals/approval-verifier.d.ts +17 -0
- package/dist/approvals/approval-verifier.d.ts.map +1 -0
- package/dist/approvals/approval-verifier.js +23 -0
- package/dist/approvals/approval-verifier.js.map +1 -0
- package/dist/approvals/plannotator-approval-bridge.d.ts +58 -0
- package/dist/approvals/plannotator-approval-bridge.d.ts.map +1 -0
- package/dist/approvals/plannotator-approval-bridge.js +169 -0
- package/dist/approvals/plannotator-approval-bridge.js.map +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +2 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/commands/package-doctor-cli.d.ts +13 -0
- package/dist/commands/package-doctor-cli.d.ts.map +1 -0
- package/dist/commands/package-doctor-cli.js +80 -0
- package/dist/commands/package-doctor-cli.js.map +1 -0
- package/dist/commands/router-feedback-cli.d.ts +11 -0
- package/dist/commands/router-feedback-cli.d.ts.map +1 -0
- package/dist/commands/router-feedback-cli.js +99 -0
- package/dist/commands/router-feedback-cli.js.map +1 -0
- package/dist/commands/stats-cli.d.ts +20 -0
- package/dist/commands/stats-cli.d.ts.map +1 -0
- package/dist/commands/stats-cli.js +99 -0
- package/dist/commands/stats-cli.js.map +1 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +4 -1
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +99 -31
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +624 -216
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js +8 -2
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/compaction/transaction.d.ts +9 -0
- package/dist/core/compaction/transaction.d.ts.map +1 -1
- package/dist/core/compaction/transaction.js +17 -2
- package/dist/core/compaction/transaction.js.map +1 -1
- package/dist/core/context-budget-governor-v2.d.ts +1 -1
- package/dist/core/context-budget-governor-v2.d.ts.map +1 -1
- package/dist/core/context-budget-governor-v2.js +1 -1
- package/dist/core/context-budget-governor-v2.js.map +1 -1
- package/dist/core/context-budget-system-prompt.d.ts.map +1 -1
- package/dist/core/context-budget-system-prompt.js +18 -2
- package/dist/core/context-budget-system-prompt.js.map +1 -1
- package/dist/core/context-budget-v2-cache-disk.d.ts +109 -0
- package/dist/core/context-budget-v2-cache-disk.d.ts.map +1 -0
- package/dist/core/context-budget-v2-cache-disk.js +343 -0
- package/dist/core/context-budget-v2-cache-disk.js.map +1 -0
- package/dist/core/context-budget-v2-cache-keys.d.ts +22 -0
- package/dist/core/context-budget-v2-cache-keys.d.ts.map +1 -1
- package/dist/core/context-budget-v2-cache-keys.js +4 -4
- package/dist/core/context-budget-v2-cache-keys.js.map +1 -1
- package/dist/core/context-budget-v2-cache.d.ts +1 -0
- package/dist/core/context-budget-v2-cache.d.ts.map +1 -1
- package/dist/core/context-budget-v2-cache.js +1 -0
- package/dist/core/context-budget-v2-cache.js.map +1 -1
- package/dist/core/context-budget-v2-planner.d.ts.map +1 -1
- package/dist/core/context-budget-v2-planner.js +17 -14
- package/dist/core/context-budget-v2-planner.js.map +1 -1
- package/dist/core/context-budget-v2-types.d.ts +1 -0
- package/dist/core/context-budget-v2-types.d.ts.map +1 -1
- package/dist/core/context-budget-v2-types.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +45 -22
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/types.d.ts +4 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/mcp/client.d.ts +105 -0
- package/dist/core/mcp/client.d.ts.map +1 -0
- package/dist/core/mcp/client.js +198 -0
- package/dist/core/mcp/client.js.map +1 -0
- package/dist/core/mcp/config.d.ts +23 -0
- package/dist/core/mcp/config.d.ts.map +1 -0
- package/dist/core/mcp/config.js +89 -0
- package/dist/core/mcp/config.js.map +1 -0
- package/dist/core/mcp/index.d.ts +15 -0
- package/dist/core/mcp/index.d.ts.map +1 -0
- package/dist/core/mcp/index.js +15 -0
- package/dist/core/mcp/index.js.map +1 -0
- package/dist/core/mcp/manager.d.ts +84 -0
- package/dist/core/mcp/manager.d.ts.map +1 -0
- package/dist/core/mcp/manager.js +173 -0
- package/dist/core/mcp/manager.js.map +1 -0
- package/dist/core/mcp/protocol.d.ts +59 -0
- package/dist/core/mcp/protocol.d.ts.map +1 -0
- package/dist/core/mcp/protocol.js +103 -0
- package/dist/core/mcp/protocol.js.map +1 -0
- package/dist/core/mcp/stdio-transport.d.ts +63 -0
- package/dist/core/mcp/stdio-transport.d.ts.map +1 -0
- package/dist/core/mcp/stdio-transport.js +132 -0
- package/dist/core/mcp/stdio-transport.js.map +1 -0
- package/dist/core/mcp/tools.d.ts +47 -0
- package/dist/core/mcp/tools.d.ts.map +1 -0
- package/dist/core/mcp/tools.js +102 -0
- package/dist/core/mcp/tools.js.map +1 -0
- package/dist/core/package-archive.d.ts +3 -0
- package/dist/core/package-archive.d.ts.map +1 -0
- package/dist/core/package-archive.js +161 -0
- package/dist/core/package-archive.js.map +1 -0
- package/dist/core/package-doctor-source-scan.d.ts +13 -0
- package/dist/core/package-doctor-source-scan.d.ts.map +1 -0
- package/dist/core/package-doctor-source-scan.js +124 -0
- package/dist/core/package-doctor-source-scan.js.map +1 -0
- package/dist/core/package-doctor.d.ts +41 -0
- package/dist/core/package-doctor.d.ts.map +1 -0
- package/dist/core/package-doctor.js +145 -0
- package/dist/core/package-doctor.js.map +1 -0
- package/dist/core/package-manager.d.ts +10 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +175 -42
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/package-manifest.d.ts +26 -0
- package/dist/core/package-manifest.d.ts.map +1 -0
- package/dist/core/package-manifest.js +85 -0
- package/dist/core/package-manifest.js.map +1 -0
- package/dist/core/pi-compat.d.ts +5 -0
- package/dist/core/pi-compat.d.ts.map +1 -0
- package/dist/core/pi-compat.js +18 -0
- package/dist/core/pi-compat.js.map +1 -0
- package/dist/core/provider-resilience.d.ts +7 -0
- package/dist/core/provider-resilience.d.ts.map +1 -1
- package/dist/core/provider-resilience.js +11 -0
- package/dist/core/provider-resilience.js.map +1 -1
- package/dist/core/reasoning-router-bias.d.ts +10 -14
- package/dist/core/reasoning-router-bias.d.ts.map +1 -1
- package/dist/core/reasoning-router-bias.js +22 -15
- package/dist/core/reasoning-router-bias.js.map +1 -1
- package/dist/core/reasoning-router-v4.d.ts +9 -1
- package/dist/core/reasoning-router-v4.d.ts.map +1 -1
- package/dist/core/reasoning-router-v4.js +20 -5
- package/dist/core/reasoning-router-v4.js.map +1 -1
- package/dist/core/redaction.d.ts +2 -5
- package/dist/core/redaction.d.ts.map +1 -1
- package/dist/core/redaction.js +14 -1
- package/dist/core/redaction.js.map +1 -1
- package/dist/core/repository-learning-scope.d.ts +10 -0
- package/dist/core/repository-learning-scope.d.ts.map +1 -0
- package/dist/core/repository-learning-scope.js +42 -0
- package/dist/core/repository-learning-scope.js.map +1 -0
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +16 -1
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/router-feedback-collector.d.ts +2 -1
- package/dist/core/router-feedback-collector.d.ts.map +1 -1
- package/dist/core/router-feedback-collector.js +2 -2
- package/dist/core/router-feedback-collector.js.map +1 -1
- package/dist/core/runtime-provenance.d.ts +54 -0
- package/dist/core/runtime-provenance.d.ts.map +1 -0
- package/dist/core/runtime-provenance.js +115 -0
- package/dist/core/runtime-provenance.js.map +1 -0
- package/dist/core/sandbox/backend.d.ts.map +1 -1
- package/dist/core/sandbox/backend.js +39 -21
- package/dist/core/sandbox/backend.js.map +1 -1
- package/dist/core/sandbox/default-policy.d.ts +4 -5
- package/dist/core/sandbox/default-policy.d.ts.map +1 -1
- package/dist/core/sandbox/default-policy.js +9 -11
- package/dist/core/sandbox/default-policy.js.map +1 -1
- package/dist/core/session-bash-runtime.d.ts +4 -4
- package/dist/core/session-bash-runtime.d.ts.map +1 -1
- package/dist/core/session-bash-runtime.js +6 -5
- package/dist/core/session-bash-runtime.js.map +1 -1
- package/dist/core/session-compaction-service.d.ts.map +1 -1
- package/dist/core/session-compaction-service.js +7 -7
- package/dist/core/session-compaction-service.js.map +1 -1
- package/dist/core/session-manager.d.ts +4 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +47 -7
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +7 -4
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +11 -3
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/subagent-orchestration.d.ts.map +1 -1
- package/dist/core/subagent-orchestration.js +4 -2
- package/dist/core/subagent-orchestration.js.map +1 -1
- package/dist/core/system-prompt.d.ts +9 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +10 -4
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash.d.ts +2 -2
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +2 -1
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/diagnostics.d.ts.map +1 -1
- package/dist/core/tools/diagnostics.js +8 -2
- package/dist/core/tools/diagnostics.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js +15 -0
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/turn-metrics.d.ts +135 -0
- package/dist/core/turn-metrics.d.ts.map +1 -0
- package/dist/core/turn-metrics.js +261 -0
- package/dist/core/turn-metrics.js.map +1 -0
- package/dist/core/verified-bash-runtime.d.ts.map +1 -1
- package/dist/core/verified-bash-runtime.js +10 -4
- package/dist/core/verified-bash-runtime.js.map +1 -1
- package/dist/guardrails/evidence-protocol.d.ts +10 -0
- package/dist/guardrails/evidence-protocol.d.ts.map +1 -0
- package/dist/guardrails/evidence-protocol.js +34 -0
- package/dist/guardrails/evidence-protocol.js.map +1 -0
- package/dist/guardrails/evidence-system.d.ts +3 -1
- package/dist/guardrails/evidence-system.d.ts.map +1 -1
- package/dist/guardrails/evidence-system.js +22 -14
- package/dist/guardrails/evidence-system.js.map +1 -1
- package/dist/guardrails/replay-ledger-lock-owner.d.ts +7 -0
- package/dist/guardrails/replay-ledger-lock-owner.d.ts.map +1 -1
- package/dist/guardrails/replay-ledger-lock-owner.js +42 -1
- package/dist/guardrails/replay-ledger-lock-owner.js.map +1 -1
- package/dist/guardrails/replay-payload-hash.d.ts +6 -0
- package/dist/guardrails/replay-payload-hash.d.ts.map +1 -0
- package/dist/guardrails/replay-payload-hash.js +24 -0
- package/dist/guardrails/replay-payload-hash.js.map +1 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +18 -0
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -1
- package/dist/modes/interactive/components/control-panel-layout.js +2 -2
- package/dist/modes/interactive/components/control-panel-layout.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +3 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +40 -12
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +10 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/status-sidebar.d.ts +14 -2
- package/dist/modes/interactive/components/status-sidebar.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-sidebar.js +106 -19
- package/dist/modes/interactive/components/status-sidebar.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +10 -1
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +104 -17
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +1 -1
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +1 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +1 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/types/evidence.d.ts +11 -3
- package/dist/types/evidence.d.ts.map +1 -1
- package/dist/types/evidence.js.map +1 -1
- package/docs/book-to-skill.md +79 -0
- package/docs/compaction.md +35 -3
- package/docs/containerization.md +14 -2
- package/docs/docs.json +16 -0
- package/docs/environment-variables.md +1 -1
- package/docs/extensions.md +75 -16
- package/docs/index.md +3 -0
- package/docs/mcp.md +97 -0
- package/docs/metrics.md +87 -0
- package/docs/models.md +12 -0
- package/docs/packages.md +25 -4
- package/docs/provider-resilience.md +37 -56
- package/docs/providers.md +5 -1
- package/docs/run-protocol.md +72 -0
- package/docs/sdk.md +40 -6
- package/docs/sessions.md +6 -0
- package/docs/settings.md +10 -7
- package/docs/skills.md +9 -1
- package/docs/usage.md +14 -4
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/plannotator-approval-bridge.ts +83 -0
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/subagent/README.md +21 -11
- package/examples/extensions/subagent/adaptive-agent-runtime.ts +9 -3
- package/examples/extensions/subagent/agents/planner.md +0 -2
- package/examples/extensions/subagent/agents/reviewer.md +0 -2
- package/examples/extensions/subagent/agents/scout.md +0 -2
- package/examples/extensions/subagent/agents/worker.md +0 -1
- package/examples/extensions/subagent/agents.test.ts +9 -0
- package/examples/extensions/subagent/agents.ts +11 -4
- package/examples/extensions/subagent/deadline-budget.test.ts +32 -0
- package/examples/extensions/subagent/deadline-budget.ts +25 -1
- package/examples/extensions/subagent/fixtures/fake-omk-json.mjs +10 -0
- package/examples/extensions/subagent/index.ts +234 -55
- package/examples/extensions/subagent/subagent-execution-policy.test.ts +27 -0
- package/examples/extensions/subagent/subagent-extension-smoke.test.ts +167 -2
- package/examples/extensions/subagent/workflow-graph.test.ts +80 -0
- package/examples/extensions/subagent/workflow-graph.ts +89 -0
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +275 -439
- package/package.json +11 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-doctor.d.ts","sourceRoot":"","sources":["../../src/core/package-doctor.ts"],"names":[],"mappings":"AASA,OAAO,EAAkC,KAAK,kBAAkB,EAA0B,MAAM,uBAAuB,CAAC;AAIxH,MAAM,WAAW,sBAAsB;IACtC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,sBAAsB,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IAClC,EAAE,EACC,UAAU,GACV,WAAW,GACX,iBAAiB,GACjB,eAAe,GACf,kBAAkB,GAClB,aAAa,GACb,kBAAkB,GAClB,eAAe,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IACnC,aAAa,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,QAAQ,EAAE;QACT,QAAQ,EAAE,kBAAkB,GAAG,YAAY,CAAC;QAC5C,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACtD,CAAC;IACF,SAAS,EAAE,MAAM,CAAC,MAAM,sBAAsB,EAAE,MAAM,CAAC,CAAC;IACxD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,UAAU,EAAE,OAAO,CAAC;CACpB;AA+ED,8FAA8F;AAC9F,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,kBAAkB,GAAG,mBAAmB,CA8G1F","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { basename, resolve } from \"node:path\";\nimport {\n\timportedSpecifiers,\n\tPACKAGE_DOCTOR_SUPPORTED_EVENTS,\n\tscanPackageExtensionSources,\n\tsourceFilesMatching,\n\tsubscribedEvents,\n} from \"./package-doctor-source-scan.ts\";\nimport { type PackageManifestDiagnostic, type PackageManifestKey, resolvePackageManifest } from \"./package-manifest.ts\";\nimport { isLegacyPiRuntimeImport, isSupportedLegacyPiRuntimeImport } from \"./pi-compat.ts\";\nimport { redactSensitiveTextForced } from \"./redaction.ts\";\n\nexport interface PackageDoctorResources {\n\textensions: string[];\n\tskills: string[];\n\tprompts: string[];\n\tthemes: string[];\n}\n\nexport interface PackageDoctorInput {\n\tsource: string;\n\tpackageRoot: string;\n\tresources: PackageDoctorResources;\n}\n\nexport interface PackageDoctorCheck {\n\tid:\n\t\t| \"manifest\"\n\t\t| \"resources\"\n\t\t| \"runtime-imports\"\n\t\t| \"storage-paths\"\n\t\t| \"lifecycle-events\"\n\t\t| \"headless-ui\"\n\t\t| \"resume-awareness\"\n\t\t| \"scan-coverage\";\n\tstatus: \"pass\" | \"warning\" | \"error\";\n\tmessage: string;\n\tfiles?: string[];\n}\n\nexport interface PackageDoctorResult {\n\tschemaVersion: 1;\n\tsource: string;\n\tpackage: { name?: string; version?: string };\n\tmanifest: {\n\t\tselected: PackageManifestKey | \"convention\";\n\t\tshadowedPi: boolean;\n\t\tdiagnostics: Array<{ path: string; message: string }>;\n\t};\n\tresources: Record<keyof PackageDoctorResources, number>;\n\tinspectedFiles: string[];\n\tchecks: PackageDoctorCheck[];\n\tcompatible: boolean;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction packageMetadata(value: unknown): { name?: string; version?: string } {\n\tif (!isRecord(value)) return {};\n\treturn {\n\t\t...(typeof value.name === \"string\" ? { name: redactSensitiveTextForced(value.name).slice(0, 256) } : {}),\n\t\t...(typeof value.version === \"string\" ? { version: redactSensitiveTextForced(value.version).slice(0, 128) } : {}),\n\t};\n}\n\nfunction sanitizePackageSource(source: string): string {\n\tconst redacted = redactSensitiveTextForced(source);\n\tif (redacted.startsWith(\"npm:\")) return redacted;\n\tconst hasGitPrefix = redacted.startsWith(\"git:\");\n\tconst candidate = hasGitPrefix ? redacted.slice(\"git:\".length) : redacted;\n\tif (/^(?:https?|ssh|git):\\/\\//iu.test(candidate)) {\n\t\ttry {\n\t\t\tconst url = new URL(candidate);\n\t\t\turl.username = \"\";\n\t\t\turl.password = \"\";\n\t\t\turl.search = \"\";\n\t\t\turl.hash = \"\";\n\t\t\treturn `${hasGitPrefix ? \"git:\" : \"\"}${url.toString()}`;\n\t\t} catch {\n\t\t\treturn \"<remote-package>\";\n\t\t}\n\t}\n\tif (hasGitPrefix) return \"<git-package>\";\n\treturn `local:${basename(resolve(redacted))}`;\n}\n\nfunction check(\n\tstatus: PackageDoctorCheck[\"status\"],\n\tid: PackageDoctorCheck[\"id\"],\n\tmessage: string,\n\tfiles: string[] = [],\n): PackageDoctorCheck {\n\treturn {\n\t\tid,\n\t\tstatus,\n\t\tmessage: redactSensitiveTextForced(message).slice(0, 4096),\n\t\t...(files.length > 0\n\t\t\t? {\n\t\t\t\t\tfiles: [...new Set(files.map((file) => redactSensitiveTextForced(file)))].sort((left, right) =>\n\t\t\t\t\t\tleft.localeCompare(right),\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n\nfunction runtimeImportCheck(unsupportedFiles: string[], aliasedFiles: string[]): PackageDoctorCheck {\n\tif (unsupportedFiles.length > 0) {\n\t\treturn check(\"error\", \"runtime-imports\", \"Unsupported Pi runtime imports require a compatibility shim\", [\n\t\t\t...unsupportedFiles,\n\t\t\t...aliasedFiles,\n\t\t]);\n\t}\n\tif (aliasedFiles.length > 0) {\n\t\treturn check(\n\t\t\t\"warning\",\n\t\t\t\"runtime-imports\",\n\t\t\t\"Legacy Pi runtime imports will use OMK compatibility aliases\",\n\t\t\taliasedFiles,\n\t\t);\n\t}\n\treturn check(\"pass\", \"runtime-imports\", \"No legacy Pi runtime imports detected\");\n}\n\nfunction headlessUiCheck(uiFiles: string[], unguardedFiles: string[]): PackageDoctorCheck {\n\tif (uiFiles.length === 0) return check(\"pass\", \"headless-ui\", \"No UI-only behavior detected\");\n\tif (unguardedFiles.length === 0) return check(\"pass\", \"headless-ui\", \"UI use is guarded for headless modes\");\n\treturn check(\"warning\", \"headless-ui\", \"UI use is not guarded by ctx.hasUI or ctx.mode\", unguardedFiles);\n}\n\n/** Static-only compatibility inspection. Extension modules are never imported or executed. */\nexport function inspectPackageCompatibility(input: PackageDoctorInput): PackageDoctorResult {\n\tconst root = resolve(input.packageRoot);\n\tlet packageJson: unknown = {};\n\tlet packageJsonDiagnostics: PackageManifestDiagnostic[] = [];\n\ttry {\n\t\tpackageJson = JSON.parse(readFileSync(resolve(root, \"package.json\"), \"utf8\")) as unknown;\n\t} catch {\n\t\tpackageJsonDiagnostics = [{ path: \"package.json\", message: \"package.json must contain valid JSON\" }];\n\t}\n\tconst manifest = resolvePackageManifest(packageJson);\n\tconst manifestDiagnostics = [...packageJsonDiagnostics, ...manifest.diagnostics];\n\tconst { sources, skipped } = scanPackageExtensionSources(root, input.resources.extensions);\n\tconst allText = sources.map((source) => source.text).join(\"\\n\");\n\tconst aliasedImportFiles = sourceFilesMatching(sources, (text) =>\n\t\timportedSpecifiers(text).some((specifier) => isSupportedLegacyPiRuntimeImport(specifier)),\n\t);\n\tconst unsupportedImportFiles = sourceFilesMatching(sources, (text) =>\n\t\timportedSpecifiers(text).some(\n\t\t\t(specifier) => isLegacyPiRuntimeImport(specifier) && !isSupportedLegacyPiRuntimeImport(specifier),\n\t\t),\n\t);\n\tconst storageFiles = sourceFilesMatching(sources, (text) =>\n\t\t/(?:~\\/\\.pi|[\"']\\.pi[\"']|PI_CODING_AGENT_DIR|PI_TODO_PATH)/u.test(text),\n\t);\n\tconst allEvents = sources.flatMap((source) => subscribedEvents(source.text));\n\tconst unsupportedEvents = [\n\t\t...new Set(allEvents.filter((event) => !PACKAGE_DOCTOR_SUPPORTED_EVENTS.has(event))),\n\t].sort((left, right) => left.localeCompare(right));\n\tconst lifecycleFiles = sourceFilesMatching(sources, (text) =>\n\t\tsubscribedEvents(text).some((event) => !PACKAGE_DOCTOR_SUPPORTED_EVENTS.has(event)),\n\t);\n\tconst uiFiles = sourceFilesMatching(sources, (text) => /\\bctx\\.ui\\b/u.test(text));\n\tconst unguardedUiFiles = sourceFilesMatching(\n\t\tsources,\n\t\t(text) => /\\bctx\\.ui\\b/u.test(text) && !/\\bctx\\.hasUI\\b|\\bctx\\.mode\\b/u.test(text),\n\t);\n\tconst resumeRelevant = storageFiles.length > 0 || /\\bappendEntry\\b|\\bgetEntries\\b|session_switch/u.test(allText);\n\tconst resumeAware =\n\t\t!resumeRelevant ||\n\t\t(allEvents.includes(\"session_start\") && /[\"']resume[\"']|\\.reason\\s*===?\\s*[\"']resume[\"']/u.test(allText));\n\tconst totalResources = Object.values(input.resources).reduce((sum, entries) => sum + entries.length, 0);\n\n\tconst checks: PackageDoctorCheck[] = [\n\t\tcheck(\n\t\t\tmanifestDiagnostics.length === 0 ? \"pass\" : \"error\",\n\t\t\t\"manifest\",\n\t\t\tmanifestDiagnostics.length > 0\n\t\t\t\t? \"The selected package manifest is malformed\"\n\t\t\t\t: manifest.key === null\n\t\t\t\t\t? \"Using convention directories\"\n\t\t\t\t\t: `Using package.json ${manifest.key} manifest`,\n\t\t\tmanifestDiagnostics.map((diagnostic) => diagnostic.path),\n\t\t),\n\t\tcheck(totalResources > 0 ? \"pass\" : \"error\", \"resources\", `${totalResources} package resource(s) resolved`),\n\t\truntimeImportCheck(unsupportedImportFiles, aliasedImportFiles),\n\t\tcheck(\n\t\t\tstorageFiles.length === 0 ? \"pass\" : \"warning\",\n\t\t\t\"storage-paths\",\n\t\t\tstorageFiles.length === 0\n\t\t\t\t? \"No hard-coded .pi storage paths detected\"\n\t\t\t\t: \"Hard-coded Pi storage paths may bypass OMK configuration\",\n\t\t\tstorageFiles,\n\t\t),\n\t\tcheck(\n\t\t\tunsupportedEvents.length === 0 ? \"pass\" : \"error\",\n\t\t\t\"lifecycle-events\",\n\t\t\tunsupportedEvents.length === 0\n\t\t\t\t? \"Lifecycle event names are supported\"\n\t\t\t\t: `Unsupported lifecycle event(s): ${unsupportedEvents.join(\", \")}`,\n\t\t\tlifecycleFiles,\n\t\t),\n\t\theadlessUiCheck(uiFiles, unguardedUiFiles),\n\t\tcheck(\n\t\t\tresumeAware ? \"pass\" : \"warning\",\n\t\t\t\"resume-awareness\",\n\t\t\tresumeAware\n\t\t\t\t? \"No resume-state incompatibility detected\"\n\t\t\t\t: \"Persistent state does not show a session_start resume path\",\n\t\t),\n\t\tcheck(\n\t\t\tskipped.length === 0 ? \"pass\" : \"warning\",\n\t\t\t\"scan-coverage\",\n\t\t\tskipped.length === 0\n\t\t\t\t? `${sources.length} extension file(s) inspected statically`\n\t\t\t\t: `Static scan skipped ${skipped.length} file(s)`,\n\t\t\tskipped,\n\t\t),\n\t];\n\n\treturn {\n\t\tschemaVersion: 1,\n\t\tsource: sanitizePackageSource(input.source),\n\t\tpackage: packageMetadata(packageJson),\n\t\tmanifest: {\n\t\t\tselected: manifest.key ?? \"convention\",\n\t\t\tshadowedPi: manifest.key === \"omk\" && manifest.present.pi,\n\t\t\tdiagnostics: manifestDiagnostics,\n\t\t},\n\t\tresources: {\n\t\t\textensions: input.resources.extensions.length,\n\t\t\tskills: input.resources.skills.length,\n\t\t\tprompts: input.resources.prompts.length,\n\t\t\tthemes: input.resources.themes.length,\n\t\t},\n\t\tinspectedFiles: sources\n\t\t\t.map((source) => redactSensitiveTextForced(source.file))\n\t\t\t.sort((left, right) => left.localeCompare(right)),\n\t\tchecks,\n\t\tcompatible: checks.every((item) => item.status !== \"error\"),\n\t};\n}\n"]}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { basename, resolve } from "node:path";
|
|
3
|
+
import { importedSpecifiers, PACKAGE_DOCTOR_SUPPORTED_EVENTS, scanPackageExtensionSources, sourceFilesMatching, subscribedEvents, } from "./package-doctor-source-scan.js";
|
|
4
|
+
import { resolvePackageManifest } from "./package-manifest.js";
|
|
5
|
+
import { isLegacyPiRuntimeImport, isSupportedLegacyPiRuntimeImport } from "./pi-compat.js";
|
|
6
|
+
import { redactSensitiveTextForced } from "./redaction.js";
|
|
7
|
+
function isRecord(value) {
|
|
8
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
9
|
+
}
|
|
10
|
+
function packageMetadata(value) {
|
|
11
|
+
if (!isRecord(value))
|
|
12
|
+
return {};
|
|
13
|
+
return {
|
|
14
|
+
...(typeof value.name === "string" ? { name: redactSensitiveTextForced(value.name).slice(0, 256) } : {}),
|
|
15
|
+
...(typeof value.version === "string" ? { version: redactSensitiveTextForced(value.version).slice(0, 128) } : {}),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function sanitizePackageSource(source) {
|
|
19
|
+
const redacted = redactSensitiveTextForced(source);
|
|
20
|
+
if (redacted.startsWith("npm:"))
|
|
21
|
+
return redacted;
|
|
22
|
+
const hasGitPrefix = redacted.startsWith("git:");
|
|
23
|
+
const candidate = hasGitPrefix ? redacted.slice("git:".length) : redacted;
|
|
24
|
+
if (/^(?:https?|ssh|git):\/\//iu.test(candidate)) {
|
|
25
|
+
try {
|
|
26
|
+
const url = new URL(candidate);
|
|
27
|
+
url.username = "";
|
|
28
|
+
url.password = "";
|
|
29
|
+
url.search = "";
|
|
30
|
+
url.hash = "";
|
|
31
|
+
return `${hasGitPrefix ? "git:" : ""}${url.toString()}`;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return "<remote-package>";
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (hasGitPrefix)
|
|
38
|
+
return "<git-package>";
|
|
39
|
+
return `local:${basename(resolve(redacted))}`;
|
|
40
|
+
}
|
|
41
|
+
function check(status, id, message, files = []) {
|
|
42
|
+
return {
|
|
43
|
+
id,
|
|
44
|
+
status,
|
|
45
|
+
message: redactSensitiveTextForced(message).slice(0, 4096),
|
|
46
|
+
...(files.length > 0
|
|
47
|
+
? {
|
|
48
|
+
files: [...new Set(files.map((file) => redactSensitiveTextForced(file)))].sort((left, right) => left.localeCompare(right)),
|
|
49
|
+
}
|
|
50
|
+
: {}),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function runtimeImportCheck(unsupportedFiles, aliasedFiles) {
|
|
54
|
+
if (unsupportedFiles.length > 0) {
|
|
55
|
+
return check("error", "runtime-imports", "Unsupported Pi runtime imports require a compatibility shim", [
|
|
56
|
+
...unsupportedFiles,
|
|
57
|
+
...aliasedFiles,
|
|
58
|
+
]);
|
|
59
|
+
}
|
|
60
|
+
if (aliasedFiles.length > 0) {
|
|
61
|
+
return check("warning", "runtime-imports", "Legacy Pi runtime imports will use OMK compatibility aliases", aliasedFiles);
|
|
62
|
+
}
|
|
63
|
+
return check("pass", "runtime-imports", "No legacy Pi runtime imports detected");
|
|
64
|
+
}
|
|
65
|
+
function headlessUiCheck(uiFiles, unguardedFiles) {
|
|
66
|
+
if (uiFiles.length === 0)
|
|
67
|
+
return check("pass", "headless-ui", "No UI-only behavior detected");
|
|
68
|
+
if (unguardedFiles.length === 0)
|
|
69
|
+
return check("pass", "headless-ui", "UI use is guarded for headless modes");
|
|
70
|
+
return check("warning", "headless-ui", "UI use is not guarded by ctx.hasUI or ctx.mode", unguardedFiles);
|
|
71
|
+
}
|
|
72
|
+
/** Static-only compatibility inspection. Extension modules are never imported or executed. */
|
|
73
|
+
export function inspectPackageCompatibility(input) {
|
|
74
|
+
const root = resolve(input.packageRoot);
|
|
75
|
+
let packageJson = {};
|
|
76
|
+
let packageJsonDiagnostics = [];
|
|
77
|
+
try {
|
|
78
|
+
packageJson = JSON.parse(readFileSync(resolve(root, "package.json"), "utf8"));
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
packageJsonDiagnostics = [{ path: "package.json", message: "package.json must contain valid JSON" }];
|
|
82
|
+
}
|
|
83
|
+
const manifest = resolvePackageManifest(packageJson);
|
|
84
|
+
const manifestDiagnostics = [...packageJsonDiagnostics, ...manifest.diagnostics];
|
|
85
|
+
const { sources, skipped } = scanPackageExtensionSources(root, input.resources.extensions);
|
|
86
|
+
const allText = sources.map((source) => source.text).join("\n");
|
|
87
|
+
const aliasedImportFiles = sourceFilesMatching(sources, (text) => importedSpecifiers(text).some((specifier) => isSupportedLegacyPiRuntimeImport(specifier)));
|
|
88
|
+
const unsupportedImportFiles = sourceFilesMatching(sources, (text) => importedSpecifiers(text).some((specifier) => isLegacyPiRuntimeImport(specifier) && !isSupportedLegacyPiRuntimeImport(specifier)));
|
|
89
|
+
const storageFiles = sourceFilesMatching(sources, (text) => /(?:~\/\.pi|["']\.pi["']|PI_CODING_AGENT_DIR|PI_TODO_PATH)/u.test(text));
|
|
90
|
+
const allEvents = sources.flatMap((source) => subscribedEvents(source.text));
|
|
91
|
+
const unsupportedEvents = [
|
|
92
|
+
...new Set(allEvents.filter((event) => !PACKAGE_DOCTOR_SUPPORTED_EVENTS.has(event))),
|
|
93
|
+
].sort((left, right) => left.localeCompare(right));
|
|
94
|
+
const lifecycleFiles = sourceFilesMatching(sources, (text) => subscribedEvents(text).some((event) => !PACKAGE_DOCTOR_SUPPORTED_EVENTS.has(event)));
|
|
95
|
+
const uiFiles = sourceFilesMatching(sources, (text) => /\bctx\.ui\b/u.test(text));
|
|
96
|
+
const unguardedUiFiles = sourceFilesMatching(sources, (text) => /\bctx\.ui\b/u.test(text) && !/\bctx\.hasUI\b|\bctx\.mode\b/u.test(text));
|
|
97
|
+
const resumeRelevant = storageFiles.length > 0 || /\bappendEntry\b|\bgetEntries\b|session_switch/u.test(allText);
|
|
98
|
+
const resumeAware = !resumeRelevant ||
|
|
99
|
+
(allEvents.includes("session_start") && /["']resume["']|\.reason\s*===?\s*["']resume["']/u.test(allText));
|
|
100
|
+
const totalResources = Object.values(input.resources).reduce((sum, entries) => sum + entries.length, 0);
|
|
101
|
+
const checks = [
|
|
102
|
+
check(manifestDiagnostics.length === 0 ? "pass" : "error", "manifest", manifestDiagnostics.length > 0
|
|
103
|
+
? "The selected package manifest is malformed"
|
|
104
|
+
: manifest.key === null
|
|
105
|
+
? "Using convention directories"
|
|
106
|
+
: `Using package.json ${manifest.key} manifest`, manifestDiagnostics.map((diagnostic) => diagnostic.path)),
|
|
107
|
+
check(totalResources > 0 ? "pass" : "error", "resources", `${totalResources} package resource(s) resolved`),
|
|
108
|
+
runtimeImportCheck(unsupportedImportFiles, aliasedImportFiles),
|
|
109
|
+
check(storageFiles.length === 0 ? "pass" : "warning", "storage-paths", storageFiles.length === 0
|
|
110
|
+
? "No hard-coded .pi storage paths detected"
|
|
111
|
+
: "Hard-coded Pi storage paths may bypass OMK configuration", storageFiles),
|
|
112
|
+
check(unsupportedEvents.length === 0 ? "pass" : "error", "lifecycle-events", unsupportedEvents.length === 0
|
|
113
|
+
? "Lifecycle event names are supported"
|
|
114
|
+
: `Unsupported lifecycle event(s): ${unsupportedEvents.join(", ")}`, lifecycleFiles),
|
|
115
|
+
headlessUiCheck(uiFiles, unguardedUiFiles),
|
|
116
|
+
check(resumeAware ? "pass" : "warning", "resume-awareness", resumeAware
|
|
117
|
+
? "No resume-state incompatibility detected"
|
|
118
|
+
: "Persistent state does not show a session_start resume path"),
|
|
119
|
+
check(skipped.length === 0 ? "pass" : "warning", "scan-coverage", skipped.length === 0
|
|
120
|
+
? `${sources.length} extension file(s) inspected statically`
|
|
121
|
+
: `Static scan skipped ${skipped.length} file(s)`, skipped),
|
|
122
|
+
];
|
|
123
|
+
return {
|
|
124
|
+
schemaVersion: 1,
|
|
125
|
+
source: sanitizePackageSource(input.source),
|
|
126
|
+
package: packageMetadata(packageJson),
|
|
127
|
+
manifest: {
|
|
128
|
+
selected: manifest.key ?? "convention",
|
|
129
|
+
shadowedPi: manifest.key === "omk" && manifest.present.pi,
|
|
130
|
+
diagnostics: manifestDiagnostics,
|
|
131
|
+
},
|
|
132
|
+
resources: {
|
|
133
|
+
extensions: input.resources.extensions.length,
|
|
134
|
+
skills: input.resources.skills.length,
|
|
135
|
+
prompts: input.resources.prompts.length,
|
|
136
|
+
themes: input.resources.themes.length,
|
|
137
|
+
},
|
|
138
|
+
inspectedFiles: sources
|
|
139
|
+
.map((source) => redactSensitiveTextForced(source.file))
|
|
140
|
+
.sort((left, right) => left.localeCompare(right)),
|
|
141
|
+
checks,
|
|
142
|
+
compatible: checks.every((item) => item.status !== "error"),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=package-doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-doctor.js","sourceRoot":"","sources":["../../src/core/package-doctor.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { basename, resolve } from \"node:path\";\nimport {\n\timportedSpecifiers,\n\tPACKAGE_DOCTOR_SUPPORTED_EVENTS,\n\tscanPackageExtensionSources,\n\tsourceFilesMatching,\n\tsubscribedEvents,\n} from \"./package-doctor-source-scan.ts\";\nimport { type PackageManifestDiagnostic, type PackageManifestKey, resolvePackageManifest } from \"./package-manifest.ts\";\nimport { isLegacyPiRuntimeImport, isSupportedLegacyPiRuntimeImport } from \"./pi-compat.ts\";\nimport { redactSensitiveTextForced } from \"./redaction.ts\";\n\nexport interface PackageDoctorResources {\n\textensions: string[];\n\tskills: string[];\n\tprompts: string[];\n\tthemes: string[];\n}\n\nexport interface PackageDoctorInput {\n\tsource: string;\n\tpackageRoot: string;\n\tresources: PackageDoctorResources;\n}\n\nexport interface PackageDoctorCheck {\n\tid:\n\t\t| \"manifest\"\n\t\t| \"resources\"\n\t\t| \"runtime-imports\"\n\t\t| \"storage-paths\"\n\t\t| \"lifecycle-events\"\n\t\t| \"headless-ui\"\n\t\t| \"resume-awareness\"\n\t\t| \"scan-coverage\";\n\tstatus: \"pass\" | \"warning\" | \"error\";\n\tmessage: string;\n\tfiles?: string[];\n}\n\nexport interface PackageDoctorResult {\n\tschemaVersion: 1;\n\tsource: string;\n\tpackage: { name?: string; version?: string };\n\tmanifest: {\n\t\tselected: PackageManifestKey | \"convention\";\n\t\tshadowedPi: boolean;\n\t\tdiagnostics: Array<{ path: string; message: string }>;\n\t};\n\tresources: Record<keyof PackageDoctorResources, number>;\n\tinspectedFiles: string[];\n\tchecks: PackageDoctorCheck[];\n\tcompatible: boolean;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction packageMetadata(value: unknown): { name?: string; version?: string } {\n\tif (!isRecord(value)) return {};\n\treturn {\n\t\t...(typeof value.name === \"string\" ? { name: redactSensitiveTextForced(value.name).slice(0, 256) } : {}),\n\t\t...(typeof value.version === \"string\" ? { version: redactSensitiveTextForced(value.version).slice(0, 128) } : {}),\n\t};\n}\n\nfunction sanitizePackageSource(source: string): string {\n\tconst redacted = redactSensitiveTextForced(source);\n\tif (redacted.startsWith(\"npm:\")) return redacted;\n\tconst hasGitPrefix = redacted.startsWith(\"git:\");\n\tconst candidate = hasGitPrefix ? redacted.slice(\"git:\".length) : redacted;\n\tif (/^(?:https?|ssh|git):\\/\\//iu.test(candidate)) {\n\t\ttry {\n\t\t\tconst url = new URL(candidate);\n\t\t\turl.username = \"\";\n\t\t\turl.password = \"\";\n\t\t\turl.search = \"\";\n\t\t\turl.hash = \"\";\n\t\t\treturn `${hasGitPrefix ? \"git:\" : \"\"}${url.toString()}`;\n\t\t} catch {\n\t\t\treturn \"<remote-package>\";\n\t\t}\n\t}\n\tif (hasGitPrefix) return \"<git-package>\";\n\treturn `local:${basename(resolve(redacted))}`;\n}\n\nfunction check(\n\tstatus: PackageDoctorCheck[\"status\"],\n\tid: PackageDoctorCheck[\"id\"],\n\tmessage: string,\n\tfiles: string[] = [],\n): PackageDoctorCheck {\n\treturn {\n\t\tid,\n\t\tstatus,\n\t\tmessage: redactSensitiveTextForced(message).slice(0, 4096),\n\t\t...(files.length > 0\n\t\t\t? {\n\t\t\t\t\tfiles: [...new Set(files.map((file) => redactSensitiveTextForced(file)))].sort((left, right) =>\n\t\t\t\t\t\tleft.localeCompare(right),\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n\nfunction runtimeImportCheck(unsupportedFiles: string[], aliasedFiles: string[]): PackageDoctorCheck {\n\tif (unsupportedFiles.length > 0) {\n\t\treturn check(\"error\", \"runtime-imports\", \"Unsupported Pi runtime imports require a compatibility shim\", [\n\t\t\t...unsupportedFiles,\n\t\t\t...aliasedFiles,\n\t\t]);\n\t}\n\tif (aliasedFiles.length > 0) {\n\t\treturn check(\n\t\t\t\"warning\",\n\t\t\t\"runtime-imports\",\n\t\t\t\"Legacy Pi runtime imports will use OMK compatibility aliases\",\n\t\t\taliasedFiles,\n\t\t);\n\t}\n\treturn check(\"pass\", \"runtime-imports\", \"No legacy Pi runtime imports detected\");\n}\n\nfunction headlessUiCheck(uiFiles: string[], unguardedFiles: string[]): PackageDoctorCheck {\n\tif (uiFiles.length === 0) return check(\"pass\", \"headless-ui\", \"No UI-only behavior detected\");\n\tif (unguardedFiles.length === 0) return check(\"pass\", \"headless-ui\", \"UI use is guarded for headless modes\");\n\treturn check(\"warning\", \"headless-ui\", \"UI use is not guarded by ctx.hasUI or ctx.mode\", unguardedFiles);\n}\n\n/** Static-only compatibility inspection. Extension modules are never imported or executed. */\nexport function inspectPackageCompatibility(input: PackageDoctorInput): PackageDoctorResult {\n\tconst root = resolve(input.packageRoot);\n\tlet packageJson: unknown = {};\n\tlet packageJsonDiagnostics: PackageManifestDiagnostic[] = [];\n\ttry {\n\t\tpackageJson = JSON.parse(readFileSync(resolve(root, \"package.json\"), \"utf8\")) as unknown;\n\t} catch {\n\t\tpackageJsonDiagnostics = [{ path: \"package.json\", message: \"package.json must contain valid JSON\" }];\n\t}\n\tconst manifest = resolvePackageManifest(packageJson);\n\tconst manifestDiagnostics = [...packageJsonDiagnostics, ...manifest.diagnostics];\n\tconst { sources, skipped } = scanPackageExtensionSources(root, input.resources.extensions);\n\tconst allText = sources.map((source) => source.text).join(\"\\n\");\n\tconst aliasedImportFiles = sourceFilesMatching(sources, (text) =>\n\t\timportedSpecifiers(text).some((specifier) => isSupportedLegacyPiRuntimeImport(specifier)),\n\t);\n\tconst unsupportedImportFiles = sourceFilesMatching(sources, (text) =>\n\t\timportedSpecifiers(text).some(\n\t\t\t(specifier) => isLegacyPiRuntimeImport(specifier) && !isSupportedLegacyPiRuntimeImport(specifier),\n\t\t),\n\t);\n\tconst storageFiles = sourceFilesMatching(sources, (text) =>\n\t\t/(?:~\\/\\.pi|[\"']\\.pi[\"']|PI_CODING_AGENT_DIR|PI_TODO_PATH)/u.test(text),\n\t);\n\tconst allEvents = sources.flatMap((source) => subscribedEvents(source.text));\n\tconst unsupportedEvents = [\n\t\t...new Set(allEvents.filter((event) => !PACKAGE_DOCTOR_SUPPORTED_EVENTS.has(event))),\n\t].sort((left, right) => left.localeCompare(right));\n\tconst lifecycleFiles = sourceFilesMatching(sources, (text) =>\n\t\tsubscribedEvents(text).some((event) => !PACKAGE_DOCTOR_SUPPORTED_EVENTS.has(event)),\n\t);\n\tconst uiFiles = sourceFilesMatching(sources, (text) => /\\bctx\\.ui\\b/u.test(text));\n\tconst unguardedUiFiles = sourceFilesMatching(\n\t\tsources,\n\t\t(text) => /\\bctx\\.ui\\b/u.test(text) && !/\\bctx\\.hasUI\\b|\\bctx\\.mode\\b/u.test(text),\n\t);\n\tconst resumeRelevant = storageFiles.length > 0 || /\\bappendEntry\\b|\\bgetEntries\\b|session_switch/u.test(allText);\n\tconst resumeAware =\n\t\t!resumeRelevant ||\n\t\t(allEvents.includes(\"session_start\") && /[\"']resume[\"']|\\.reason\\s*===?\\s*[\"']resume[\"']/u.test(allText));\n\tconst totalResources = Object.values(input.resources).reduce((sum, entries) => sum + entries.length, 0);\n\n\tconst checks: PackageDoctorCheck[] = [\n\t\tcheck(\n\t\t\tmanifestDiagnostics.length === 0 ? \"pass\" : \"error\",\n\t\t\t\"manifest\",\n\t\t\tmanifestDiagnostics.length > 0\n\t\t\t\t? \"The selected package manifest is malformed\"\n\t\t\t\t: manifest.key === null\n\t\t\t\t\t? \"Using convention directories\"\n\t\t\t\t\t: `Using package.json ${manifest.key} manifest`,\n\t\t\tmanifestDiagnostics.map((diagnostic) => diagnostic.path),\n\t\t),\n\t\tcheck(totalResources > 0 ? \"pass\" : \"error\", \"resources\", `${totalResources} package resource(s) resolved`),\n\t\truntimeImportCheck(unsupportedImportFiles, aliasedImportFiles),\n\t\tcheck(\n\t\t\tstorageFiles.length === 0 ? \"pass\" : \"warning\",\n\t\t\t\"storage-paths\",\n\t\t\tstorageFiles.length === 0\n\t\t\t\t? \"No hard-coded .pi storage paths detected\"\n\t\t\t\t: \"Hard-coded Pi storage paths may bypass OMK configuration\",\n\t\t\tstorageFiles,\n\t\t),\n\t\tcheck(\n\t\t\tunsupportedEvents.length === 0 ? \"pass\" : \"error\",\n\t\t\t\"lifecycle-events\",\n\t\t\tunsupportedEvents.length === 0\n\t\t\t\t? \"Lifecycle event names are supported\"\n\t\t\t\t: `Unsupported lifecycle event(s): ${unsupportedEvents.join(\", \")}`,\n\t\t\tlifecycleFiles,\n\t\t),\n\t\theadlessUiCheck(uiFiles, unguardedUiFiles),\n\t\tcheck(\n\t\t\tresumeAware ? \"pass\" : \"warning\",\n\t\t\t\"resume-awareness\",\n\t\t\tresumeAware\n\t\t\t\t? \"No resume-state incompatibility detected\"\n\t\t\t\t: \"Persistent state does not show a session_start resume path\",\n\t\t),\n\t\tcheck(\n\t\t\tskipped.length === 0 ? \"pass\" : \"warning\",\n\t\t\t\"scan-coverage\",\n\t\t\tskipped.length === 0\n\t\t\t\t? `${sources.length} extension file(s) inspected statically`\n\t\t\t\t: `Static scan skipped ${skipped.length} file(s)`,\n\t\t\tskipped,\n\t\t),\n\t];\n\n\treturn {\n\t\tschemaVersion: 1,\n\t\tsource: sanitizePackageSource(input.source),\n\t\tpackage: packageMetadata(packageJson),\n\t\tmanifest: {\n\t\t\tselected: manifest.key ?? \"convention\",\n\t\t\tshadowedPi: manifest.key === \"omk\" && manifest.present.pi,\n\t\t\tdiagnostics: manifestDiagnostics,\n\t\t},\n\t\tresources: {\n\t\t\textensions: input.resources.extensions.length,\n\t\t\tskills: input.resources.skills.length,\n\t\t\tprompts: input.resources.prompts.length,\n\t\t\tthemes: input.resources.themes.length,\n\t\t},\n\t\tinspectedFiles: sources\n\t\t\t.map((source) => redactSensitiveTextForced(source.file))\n\t\t\t.sort((left, right) => left.localeCompare(right)),\n\t\tchecks,\n\t\tcompatible: checks.every((item) => item.status !== \"error\"),\n\t};\n}\n"]}
|
|
@@ -16,6 +16,11 @@ export interface ResolvedPaths {
|
|
|
16
16
|
prompts: ResolvedResource[];
|
|
17
17
|
themes: ResolvedResource[];
|
|
18
18
|
}
|
|
19
|
+
export interface PackageInspection {
|
|
20
|
+
packageRoot: string;
|
|
21
|
+
resources: ResolvedPaths;
|
|
22
|
+
cleanup?: () => void;
|
|
23
|
+
}
|
|
19
24
|
export type MissingSourceAction = "install" | "skip" | "error";
|
|
20
25
|
/** Thrown when an `onMissing` callback explicitly requests aborting resolution. */
|
|
21
26
|
export declare class MissingSourceError extends Error {
|
|
@@ -60,6 +65,7 @@ export interface PackageManager {
|
|
|
60
65
|
local?: boolean;
|
|
61
66
|
temporary?: boolean;
|
|
62
67
|
}): Promise<ResolvedPaths>;
|
|
68
|
+
preparePackageInspection(source: string): Promise<PackageInspection>;
|
|
63
69
|
addSourceToSettings(source: string, options?: {
|
|
64
70
|
local?: boolean;
|
|
65
71
|
}): boolean;
|
|
@@ -99,6 +105,7 @@ export declare class DefaultPackageManager implements PackageManager {
|
|
|
99
105
|
local?: boolean;
|
|
100
106
|
temporary?: boolean;
|
|
101
107
|
}): Promise<ResolvedPaths>;
|
|
108
|
+
preparePackageInspection(source: string): Promise<PackageInspection>;
|
|
102
109
|
listConfiguredPackages(): ConfiguredPackage[];
|
|
103
110
|
install(source: string, options?: {
|
|
104
111
|
local?: boolean;
|
|
@@ -159,6 +166,8 @@ export declare class DefaultPackageManager implements PackageManager {
|
|
|
159
166
|
private getGitDependencyInstallArgs;
|
|
160
167
|
private runNpmCommandSync;
|
|
161
168
|
private getNpmInstallArgs;
|
|
169
|
+
private cloneGitForInspection;
|
|
170
|
+
private downloadNpmForInspection;
|
|
162
171
|
private installNpm;
|
|
163
172
|
private uninstallNpm;
|
|
164
173
|
private installGit;
|
|
@@ -191,7 +200,7 @@ export declare class DefaultPackageManager implements PackageManager {
|
|
|
191
200
|
* that pass the manifest's own patterns.
|
|
192
201
|
*/
|
|
193
202
|
private collectManifestFiles;
|
|
194
|
-
private
|
|
203
|
+
private readPackageManifest;
|
|
195
204
|
private addManifestEntries;
|
|
196
205
|
private collectFilesFromManifestEntries;
|
|
197
206
|
private resolveLocalEntries;
|