@retaw106/mmc-oc 0.0.0-stage → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/historian.d.ts +4 -0
- package/dist/agents/historian.d.ts.map +1 -0
- package/dist/agents/language-directive.d.ts +26 -0
- package/dist/agents/language-directive.d.ts.map +1 -0
- package/dist/agents/magic-context-prompt.d.ts +5 -0
- package/dist/agents/magic-context-prompt.d.ts.map +1 -0
- package/dist/agents/memory-maintainer.d.ts +96 -0
- package/dist/agents/memory-maintainer.d.ts.map +1 -0
- package/dist/config/agent-disable.d.ts +29 -0
- package/dist/config/agent-disable.d.ts.map +1 -0
- package/dist/config/config-paths.d.ts +7 -0
- package/dist/config/config-paths.d.ts.map +1 -0
- package/dist/config/index.d.ts +69 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/live-run-config.d.ts +11 -0
- package/dist/config/live-run-config.d.ts.map +1 -0
- package/dist/config/live-snapshot.d.ts +32 -0
- package/dist/config/live-snapshot.d.ts.map +1 -0
- package/dist/config/migrate-experimental.d.ts +26 -0
- package/dist/config/migrate-experimental.d.ts.map +1 -0
- package/dist/config/profiles.d.ts +22 -0
- package/dist/config/profiles.d.ts.map +1 -0
- package/dist/config/project-security.d.ts +124 -0
- package/dist/config/project-security.d.ts.map +1 -0
- package/dist/config/prune-config-leaf.d.ts +26 -0
- package/dist/config/prune-config-leaf.d.ts.map +1 -0
- package/dist/config/raw-loader.d.ts +42 -0
- package/dist/config/raw-loader.d.ts.map +1 -0
- package/dist/config/removed-agent-config.d.ts +8 -0
- package/dist/config/removed-agent-config.d.ts.map +1 -0
- package/dist/config/schema/agent-overrides.d.ts +52 -0
- package/dist/config/schema/agent-overrides.d.ts.map +1 -0
- package/dist/config/schema/magic-context.d.ts +805 -0
- package/dist/config/schema/magic-context.d.ts.map +1 -0
- package/dist/config/variable.d.ts +48 -0
- package/dist/config/variable.d.ts.map +1 -0
- package/dist/context-a6px04s0.js +23932 -0
- package/dist/derive-budgets-fhk00zv8.js +18 -0
- package/dist/features/magic-context/compaction-marker.d.ts +211 -0
- package/dist/features/magic-context/compaction-marker.d.ts.map +1 -0
- package/dist/features/magic-context/compaction.d.ts +7 -0
- package/dist/features/magic-context/compaction.d.ts.map +1 -0
- package/dist/features/magic-context/compartment-events.d.ts +50 -0
- package/dist/features/magic-context/compartment-events.d.ts.map +1 -0
- package/dist/features/magic-context/compartment-lease.d.ts +28 -0
- package/dist/features/magic-context/compartment-lease.d.ts.map +1 -0
- package/dist/features/magic-context/compartment-storage.d.ts +178 -0
- package/dist/features/magic-context/compartment-storage.d.ts.map +1 -0
- package/dist/features/magic-context/compression-depth-storage.d.ts +14 -0
- package/dist/features/magic-context/compression-depth-storage.d.ts.map +1 -0
- package/dist/features/magic-context/context-authority.d.ts +15 -0
- package/dist/features/magic-context/context-authority.d.ts.map +1 -0
- package/dist/features/magic-context/fail-closed-block.d.ts +117 -0
- package/dist/features/magic-context/fail-closed-block.d.ts.map +1 -0
- package/dist/features/magic-context/index.d.ts +10 -0
- package/dist/features/magic-context/index.d.ts.map +1 -0
- package/dist/features/magic-context/literal-probes.d.ts +24 -0
- package/dist/features/magic-context/literal-probes.d.ts.map +1 -0
- package/dist/features/magic-context/lkg-prefix-chunks.d.ts +53 -0
- package/dist/features/magic-context/lkg-prefix-chunks.d.ts.map +1 -0
- package/dist/features/magic-context/memory/constants.d.ts +16 -0
- package/dist/features/magic-context/memory/constants.d.ts.map +1 -0
- package/dist/features/magic-context/memory/index.d.ts +11 -0
- package/dist/features/magic-context/memory/index.d.ts.map +1 -0
- package/dist/features/magic-context/memory/memory-diagnostics.d.ts +6 -0
- package/dist/features/magic-context/memory/memory-diagnostics.d.ts.map +1 -0
- package/dist/features/magic-context/memory/memory-selection.d.ts +12 -0
- package/dist/features/magic-context/memory/memory-selection.d.ts.map +1 -0
- package/dist/features/magic-context/memory/memory-visibility.d.ts +46 -0
- package/dist/features/magic-context/memory/memory-visibility.d.ts.map +1 -0
- package/dist/features/magic-context/memory/normalize-hash.d.ts +3 -0
- package/dist/features/magic-context/memory/normalize-hash.d.ts.map +1 -0
- package/dist/features/magic-context/memory/project-identity-cache.d.ts +7 -0
- package/dist/features/magic-context/memory/project-identity-cache.d.ts.map +1 -0
- package/dist/features/magic-context/memory/project-identity.d.ts +97 -0
- package/dist/features/magic-context/memory/project-identity.d.ts.map +1 -0
- package/dist/features/magic-context/memory/promotion.d.ts +26 -0
- package/dist/features/magic-context/memory/promotion.d.ts.map +1 -0
- package/dist/features/magic-context/memory/relocate-memory.d.ts +58 -0
- package/dist/features/magic-context/memory/relocate-memory.d.ts.map +1 -0
- package/dist/features/magic-context/memory/storage-memory-fts.d.ts +11 -0
- package/dist/features/magic-context/memory/storage-memory-fts.d.ts.map +1 -0
- package/dist/features/magic-context/memory/storage-memory-verifications.d.ts +35 -0
- package/dist/features/magic-context/memory/storage-memory-verifications.d.ts.map +1 -0
- package/dist/features/magic-context/memory/storage-memory.d.ts +89 -0
- package/dist/features/magic-context/memory/storage-memory.d.ts.map +1 -0
- package/dist/features/magic-context/memory/types.d.ts +59 -0
- package/dist/features/magic-context/memory/types.d.ts.map +1 -0
- package/dist/features/magic-context/memory/verification-paths.d.ts +48 -0
- package/dist/features/magic-context/memory/verification-paths.d.ts.map +1 -0
- package/dist/features/magic-context/memory/visibility.d.ts +6 -0
- package/dist/features/magic-context/memory/visibility.d.ts.map +1 -0
- package/dist/features/magic-context/memory-maintainer/apply.d.ts +65 -0
- package/dist/features/magic-context/memory-maintainer/apply.d.ts.map +1 -0
- package/dist/features/magic-context/memory-maintainer/budget.d.ts +75 -0
- package/dist/features/magic-context/memory-maintainer/budget.d.ts.map +1 -0
- package/dist/features/magic-context/memory-maintainer/coverage.d.ts +91 -0
- package/dist/features/magic-context/memory-maintainer/coverage.d.ts.map +1 -0
- package/dist/features/magic-context/memory-maintainer/dream-state.d.ts +18 -0
- package/dist/features/magic-context/memory-maintainer/dream-state.d.ts.map +1 -0
- package/dist/features/magic-context/memory-maintainer/launcher.d.ts +119 -0
- package/dist/features/magic-context/memory-maintainer/launcher.d.ts.map +1 -0
- package/dist/features/magic-context/memory-maintainer/lease.d.ts +56 -0
- package/dist/features/magic-context/memory-maintainer/lease.d.ts.map +1 -0
- package/dist/features/magic-context/memory-maintainer/manifest.d.ts +127 -0
- package/dist/features/magic-context/memory-maintainer/manifest.d.ts.map +1 -0
- package/dist/features/magic-context/memory-maintainer/manual-commands.d.ts +46 -0
- package/dist/features/magic-context/memory-maintainer/manual-commands.d.ts.map +1 -0
- package/dist/features/magic-context/memory-maintainer/oc2-adapter.d.ts +79 -0
- package/dist/features/magic-context/memory-maintainer/oc2-adapter.d.ts.map +1 -0
- package/dist/features/magic-context/memory-maintainer/pause-report.d.ts +37 -0
- package/dist/features/magic-context/memory-maintainer/pause-report.d.ts.map +1 -0
- package/dist/features/magic-context/memory-maintainer/pipeline.d.ts +199 -0
- package/dist/features/magic-context/memory-maintainer/pipeline.d.ts.map +1 -0
- package/dist/features/magic-context/memory-maintainer/provider-output-failure.d.ts +15 -0
- package/dist/features/magic-context/memory-maintainer/provider-output-failure.d.ts.map +1 -0
- package/dist/features/magic-context/memory-maintainer/schedule-storage.d.ts +76 -0
- package/dist/features/magic-context/memory-maintainer/schedule-storage.d.ts.map +1 -0
- package/dist/features/magic-context/memory-maintainer/schedule.d.ts +90 -0
- package/dist/features/magic-context/memory-maintainer/schedule.d.ts.map +1 -0
- package/dist/features/magic-context/merged-reasoning-decisions.d.ts +6 -0
- package/dist/features/magic-context/merged-reasoning-decisions.d.ts.map +1 -0
- package/dist/features/magic-context/message-fts-rowid-map.d.ts +50 -0
- package/dist/features/magic-context/message-fts-rowid-map.d.ts.map +1 -0
- package/dist/features/magic-context/message-fts-session-filter.d.ts +14 -0
- package/dist/features/magic-context/message-fts-session-filter.d.ts.map +1 -0
- package/dist/features/magic-context/message-index-async.d.ts +33 -0
- package/dist/features/magic-context/message-index-async.d.ts.map +1 -0
- package/dist/features/magic-context/message-index-sweep.d.ts +11 -0
- package/dist/features/magic-context/message-index-sweep.d.ts.map +1 -0
- package/dist/features/magic-context/message-index.d.ts +88 -0
- package/dist/features/magic-context/message-index.d.ts.map +1 -0
- package/dist/features/magic-context/message-time-backfill.d.ts +19 -0
- package/dist/features/magic-context/message-time-backfill.d.ts.map +1 -0
- package/dist/features/magic-context/migration-v2-write-split.d.ts +62 -0
- package/dist/features/magic-context/migration-v2-write-split.d.ts.map +1 -0
- package/dist/features/magic-context/migrations.d.ts +73 -0
- package/dist/features/magic-context/migrations.d.ts.map +1 -0
- package/dist/features/magic-context/mock-database.d.ts +3 -0
- package/dist/features/magic-context/mock-database.d.ts.map +1 -0
- package/dist/features/magic-context/mural/storage-mural-cues.d.ts +65 -0
- package/dist/features/magic-context/mural/storage-mural-cues.d.ts.map +1 -0
- package/dist/features/magic-context/no-content-compartment.d.ts +12 -0
- package/dist/features/magic-context/no-content-compartment.d.ts.map +1 -0
- package/dist/features/magic-context/opencode2-relabel.d.ts +132 -0
- package/dist/features/magic-context/opencode2-relabel.d.ts.map +1 -0
- package/dist/features/magic-context/overflow-detection.d.ts +108 -0
- package/dist/features/magic-context/overflow-detection.d.ts.map +1 -0
- package/dist/features/magic-context/pi-content-decisions.d.ts +9 -0
- package/dist/features/magic-context/pi-content-decisions.d.ts.map +1 -0
- package/dist/features/magic-context/project-identity.d.ts +2 -0
- package/dist/features/magic-context/project-identity.d.ts.map +1 -0
- package/dist/features/magic-context/protection-window.d.ts +79 -0
- package/dist/features/magic-context/protection-window.d.ts.map +1 -0
- package/dist/features/magic-context/range-parser.d.ts +18 -0
- package/dist/features/magic-context/range-parser.d.ts.map +1 -0
- package/dist/features/magic-context/reclaim-protection.d.ts +13 -0
- package/dist/features/magic-context/reclaim-protection.d.ts.map +1 -0
- package/dist/features/magic-context/resolve-subagent-fallback.d.ts +42 -0
- package/dist/features/magic-context/resolve-subagent-fallback.d.ts.map +1 -0
- package/dist/features/magic-context/scheduler.d.ts +20 -0
- package/dist/features/magic-context/scheduler.d.ts.map +1 -0
- package/dist/features/magic-context/schema-fence-probe.d.ts +29 -0
- package/dist/features/magic-context/schema-fence-probe.d.ts.map +1 -0
- package/dist/features/magic-context/search.d.ts +118 -0
- package/dist/features/magic-context/search.d.ts.map +1 -0
- package/dist/features/magic-context/session-cache-ttl.d.ts +10 -0
- package/dist/features/magic-context/session-cache-ttl.d.ts.map +1 -0
- package/dist/features/magic-context/session-decision-calibration.d.ts +31 -0
- package/dist/features/magic-context/session-decision-calibration.d.ts.map +1 -0
- package/dist/features/magic-context/session-project-backfill.d.ts +37 -0
- package/dist/features/magic-context/session-project-backfill.d.ts.map +1 -0
- package/dist/features/magic-context/session-project-storage.d.ts +23 -0
- package/dist/features/magic-context/session-project-storage.d.ts.map +1 -0
- package/dist/features/magic-context/storage-caveman-rules.d.ts +21 -0
- package/dist/features/magic-context/storage-caveman-rules.d.ts.map +1 -0
- package/dist/features/magic-context/storage-clone.d.ts +44 -0
- package/dist/features/magic-context/storage-clone.d.ts.map +1 -0
- package/dist/features/magic-context/storage-db.d.ts +183 -0
- package/dist/features/magic-context/storage-db.d.ts.map +1 -0
- package/dist/features/magic-context/storage-historian-runs.d.ts +79 -0
- package/dist/features/magic-context/storage-historian-runs.d.ts.map +1 -0
- package/dist/features/magic-context/storage-identity-merge.d.ts +26 -0
- package/dist/features/magic-context/storage-identity-merge.d.ts.map +1 -0
- package/dist/features/magic-context/storage-identity-rekey-map.d.ts +11 -0
- package/dist/features/magic-context/storage-identity-rekey-map.d.ts.map +1 -0
- package/dist/features/magic-context/storage-m0-mutation-log.d.ts +22 -0
- package/dist/features/magic-context/storage-m0-mutation-log.d.ts.map +1 -0
- package/dist/features/magic-context/storage-memory-mutation-log.d.ts +29 -0
- package/dist/features/magic-context/storage-memory-mutation-log.d.ts.map +1 -0
- package/dist/features/magic-context/storage-meta-persisted.d.ts +623 -0
- package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -0
- package/dist/features/magic-context/storage-meta-session.d.ts +14 -0
- package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -0
- package/dist/features/magic-context/storage-meta-shared.d.ts +102 -0
- package/dist/features/magic-context/storage-meta-shared.d.ts.map +1 -0
- package/dist/features/magic-context/storage-meta.d.ts +4 -0
- package/dist/features/magic-context/storage-meta.d.ts.map +1 -0
- package/dist/features/magic-context/storage-native-replay.d.ts +29 -0
- package/dist/features/magic-context/storage-native-replay.d.ts.map +1 -0
- package/dist/features/magic-context/storage-notes.d.ts +80 -0
- package/dist/features/magic-context/storage-notes.d.ts.map +1 -0
- package/dist/features/magic-context/storage-ops.d.ts +14 -0
- package/dist/features/magic-context/storage-ops.d.ts.map +1 -0
- package/dist/features/magic-context/storage-primers.d.ts +96 -0
- package/dist/features/magic-context/storage-primers.d.ts.map +1 -0
- package/dist/features/magic-context/storage-project-state.d.ts +19 -0
- package/dist/features/magic-context/storage-project-state.d.ts.map +1 -0
- package/dist/features/magic-context/storage-reasoning-removal.d.ts +30 -0
- package/dist/features/magic-context/storage-reasoning-removal.d.ts.map +1 -0
- package/dist/features/magic-context/storage-replay-document.d.ts +72 -0
- package/dist/features/magic-context/storage-replay-document.d.ts.map +1 -0
- package/dist/features/magic-context/storage-schema-helpers.d.ts +31 -0
- package/dist/features/magic-context/storage-schema-helpers.d.ts.map +1 -0
- package/dist/features/magic-context/storage-session-tables.d.ts +18 -0
- package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -0
- package/dist/features/magic-context/storage-source.d.ts +5 -0
- package/dist/features/magic-context/storage-source.d.ts.map +1 -0
- package/dist/features/magic-context/storage-subagent-invocations.d.ts +62 -0
- package/dist/features/magic-context/storage-subagent-invocations.d.ts.map +1 -0
- package/dist/features/magic-context/storage-tags.d.ts +542 -0
- package/dist/features/magic-context/storage-tags.d.ts.map +1 -0
- package/dist/features/magic-context/storage-unavailable-reason.d.ts +17 -0
- package/dist/features/magic-context/storage-unavailable-reason.d.ts.map +1 -0
- package/dist/features/magic-context/storage-v22-backfill-failures.d.ts +26 -0
- package/dist/features/magic-context/storage-v22-backfill-failures.d.ts.map +1 -0
- package/dist/features/magic-context/storage.d.ts +23 -0
- package/dist/features/magic-context/storage.d.ts.map +1 -0
- package/dist/features/magic-context/store-generation-rebase.d.ts +188 -0
- package/dist/features/magic-context/store-generation-rebase.d.ts.map +1 -0
- package/dist/features/magic-context/subagent-token-capture.d.ts +35 -0
- package/dist/features/magic-context/subagent-token-capture.d.ts.map +1 -0
- package/dist/features/magic-context/tag-input.d.ts +4 -0
- package/dist/features/magic-context/tag-input.d.ts.map +1 -0
- package/dist/features/magic-context/tagger.d.ts +119 -0
- package/dist/features/magic-context/tagger.d.ts.map +1 -0
- package/dist/features/magic-context/tool-definition-tokens.d.ts +90 -0
- package/dist/features/magic-context/tool-definition-tokens.d.ts.map +1 -0
- package/dist/features/magic-context/tool-owner-backfill.d.ts +93 -0
- package/dist/features/magic-context/tool-owner-backfill.d.ts.map +1 -0
- package/dist/features/magic-context/transform-decision-log.d.ts +110 -0
- package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -0
- package/dist/features/magic-context/types.d.ts +133 -0
- package/dist/features/magic-context/types.d.ts.map +1 -0
- package/dist/features/magic-context/window-report-ledger.d.ts +70 -0
- package/dist/features/magic-context/window-report-ledger.d.ts.map +1 -0
- package/dist/features/magic-context/work-metrics.d.ts +79 -0
- package/dist/features/magic-context/work-metrics.d.ts.map +1 -0
- package/dist/features/magic-context/workspaces.d.ts +28 -0
- package/dist/features/magic-context/workspaces.d.ts.map +1 -0
- package/dist/hooks/auto-update-checker/semver.d.ts +26 -0
- package/dist/hooks/auto-update-checker/semver.d.ts.map +1 -0
- package/dist/hooks/magic-context/apply-operations.d.ts +158 -0
- package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -0
- package/dist/hooks/magic-context/auto-search-deadline.d.ts +10 -0
- package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -0
- package/dist/hooks/magic-context/auto-search-hint.d.ts +36 -0
- package/dist/hooks/magic-context/auto-search-hint.d.ts.map +1 -0
- package/dist/hooks/magic-context/auto-search-runner.d.ts +60 -0
- package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -0
- package/dist/hooks/magic-context/cache-busting-signals.d.ts +42 -0
- package/dist/hooks/magic-context/cache-busting-signals.d.ts.map +1 -0
- package/dist/hooks/magic-context/caveman-cleanup.d.ts +98 -0
- package/dist/hooks/magic-context/caveman-cleanup.d.ts.map +1 -0
- package/dist/hooks/magic-context/caveman.d.ts +90 -0
- package/dist/hooks/magic-context/caveman.d.ts.map +1 -0
- package/dist/hooks/magic-context/channel2-cycle.d.ts +16 -0
- package/dist/hooks/magic-context/channel2-cycle.d.ts.map +1 -0
- package/dist/hooks/magic-context/channel2-delivery.d.ts +32 -0
- package/dist/hooks/magic-context/channel2-delivery.d.ts.map +1 -0
- package/dist/hooks/magic-context/child-session-spawn.d.ts +27 -0
- package/dist/hooks/magic-context/child-session-spawn.d.ts.map +1 -0
- package/dist/hooks/magic-context/compaction-marker-manager.d.ts +154 -0
- package/dist/hooks/magic-context/compaction-marker-manager.d.ts.map +1 -0
- package/dist/hooks/magic-context/compaction-off-transition.d.ts +97 -0
- package/dist/hooks/magic-context/compaction-off-transition.d.ts.map +1 -0
- package/dist/hooks/magic-context/compartment-parser.d.ts +66 -0
- package/dist/hooks/magic-context/compartment-parser.d.ts.map +1 -0
- package/dist/hooks/magic-context/compartment-prompt.d.ts +33 -0
- package/dist/hooks/magic-context/compartment-prompt.d.ts.map +1 -0
- package/dist/hooks/magic-context/compartment-render-epoch.d.ts +27 -0
- package/dist/hooks/magic-context/compartment-render-epoch.d.ts.map +1 -0
- package/dist/hooks/magic-context/compartment-runner-drop-queue.d.ts +29 -0
- package/dist/hooks/magic-context/compartment-runner-drop-queue.d.ts.map +1 -0
- package/dist/hooks/magic-context/compartment-runner-historian.d.ts +43 -0
- package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -0
- package/dist/hooks/magic-context/compartment-runner-incremental.d.ts +31 -0
- package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -0
- package/dist/hooks/magic-context/compartment-runner-mapping.d.ts +25 -0
- package/dist/hooks/magic-context/compartment-runner-mapping.d.ts.map +1 -0
- package/dist/hooks/magic-context/compartment-runner-partial-recomp.d.ts +29 -0
- package/dist/hooks/magic-context/compartment-runner-partial-recomp.d.ts.map +1 -0
- package/dist/hooks/magic-context/compartment-runner-recomp.d.ts +11 -0
- package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -0
- package/dist/hooks/magic-context/compartment-runner-types.d.ts +295 -0
- package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -0
- package/dist/hooks/magic-context/compartment-runner-validation.d.ts +83 -0
- package/dist/hooks/magic-context/compartment-runner-validation.d.ts.map +1 -0
- package/dist/hooks/magic-context/compartment-runner.d.ts +59 -0
- package/dist/hooks/magic-context/compartment-runner.d.ts.map +1 -0
- package/dist/hooks/magic-context/compartment-trigger.d.ts +77 -0
- package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -0
- package/dist/hooks/magic-context/ctx-reduce-availability.d.ts +170 -0
- package/dist/hooks/magic-context/ctx-reduce-availability.d.ts.map +1 -0
- package/dist/hooks/magic-context/ctx-reduce-nudge.d.ts +104 -0
- package/dist/hooks/magic-context/ctx-reduce-nudge.d.ts.map +1 -0
- package/dist/hooks/magic-context/decay-curve.d.ts +84 -0
- package/dist/hooks/magic-context/decay-curve.d.ts.map +1 -0
- package/dist/hooks/magic-context/decay-render.d.ts +80 -0
- package/dist/hooks/magic-context/decay-render.d.ts.map +1 -0
- package/dist/hooks/magic-context/decision-calibration.d.ts +24 -0
- package/dist/hooks/magic-context/decision-calibration.d.ts.map +1 -0
- package/dist/hooks/magic-context/degraded-pass-refusal.d.ts +35 -0
- package/dist/hooks/magic-context/degraded-pass-refusal.d.ts.map +1 -0
- package/dist/hooks/magic-context/derive-budgets.d.ts +60 -0
- package/dist/hooks/magic-context/derive-budgets.d.ts.map +1 -0
- package/dist/hooks/magic-context/drop-stale-reduce-calls.d.ts +39 -0
- package/dist/hooks/magic-context/drop-stale-reduce-calls.d.ts.map +1 -0
- package/dist/hooks/magic-context/dropped-input-guard.d.ts +55 -0
- package/dist/hooks/magic-context/dropped-input-guard.d.ts.map +1 -0
- package/dist/hooks/magic-context/dropped-token-estimate.d.ts +20 -0
- package/dist/hooks/magic-context/dropped-token-estimate.d.ts.map +1 -0
- package/dist/hooks/magic-context/edit-marker.d.ts +11 -0
- package/dist/hooks/magic-context/edit-marker.d.ts.map +1 -0
- package/dist/hooks/magic-context/emergency-drop.d.ts +112 -0
- package/dist/hooks/magic-context/emergency-drop.d.ts.map +1 -0
- package/dist/hooks/magic-context/emergency-fail-closed.d.ts +14 -0
- package/dist/hooks/magic-context/emergency-fail-closed.d.ts.map +1 -0
- package/dist/hooks/magic-context/empty-task-output.d.ts +16 -0
- package/dist/hooks/magic-context/empty-task-output.d.ts.map +1 -0
- package/dist/hooks/magic-context/event-payloads.d.ts +73 -0
- package/dist/hooks/magic-context/event-payloads.d.ts.map +1 -0
- package/dist/hooks/magic-context/event-resolvers.d.ts +114 -0
- package/dist/hooks/magic-context/event-resolvers.d.ts.map +1 -0
- package/dist/hooks/magic-context/execute-flush.d.ts +3 -0
- package/dist/hooks/magic-context/execute-flush.d.ts.map +1 -0
- package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +56 -0
- package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -0
- package/dist/hooks/magic-context/fold-execution-gate.d.ts +2 -0
- package/dist/hooks/magic-context/fold-execution-gate.d.ts.map +1 -0
- package/dist/hooks/magic-context/format-bytes.d.ts +2 -0
- package/dist/hooks/magic-context/format-bytes.d.ts.map +1 -0
- package/dist/hooks/magic-context/heuristic-cleanup.d.ts +48 -0
- package/dist/hooks/magic-context/heuristic-cleanup.d.ts.map +1 -0
- package/dist/hooks/magic-context/historian-no-fire-cause.d.ts +5 -0
- package/dist/hooks/magic-context/historian-no-fire-cause.d.ts.map +1 -0
- package/dist/hooks/magic-context/historian-prompt-fit.d.ts +112 -0
- package/dist/hooks/magic-context/historian-prompt-fit.d.ts.map +1 -0
- package/dist/hooks/magic-context/historian-prompt.generated.d.ts +2 -0
- package/dist/hooks/magic-context/historian-prompt.generated.d.ts.map +1 -0
- package/dist/hooks/magic-context/historian-publish-stage-logger.d.ts +3 -0
- package/dist/hooks/magic-context/historian-publish-stage-logger.d.ts.map +1 -0
- package/dist/hooks/magic-context/historian-state-file.d.ts +43 -0
- package/dist/hooks/magic-context/historian-state-file.d.ts.map +1 -0
- package/dist/hooks/magic-context/history-boundary-repair.d.ts +44 -0
- package/dist/hooks/magic-context/history-boundary-repair.d.ts.map +1 -0
- package/dist/hooks/magic-context/hook-handlers.d.ts +177 -0
- package/dist/hooks/magic-context/hook-handlers.d.ts.map +1 -0
- package/dist/hooks/magic-context/host-served-rows.d.ts +58 -0
- package/dist/hooks/magic-context/host-served-rows.d.ts.map +1 -0
- package/dist/hooks/magic-context/image-token-estimate.d.ts +15 -0
- package/dist/hooks/magic-context/image-token-estimate.d.ts.map +1 -0
- package/dist/hooks/magic-context/inject-compartments.d.ts +389 -0
- package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -0
- package/dist/hooks/magic-context/issue-135-wire-fixtures.d.ts +8 -0
- package/dist/hooks/magic-context/issue-135-wire-fixtures.d.ts.map +1 -0
- package/dist/hooks/magic-context/issue-423-fixture.d.ts +37 -0
- package/dist/hooks/magic-context/issue-423-fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/issue-424-fixture.d.ts +11 -0
- package/dist/hooks/magic-context/issue-424-fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/legacy-compartments.d.ts +20 -0
- package/dist/hooks/magic-context/legacy-compartments.d.ts.map +1 -0
- package/dist/hooks/magic-context/live-session-state.d.ts +68 -0
- package/dist/hooks/magic-context/live-session-state.d.ts.map +1 -0
- package/dist/hooks/magic-context/lkg-persist.d.ts +22 -0
- package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -0
- package/dist/hooks/magic-context/lkg-replay.d.ts +71 -0
- package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -0
- package/dist/hooks/magic-context/lkg-slot.d.ts +119 -0
- package/dist/hooks/magic-context/lkg-slot.d.ts.map +1 -0
- package/dist/hooks/magic-context/m0-token-breakdown.d.ts +44 -0
- package/dist/hooks/magic-context/m0-token-breakdown.d.ts.map +1 -0
- package/dist/hooks/magic-context/maintenance-authority.d.ts +2 -0
- package/dist/hooks/magic-context/maintenance-authority.d.ts.map +1 -0
- package/dist/hooks/magic-context/openai-compat-adjacency.d.ts +38 -0
- package/dist/hooks/magic-context/openai-compat-adjacency.d.ts.map +1 -0
- package/dist/hooks/magic-context/opencode-v1-store-fixture.d.ts +12 -0
- package/dist/hooks/magic-context/opencode-v1-store-fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/pass-outcome.d.ts +70 -0
- package/dist/hooks/magic-context/pass-outcome.d.ts.map +1 -0
- package/dist/hooks/magic-context/persist-filtered-noise.d.ts +5 -0
- package/dist/hooks/magic-context/persist-filtered-noise.d.ts.map +1 -0
- package/dist/hooks/magic-context/postprocess-read-cache.d.ts +8 -0
- package/dist/hooks/magic-context/postprocess-read-cache.d.ts.map +1 -0
- package/dist/hooks/magic-context/producer-window-guard.d.ts +63 -0
- package/dist/hooks/magic-context/producer-window-guard.d.ts.map +1 -0
- package/dist/hooks/magic-context/producer-window-test-support.d.ts +14 -0
- package/dist/hooks/magic-context/producer-window-test-support.d.ts.map +1 -0
- package/dist/hooks/magic-context/protected-tail-boundary.d.ts +234 -0
- package/dist/hooks/magic-context/protected-tail-boundary.d.ts.map +1 -0
- package/dist/hooks/magic-context/raw-fallback-context-limit.d.ts +10 -0
- package/dist/hooks/magic-context/raw-fallback-context-limit.d.ts.map +1 -0
- package/dist/hooks/magic-context/read-session-chunk.d.ts +271 -0
- package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -0
- package/dist/hooks/magic-context/read-session-db.d.ts +66 -0
- package/dist/hooks/magic-context/read-session-db.d.ts.map +1 -0
- package/dist/hooks/magic-context/read-session-formatting.d.ts +65 -0
- package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -0
- package/dist/hooks/magic-context/read-session-raw.d.ts +164 -0
- package/dist/hooks/magic-context/read-session-raw.d.ts.map +1 -0
- package/dist/hooks/magic-context/read-session-true-raw-tokens.d.ts +82 -0
- package/dist/hooks/magic-context/read-session-true-raw-tokens.d.ts.map +1 -0
- package/dist/hooks/magic-context/reasoning-removal.d.ts +60 -0
- package/dist/hooks/magic-context/reasoning-removal.d.ts.map +1 -0
- package/dist/hooks/magic-context/recomp-orchestrator.d.ts +93 -0
- package/dist/hooks/magic-context/recomp-orchestrator.d.ts.map +1 -0
- package/dist/hooks/magic-context/reference-retrieval.d.ts +72 -0
- package/dist/hooks/magic-context/reference-retrieval.d.ts.map +1 -0
- package/dist/hooks/magic-context/reference-seeds.generated.d.ts +8 -0
- package/dist/hooks/magic-context/reference-seeds.generated.d.ts.map +1 -0
- package/dist/hooks/magic-context/send-session-notification.d.ts +43 -0
- package/dist/hooks/magic-context/send-session-notification.d.ts.map +1 -0
- package/dist/hooks/magic-context/sentinel.d.ts +146 -0
- package/dist/hooks/magic-context/sentinel.d.ts.map +1 -0
- package/dist/hooks/magic-context/storage-busy-refusal.d.ts +20 -0
- package/dist/hooks/magic-context/storage-busy-refusal.d.ts.map +1 -0
- package/dist/hooks/magic-context/strip-content.d.ts +216 -0
- package/dist/hooks/magic-context/strip-content.d.ts.map +1 -0
- package/dist/hooks/magic-context/strip-structural-noise.d.ts +15 -0
- package/dist/hooks/magic-context/strip-structural-noise.d.ts.map +1 -0
- package/dist/hooks/magic-context/stripped-command.d.ts +56 -0
- package/dist/hooks/magic-context/stripped-command.d.ts.map +1 -0
- package/dist/hooks/magic-context/supersession-reclaim.d.ts +58 -0
- package/dist/hooks/magic-context/supersession-reclaim.d.ts.map +1 -0
- package/dist/hooks/magic-context/system-injection-stripper.d.ts +2 -0
- package/dist/hooks/magic-context/system-injection-stripper.d.ts.map +1 -0
- package/dist/hooks/magic-context/system-prompt-hash.d.ts +129 -0
- package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -0
- package/dist/hooks/magic-context/tag-content-primitives.d.ts +31 -0
- package/dist/hooks/magic-context/tag-content-primitives.d.ts.map +1 -0
- package/dist/hooks/magic-context/tag-id-fallback.d.ts +11 -0
- package/dist/hooks/magic-context/tag-id-fallback.d.ts.map +1 -0
- package/dist/hooks/magic-context/tag-messages.d.ts +145 -0
- package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -0
- package/dist/hooks/magic-context/tag-part-guards.d.ts +23 -0
- package/dist/hooks/magic-context/tag-part-guards.d.ts.map +1 -0
- package/dist/hooks/magic-context/tail-hygiene-walk.d.ts +178 -0
- package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -0
- package/dist/hooks/magic-context/temporal-awareness.d.ts +73 -0
- package/dist/hooks/magic-context/temporal-awareness.d.ts.map +1 -0
- package/dist/hooks/magic-context/text-complete.d.ts +31 -0
- package/dist/hooks/magic-context/text-complete.d.ts.map +1 -0
- package/dist/hooks/magic-context/todo-view.d.ts +127 -0
- package/dist/hooks/magic-context/todo-view.d.ts.map +1 -0
- package/dist/hooks/magic-context/tokenizer-calibration.d.ts +92 -0
- package/dist/hooks/magic-context/tokenizer-calibration.d.ts.map +1 -0
- package/dist/hooks/magic-context/tool-drop-target.d.ts +144 -0
- package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -0
- package/dist/hooks/magic-context/tool-input-size.d.ts +21 -0
- package/dist/hooks/magic-context/tool-input-size.d.ts.map +1 -0
- package/dist/hooks/magic-context/tool-reclaim.d.ts +12 -0
- package/dist/hooks/magic-context/tool-reclaim.d.ts.map +1 -0
- package/dist/hooks/magic-context/tool-sweep-policy.d.ts +50 -0
- package/dist/hooks/magic-context/tool-sweep-policy.d.ts.map +1 -0
- package/dist/hooks/magic-context/transform-compartment-phase.d.ts +133 -0
- package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -0
- package/dist/hooks/magic-context/transform-context-state.d.ts +28 -0
- package/dist/hooks/magic-context/transform-context-state.d.ts.map +1 -0
- package/dist/hooks/magic-context/transform-message-helpers.d.ts +32 -0
- package/dist/hooks/magic-context/transform-message-helpers.d.ts.map +1 -0
- package/dist/hooks/magic-context/transform-operations.d.ts +5 -0
- package/dist/hooks/magic-context/transform-operations.d.ts.map +1 -0
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +350 -0
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -0
- package/dist/hooks/magic-context/transform-stage-logger.d.ts +2 -0
- package/dist/hooks/magic-context/transform-stage-logger.d.ts.map +1 -0
- package/dist/hooks/magic-context/transform.d.ts +334 -0
- package/dist/hooks/magic-context/transform.d.ts.map +1 -0
- package/dist/hooks/magic-context/unmanaged-over-window.d.ts +36 -0
- package/dist/hooks/magic-context/unmanaged-over-window.d.ts.map +1 -0
- package/dist/hooks/magic-context/unresolved-history-boundary.d.ts +15 -0
- package/dist/hooks/magic-context/unresolved-history-boundary.d.ts.map +1 -0
- package/dist/hooks/magic-context/wrapup-orchestrator.d.ts +14 -0
- package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -0
- package/dist/index-1vs6anwz.js +126 -0
- package/dist/index-3wagyrnj.js +670 -0
- package/dist/index-53g38ggt.js +40 -0
- package/dist/index-5pg0acf7.js +410 -0
- package/dist/index-977gxfz0.js +514 -0
- package/dist/index-by6h2pav.js +27883 -0
- package/dist/index-e1q8002h.js +16 -0
- package/dist/index-fg34g6a5.js +584 -0
- package/dist/index-jdxxq8cz.js +99 -0
- package/dist/index-me3zcj5t.js +69 -0
- package/dist/index-qbkzdkk0.js +496 -0
- package/dist/index-wgt4gamw.js +6388 -0
- package/dist/index-zx63j2e2.js +907 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/message-time-backfill-5ewk0axe.js +116 -0
- package/dist/model-resolution-5haaxnpt.js +6 -0
- package/dist/plugin/boot-deadline.d.ts +47 -0
- package/dist/plugin/boot-deadline.d.ts.map +1 -0
- package/dist/plugin/boot-quiet.d.ts +12 -0
- package/dist/plugin/boot-quiet.d.ts.map +1 -0
- package/dist/plugin/normalize-tool-arg-schemas.d.ts +7 -0
- package/dist/plugin/normalize-tool-arg-schemas.d.ts.map +1 -0
- package/dist/plugin/rpc-handlers.d.ts +52 -0
- package/dist/plugin/rpc-handlers.d.ts.map +1 -0
- package/dist/plugin/sidebar-snapshot-cache.d.ts +19 -0
- package/dist/plugin/sidebar-snapshot-cache.d.ts.map +1 -0
- package/dist/plugin/subagent-tool-policy.d.ts +9 -0
- package/dist/plugin/subagent-tool-policy.d.ts.map +1 -0
- package/dist/plugin/types.d.ts +3 -0
- package/dist/plugin/types.d.ts.map +1 -0
- package/dist/prompt-context-ffa5xcfx.js +76 -0
- package/dist/read-session-chunk-apjwrttc.js +56 -0
- package/dist/recomp-orchestrator-gyeevxaw.js +21 -0
- package/dist/rpc-notifications-4amf6mf4.js +14 -0
- package/dist/safe-notification-target-ph3xd1ve.js +9 -0
- package/dist/send-session-notification-y29y9fsr.js +18 -0
- package/dist/shared/announcement.d.ts +69 -0
- package/dist/shared/announcement.d.ts.map +1 -0
- package/dist/shared/assistant-message-extractor.d.ts +13 -0
- package/dist/shared/assistant-message-extractor.d.ts.map +1 -0
- package/dist/shared/auto-update-provenance.d.ts +9 -0
- package/dist/shared/auto-update-provenance.d.ts.map +1 -0
- package/dist/shared/bounded-session-map.d.ts +45 -0
- package/dist/shared/bounded-session-map.d.ts.map +1 -0
- package/dist/shared/builtin-commands.d.ts +24 -0
- package/dist/shared/builtin-commands.d.ts.map +1 -0
- package/dist/shared/cache-ttl-display.d.ts +25 -0
- package/dist/shared/cache-ttl-display.d.ts.map +1 -0
- package/dist/shared/cache-ttl-seed.d.ts +10 -0
- package/dist/shared/cache-ttl-seed.d.ts.map +1 -0
- package/dist/shared/child-session-teardown.d.ts +34 -0
- package/dist/shared/child-session-teardown.d.ts.map +1 -0
- package/dist/shared/commit-detection.d.ts +29 -0
- package/dist/shared/commit-detection.d.ts.map +1 -0
- package/dist/shared/config-diagnostics.d.ts +30 -0
- package/dist/shared/config-diagnostics.d.ts.map +1 -0
- package/dist/shared/conflict-detector.d.ts +139 -0
- package/dist/shared/conflict-detector.d.ts.map +1 -0
- package/dist/shared/conflict-fixer.d.ts +20 -0
- package/dist/shared/conflict-fixer.d.ts.map +1 -0
- package/dist/shared/context-limit-provenance.d.ts +3 -0
- package/dist/shared/context-limit-provenance.d.ts.map +1 -0
- package/dist/shared/data-path.d.ts +176 -0
- package/dist/shared/data-path.d.ts.map +1 -0
- package/dist/shared/error-message.d.ts +32 -0
- package/dist/shared/error-message.d.ts.map +1 -0
- package/dist/shared/escalation-bands.d.ts +9 -0
- package/dist/shared/escalation-bands.d.ts.map +1 -0
- package/dist/shared/format-bytes.d.ts +2 -0
- package/dist/shared/format-bytes.d.ts.map +1 -0
- package/dist/shared/format-threshold.d.ts +43 -0
- package/dist/shared/format-threshold.d.ts.map +1 -0
- package/dist/shared/harness-provider-map.d.ts +64 -0
- package/dist/shared/harness-provider-map.d.ts.map +1 -0
- package/dist/shared/harness.d.ts +55 -0
- package/dist/shared/harness.d.ts.map +1 -0
- package/dist/shared/hidden-variant-warnings.d.ts +5 -0
- package/dist/shared/hidden-variant-warnings.d.ts.map +1 -0
- package/dist/shared/historian-tool-expansions.d.ts +5 -0
- package/dist/shared/historian-tool-expansions.d.ts.map +1 -0
- package/dist/shared/historian-tool-template.d.ts +5 -0
- package/dist/shared/historian-tool-template.d.ts.map +1 -0
- package/dist/shared/historian-transient-error.d.ts +2 -0
- package/dist/shared/historian-transient-error.d.ts.map +1 -0
- package/dist/shared/host-limitations.d.ts +14 -0
- package/dist/shared/host-limitations.d.ts.map +1 -0
- package/dist/shared/index.d.ts +8 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/internal-initiator-marker.d.ts +2 -0
- package/dist/shared/internal-initiator-marker.d.ts.map +1 -0
- package/dist/shared/jsonc-edit.d.ts +23 -0
- package/dist/shared/jsonc-edit.d.ts.map +1 -0
- package/dist/shared/jsonc-parser.d.ts +30 -0
- package/dist/shared/jsonc-parser.d.ts.map +1 -0
- package/dist/shared/keep-subagents.d.ts +7 -0
- package/dist/shared/keep-subagents.d.ts.map +1 -0
- package/dist/shared/logger.d.ts +18 -0
- package/dist/shared/logger.d.ts.map +1 -0
- package/dist/shared/model-cache-ttl.d.ts +9 -0
- package/dist/shared/model-cache-ttl.d.ts.map +1 -0
- package/dist/shared/model-resolution.d.ts +35 -0
- package/dist/shared/model-resolution.d.ts.map +1 -0
- package/dist/shared/model-suggestion-retry.d.ts +138 -0
- package/dist/shared/model-suggestion-retry.d.ts.map +1 -0
- package/dist/shared/models-dev-cache.d.ts +156 -0
- package/dist/shared/models-dev-cache.d.ts.map +1 -0
- package/dist/shared/normalize-sdk-response.d.ts +5 -0
- package/dist/shared/normalize-sdk-response.d.ts.map +1 -0
- package/dist/shared/opencode-config-dir-types.d.ts +14 -0
- package/dist/shared/opencode-config-dir-types.d.ts.map +1 -0
- package/dist/shared/opencode-config-dir.d.ts +57 -0
- package/dist/shared/opencode-config-dir.d.ts.map +1 -0
- package/dist/shared/opencode-db-path.d.ts +68 -0
- package/dist/shared/opencode-db-path.d.ts.map +1 -0
- package/dist/shared/pi-executable.d.ts +6 -0
- package/dist/shared/pi-executable.d.ts.map +1 -0
- package/dist/shared/plugin-package-version.d.ts +14 -0
- package/dist/shared/plugin-package-version.d.ts.map +1 -0
- package/dist/shared/project-directory-key.d.ts +26 -0
- package/dist/shared/project-directory-key.d.ts.map +1 -0
- package/dist/shared/prompt-context.d.ts +31 -0
- package/dist/shared/prompt-context.d.ts.map +1 -0
- package/dist/shared/prompt-surface-a1-golden.d.ts +28 -0
- package/dist/shared/prompt-surface-a1-golden.d.ts.map +1 -0
- package/dist/shared/prompt-surface-runtime.d.ts +62 -0
- package/dist/shared/prompt-surface-runtime.d.ts.map +1 -0
- package/dist/shared/prompt-surface.d.ts +53 -0
- package/dist/shared/prompt-surface.d.ts.map +1 -0
- package/dist/shared/provider-response-completion.d.ts +12 -0
- package/dist/shared/provider-response-completion.d.ts.map +1 -0
- package/dist/shared/record-type-guard.d.ts +2 -0
- package/dist/shared/record-type-guard.d.ts.map +1 -0
- package/dist/shared/redaction.d.ts +7 -0
- package/dist/shared/redaction.d.ts.map +1 -0
- package/dist/shared/resolve-fallbacks.d.ts +48 -0
- package/dist/shared/resolve-fallbacks.d.ts.map +1 -0
- package/dist/shared/rpc-client.d.ts +28 -0
- package/dist/shared/rpc-client.d.ts.map +1 -0
- package/dist/shared/rpc-notifications.d.ts +74 -0
- package/dist/shared/rpc-notifications.d.ts.map +1 -0
- package/dist/shared/rpc-server.d.ts +52 -0
- package/dist/shared/rpc-server.d.ts.map +1 -0
- package/dist/shared/rpc-types.d.ts +385 -0
- package/dist/shared/rpc-types.d.ts.map +1 -0
- package/dist/shared/rpc-utils.d.ts +162 -0
- package/dist/shared/rpc-utils.d.ts.map +1 -0
- package/dist/shared/run-token-log.d.ts +13 -0
- package/dist/shared/run-token-log.d.ts.map +1 -0
- package/dist/shared/safe-notification-target.d.ts +23 -0
- package/dist/shared/safe-notification-target.d.ts.map +1 -0
- package/dist/shared/sqlite-context-pragmas.d.ts +12 -0
- package/dist/shared/sqlite-context-pragmas.d.ts.map +1 -0
- package/dist/shared/sqlite-helpers.d.ts +25 -0
- package/dist/shared/sqlite-helpers.d.ts.map +1 -0
- package/dist/shared/sqlite-write-locker-test-support.d.ts +7 -0
- package/dist/shared/sqlite-write-locker-test-support.d.ts.map +1 -0
- package/dist/shared/sqlite.d.ts +163 -0
- package/dist/shared/sqlite.d.ts.map +1 -0
- package/dist/shared/stable-json.d.ts +21 -0
- package/dist/shared/stable-json.d.ts.map +1 -0
- package/dist/shared/status-detail-text.d.ts +4 -0
- package/dist/shared/status-detail-text.d.ts.map +1 -0
- package/dist/shared/status-summary.d.ts +54 -0
- package/dist/shared/status-summary.d.ts.map +1 -0
- package/dist/shared/status-view-check.d.ts +130 -0
- package/dist/shared/status-view-check.d.ts.map +1 -0
- package/dist/shared/status-view.d.ts +230 -0
- package/dist/shared/status-view.d.ts.map +1 -0
- package/dist/shared/storage-permissions.d.ts +29 -0
- package/dist/shared/storage-permissions.d.ts.map +1 -0
- package/dist/shared/subagent-runner.d.ts +231 -0
- package/dist/shared/subagent-runner.d.ts.map +1 -0
- package/dist/shared/summarize-child-stderr.d.ts +2 -0
- package/dist/shared/summarize-child-stderr.d.ts.map +1 -0
- package/dist/shared/system-directive.d.ts +3 -0
- package/dist/shared/system-directive.d.ts.map +1 -0
- package/dist/shared/tag-owner-id.d.ts +19 -0
- package/dist/shared/tag-owner-id.d.ts.map +1 -0
- package/dist/shared/tag-transcript.d.ts +103 -0
- package/dist/shared/tag-transcript.d.ts.map +1 -0
- package/dist/shared/tail-hygiene-status.d.ts +24 -0
- package/dist/shared/tail-hygiene-status.d.ts.map +1 -0
- package/dist/shared/test-temp-dir.d.ts +46 -0
- package/dist/shared/test-temp-dir.d.ts.map +1 -0
- package/dist/shared/transcript.d.ts +251 -0
- package/dist/shared/transcript.d.ts.map +1 -0
- package/dist/shared/user-answer.d.ts +4 -0
- package/dist/shared/user-answer.d.ts.map +1 -0
- package/dist/shared/user-facing-codes.d.ts +135 -0
- package/dist/shared/user-facing-codes.d.ts.map +1 -0
- package/dist/shared/window-geometry.d.ts +121 -0
- package/dist/shared/window-geometry.d.ts.map +1 -0
- package/dist/shared/write-transaction-timing.d.ts +11 -0
- package/dist/shared/write-transaction-timing.d.ts.map +1 -0
- package/dist/shared/xml-unescape.d.ts +9 -0
- package/dist/shared/xml-unescape.d.ts.map +1 -0
- package/dist/tools/ctx-expand/constants.d.ts +3 -0
- package/dist/tools/ctx-expand/constants.d.ts.map +1 -0
- package/dist/tools/ctx-expand/index.d.ts +2 -0
- package/dist/tools/ctx-expand/index.d.ts.map +1 -0
- package/dist/tools/ctx-expand/mode.d.ts +35 -0
- package/dist/tools/ctx-expand/mode.d.ts.map +1 -0
- package/dist/tools/ctx-expand/render.d.ts +47 -0
- package/dist/tools/ctx-expand/render.d.ts.map +1 -0
- package/dist/tools/ctx-expand/tools.d.ts +10 -0
- package/dist/tools/ctx-expand/tools.d.ts.map +1 -0
- package/dist/tools/ctx-expand/types.d.ts +11 -0
- package/dist/tools/ctx-expand/types.d.ts.map +1 -0
- package/dist/tools/ctx-memory/constants.d.ts +3 -0
- package/dist/tools/ctx-memory/constants.d.ts.map +1 -0
- package/dist/tools/ctx-memory/index.d.ts +4 -0
- package/dist/tools/ctx-memory/index.d.ts.map +1 -0
- package/dist/tools/ctx-memory/tools.d.ts +5 -0
- package/dist/tools/ctx-memory/tools.d.ts.map +1 -0
- package/dist/tools/ctx-memory/types.d.ts +38 -0
- package/dist/tools/ctx-memory/types.d.ts.map +1 -0
- package/dist/tools/ctx-memory/verification-recording.d.ts +8 -0
- package/dist/tools/ctx-memory/verification-recording.d.ts.map +1 -0
- package/dist/tools/ctx-note/constants.d.ts +2 -0
- package/dist/tools/ctx-note/constants.d.ts.map +1 -0
- package/dist/tools/ctx-note/index.d.ts +4 -0
- package/dist/tools/ctx-note/index.d.ts.map +1 -0
- package/dist/tools/ctx-note/render.d.ts +67 -0
- package/dist/tools/ctx-note/render.d.ts.map +1 -0
- package/dist/tools/ctx-note/tools.d.ts +13 -0
- package/dist/tools/ctx-note/tools.d.ts.map +1 -0
- package/dist/tools/ctx-note/types.d.ts +14 -0
- package/dist/tools/ctx-note/types.d.ts.map +1 -0
- package/dist/tools/ctx-reduce/constants.d.ts +4 -0
- package/dist/tools/ctx-reduce/constants.d.ts.map +1 -0
- package/dist/tools/ctx-reduce/index.d.ts +4 -0
- package/dist/tools/ctx-reduce/index.d.ts.map +1 -0
- package/dist/tools/ctx-reduce/tools.d.ts +19 -0
- package/dist/tools/ctx-reduce/tools.d.ts.map +1 -0
- package/dist/tools/ctx-reduce/types.d.ts +5 -0
- package/dist/tools/ctx-reduce/types.d.ts.map +1 -0
- package/dist/tools/ctx-search/constants.d.ts +4 -0
- package/dist/tools/ctx-search/constants.d.ts.map +1 -0
- package/dist/tools/ctx-search/date-range.d.ts +9 -0
- package/dist/tools/ctx-search/date-range.d.ts.map +1 -0
- package/dist/tools/ctx-search/index.d.ts +4 -0
- package/dist/tools/ctx-search/index.d.ts.map +1 -0
- package/dist/tools/ctx-search/tools.d.ts +5 -0
- package/dist/tools/ctx-search/tools.d.ts.map +1 -0
- package/dist/tools/ctx-search/types.d.ts +34 -0
- package/dist/tools/ctx-search/types.d.ts.map +1 -0
- package/dist/tools/light-descriptions.d.ts +6 -0
- package/dist/tools/light-descriptions.d.ts.map +1 -0
- package/dist/tools/parameter-descriptions.d.ts +75 -0
- package/dist/tools/parameter-descriptions.d.ts.map +1 -0
- package/dist/tools/unwrap-imitated-reduced-args.d.ts +21 -0
- package/dist/tools/unwrap-imitated-reduced-args.d.ts.map +1 -0
- package/dist/v2/fold/boundary.d.ts +61 -0
- package/dist/v2/fold/boundary.d.ts.map +1 -0
- package/dist/v2/fold/host-media.d.ts +36 -0
- package/dist/v2/fold/host-media.d.ts.map +1 -0
- package/dist/v2/fold/markers.d.ts +7 -0
- package/dist/v2/fold/markers.d.ts.map +1 -0
- package/dist/v2/fold/owner.d.ts +40 -0
- package/dist/v2/fold/owner.d.ts.map +1 -0
- package/dist/v2/fold/restore.d.ts +31 -0
- package/dist/v2/fold/restore.d.ts.map +1 -0
- package/dist/v2/fork-inheritance.d.ts +101 -0
- package/dist/v2/fork-inheritance.d.ts.map +1 -0
- package/dist/v2/hidden-child-cleanup.d.ts +11 -0
- package/dist/v2/hidden-child-cleanup.d.ts.map +1 -0
- package/dist/v2/hidden-child-native.d.ts +29 -0
- package/dist/v2/hidden-child-native.d.ts.map +1 -0
- package/dist/v2/hidden-child-record.d.ts +137 -0
- package/dist/v2/hidden-child-record.d.ts.map +1 -0
- package/dist/v2/hidden-completion.d.ts +57 -0
- package/dist/v2/hidden-completion.d.ts.map +1 -0
- package/dist/v2/hooks/channel2.d.ts +10 -0
- package/dist/v2/hooks/channel2.d.ts.map +1 -0
- package/dist/v2/hooks/commands.d.ts +29 -0
- package/dist/v2/hooks/commands.d.ts.map +1 -0
- package/dist/v2/hooks/context.d.ts +112 -0
- package/dist/v2/hooks/context.d.ts.map +1 -0
- package/dist/v2/hooks/deleted-session-tombstones.d.ts +10 -0
- package/dist/v2/hooks/deleted-session-tombstones.d.ts.map +1 -0
- package/dist/v2/hooks/generate.d.ts +10 -0
- package/dist/v2/hooks/generate.d.ts.map +1 -0
- package/dist/v2/hooks/hidden-child.d.ts +76 -0
- package/dist/v2/hooks/hidden-child.d.ts.map +1 -0
- package/dist/v2/hooks/hidden-terminal-error.d.ts +8 -0
- package/dist/v2/hooks/hidden-terminal-error.d.ts.map +1 -0
- package/dist/v2/hooks/lkg-system.d.ts +11 -0
- package/dist/v2/hooks/lkg-system.d.ts.map +1 -0
- package/dist/v2/hooks/model-limit-cache.d.ts +19 -0
- package/dist/v2/hooks/model-limit-cache.d.ts.map +1 -0
- package/dist/v2/hooks/payload.d.ts +15 -0
- package/dist/v2/hooks/payload.d.ts.map +1 -0
- package/dist/v2/hooks/refusal.d.ts +15 -0
- package/dist/v2/hooks/refusal.d.ts.map +1 -0
- package/dist/v2/hooks/restore-rows.d.ts +29 -0
- package/dist/v2/hooks/restore-rows.d.ts.map +1 -0
- package/dist/v2/hooks/rpc-live-state.d.ts +9 -0
- package/dist/v2/hooks/rpc-live-state.d.ts.map +1 -0
- package/dist/v2/hooks/session-api-gate.d.ts +4 -0
- package/dist/v2/hooks/session-api-gate.d.ts.map +1 -0
- package/dist/v2/hooks/session-project-backfill.d.ts +15 -0
- package/dist/v2/hooks/session-project-backfill.d.ts.map +1 -0
- package/dist/v2/hooks/storage-gate.d.ts +48 -0
- package/dist/v2/hooks/storage-gate.d.ts.map +1 -0
- package/dist/v2/hooks/storage-notice.d.ts +29 -0
- package/dist/v2/hooks/storage-notice.d.ts.map +1 -0
- package/dist/v2/hooks/store.d.ts +58 -0
- package/dist/v2/hooks/store.d.ts.map +1 -0
- package/dist/v2/hooks/tools.d.ts +8 -0
- package/dist/v2/hooks/tools.d.ts.map +1 -0
- package/dist/v2/hooks/types.d.ts +250 -0
- package/dist/v2/hooks/types.d.ts.map +1 -0
- package/dist/v2/hooks/usage-persist.d.ts +31 -0
- package/dist/v2/hooks/usage-persist.d.ts.map +1 -0
- package/dist/v2/hooks/usage-reading.d.ts +46 -0
- package/dist/v2/hooks/usage-reading.d.ts.map +1 -0
- package/dist/v2/server.d.ts +27 -0
- package/dist/v2/server.d.ts.map +1 -0
- package/dist/v2/server.js +76235 -0
- package/dist/v2/store-reader.d.ts +218 -0
- package/dist/v2/store-reader.d.ts.map +1 -0
- package/dist/web/api.d.ts +40 -0
- package/dist/web/api.d.ts.map +1 -0
- package/dist/web/context-store.d.ts +74 -0
- package/dist/web/context-store.d.ts.map +1 -0
- package/dist/web/fixtures.d.ts +53 -0
- package/dist/web/fixtures.d.ts.map +1 -0
- package/dist/web/host-opencode.d.ts +56 -0
- package/dist/web/host-opencode.d.ts.map +1 -0
- package/dist/web/host-pi.d.ts +116 -0
- package/dist/web/host-pi.d.ts.map +1 -0
- package/dist/web/main.d.ts +24 -0
- package/dist/web/main.d.ts.map +1 -0
- package/dist/web/main.js +6071 -0
- package/dist/web/memories.d.ts +67 -0
- package/dist/web/memories.d.ts.map +1 -0
- package/dist/web/server.d.ts +42 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/types.d.ts +52 -0
- package/dist/web/types.d.ts.map +1 -0
- package/dist/web/ui/favicon.svg +4 -0
- package/dist/web/ui/index.html +36 -0
- package/dist/web/ui/panel.css +8 -0
- package/dist/web/ui/panel.js +373 -0
- package/dist/web/views.d.ts +155 -0
- package/dist/web/views.d.ts.map +1 -0
- package/dist/web/writes.d.ts +86 -0
- package/dist/web/writes.d.ts.map +1 -0
- package/dist/wrapup-orchestrator-z9sqpqjf.js +420 -0
- package/index.js +1 -0
- package/package.json +84 -4
- package/src/agents/historian.ts +3 -0
- package/src/agents/language-directive.test.ts +129 -0
- package/src/agents/language-directive.ts +113 -0
- package/src/agents/magic-context-prompt.language.test.ts +37 -0
- package/src/agents/magic-context-prompt.test.ts +520 -0
- package/src/agents/magic-context-prompt.ts +196 -0
- package/src/agents/memory-maintainer.test.ts +249 -0
- package/src/agents/memory-maintainer.ts +374 -0
- package/src/config/agent-disable.ts +58 -0
- package/src/config/compaction-accessor-guard.test.ts +81 -0
- package/src/config/compaction-backcompat.test.ts +52 -0
- package/src/config/config-paths.ts +42 -0
- package/src/config/index.test.ts +1252 -0
- package/src/config/index.ts +762 -0
- package/src/config/latch-permanence-guard.test.ts +218 -0
- package/src/config/live-run-config.test.ts +139 -0
- package/src/config/live-run-config.ts +79 -0
- package/src/config/live-schema-drift.test.ts +67 -0
- package/src/config/live-snapshot.test.ts +86 -0
- package/src/config/live-snapshot.ts +187 -0
- package/src/config/migrate-experimental.ts +92 -0
- package/src/config/misplaced-agent-model.test.ts +55 -0
- package/src/config/profiles.ts +106 -0
- package/src/config/project-config-trust-boundary.test.ts +185 -0
- package/src/config/project-security.hostile-matrix.test.ts +281 -0
- package/src/config/project-security.test.ts +329 -0
- package/src/config/project-security.ts +940 -0
- package/src/config/protected-tokens.test.ts +229 -0
- package/src/config/prune-config-leaf.test.ts +78 -0
- package/src/config/prune-config-leaf.ts +67 -0
- package/src/config/raw-loader.test.ts +389 -0
- package/src/config/raw-loader.ts +435 -0
- package/src/config/removed-agent-config.ts +45 -0
- package/src/config/removed-agent-source-fence.test.ts +53 -0
- package/src/config/removed-config-keys.test.ts +106 -0
- package/src/config/schema/agent-overrides.ts +45 -0
- package/src/config/schema/magic-context.test.ts +434 -0
- package/src/config/schema/magic-context.ts +1019 -0
- package/src/config/variable.test.ts +324 -0
- package/src/config/variable.ts +192 -0
- package/src/shared/__fixtures__/window-overlay.v1.json +337 -0
- package/src/shared/announcement.test.ts +198 -0
- package/src/shared/announcement.ts +145 -0
- package/src/shared/assistant-message-extractor.test.ts +47 -0
- package/src/shared/assistant-message-extractor.ts +156 -0
- package/src/shared/auto-update-provenance.ts +42 -0
- package/src/shared/bounded-session-map.test.ts +97 -0
- package/src/shared/bounded-session-map.ts +84 -0
- package/src/shared/builtin-commands.ts +46 -0
- package/src/shared/cache-ttl-display.test.ts +84 -0
- package/src/shared/cache-ttl-display.ts +58 -0
- package/src/shared/cache-ttl-seed.ts +23 -0
- package/src/shared/child-session-teardown.test.ts +241 -0
- package/src/shared/child-session-teardown.ts +66 -0
- package/src/shared/commit-detection.test.ts +63 -0
- package/src/shared/commit-detection.ts +53 -0
- package/src/shared/config-diagnostics.test.ts +29 -0
- package/src/shared/config-diagnostics.ts +64 -0
- package/src/shared/conflict-detector.test.ts +780 -0
- package/src/shared/conflict-detector.ts +596 -0
- package/src/shared/conflict-fixer.test.ts +608 -0
- package/src/shared/conflict-fixer.ts +295 -0
- package/src/shared/context-limit-provenance.ts +6 -0
- package/src/shared/data-path.test.ts +352 -0
- package/src/shared/data-path.ts +310 -0
- package/src/shared/error-message.test.ts +94 -0
- package/src/shared/error-message.ts +115 -0
- package/src/shared/escalation-bands.test.ts +23 -0
- package/src/shared/escalation-bands.ts +18 -0
- package/src/shared/format-bytes.ts +5 -0
- package/src/shared/format-threshold.ts +54 -0
- package/src/shared/harness-provider-map.test.ts +176 -0
- package/src/shared/harness-provider-map.ts +130 -0
- package/src/shared/harness.ts +76 -0
- package/src/shared/hidden-variant-warnings.ts +21 -0
- package/src/shared/historian-tool-defaults.json +13 -0
- package/src/shared/historian-tool-expansions.ts +18 -0
- package/src/shared/historian-tool-template.ts +248 -0
- package/src/shared/historian-transient-error.test.ts +36 -0
- package/src/shared/historian-transient-error.ts +22 -0
- package/src/shared/host-limitations.ts +43 -0
- package/src/shared/index.ts +7 -0
- package/src/shared/internal-initiator-marker.ts +1 -0
- package/src/shared/jsonc-edit.ts +387 -0
- package/src/shared/jsonc-parser.test.ts +46 -0
- package/src/shared/jsonc-parser.ts +283 -0
- package/src/shared/keep-subagents.test.ts +39 -0
- package/src/shared/keep-subagents.ts +28 -0
- package/src/shared/logger.test.ts +292 -0
- package/src/shared/logger.ts +248 -0
- package/src/shared/model-cache-ttl.test.ts +40 -0
- package/src/shared/model-cache-ttl.ts +58 -0
- package/src/shared/model-resolution.test.ts +132 -0
- package/src/shared/model-resolution.ts +158 -0
- package/src/shared/model-suggestion-retry.test.ts +698 -0
- package/src/shared/model-suggestion-retry.ts +838 -0
- package/src/shared/models-dev-cache.test.ts +720 -0
- package/src/shared/models-dev-cache.ts +661 -0
- package/src/shared/normalize-sdk-response.ts +40 -0
- package/src/shared/opencode-config-dir-types.ts +15 -0
- package/src/shared/opencode-config-dir.ts +111 -0
- package/src/shared/opencode-db-path.test.ts +389 -0
- package/src/shared/opencode-db-path.ts +396 -0
- package/src/shared/opencode-host-generation.test.ts +29 -0
- package/src/shared/pi-executable.ts +20 -0
- package/src/shared/plugin-package-version.ts +52 -0
- package/src/shared/project-directory-key.test.ts +111 -0
- package/src/shared/project-directory-key.ts +54 -0
- package/src/shared/prompt-context.ts +135 -0
- package/src/shared/prompt-surface-a1-golden.md +407 -0
- package/src/shared/prompt-surface-a1-golden.ts +41 -0
- package/src/shared/prompt-surface-runtime.test.ts +190 -0
- package/src/shared/prompt-surface-runtime.ts +263 -0
- package/src/shared/prompt-surface.test.ts +195 -0
- package/src/shared/prompt-surface.ts +162 -0
- package/src/shared/provider-response-completion.ts +23 -0
- package/src/shared/record-type-guard.ts +3 -0
- package/src/shared/redaction.test.ts +134 -0
- package/src/shared/redaction.ts +298 -0
- package/src/shared/resolve-fallbacks.test.ts +114 -0
- package/src/shared/resolve-fallbacks.ts +95 -0
- package/src/shared/rpc-async-probes.test.ts +320 -0
- package/src/shared/rpc-client.test.ts +576 -0
- package/src/shared/rpc-client.ts +218 -0
- package/src/shared/rpc-notifications.test.ts +151 -0
- package/src/shared/rpc-notifications.ts +222 -0
- package/src/shared/rpc-server.ts +431 -0
- package/src/shared/rpc-types.ts +386 -0
- package/src/shared/rpc-utils.test.ts +822 -0
- package/src/shared/rpc-utils.ts +1146 -0
- package/src/shared/run-token-log.test.ts +65 -0
- package/src/shared/run-token-log.ts +39 -0
- package/src/shared/safe-notification-target.test.ts +97 -0
- package/src/shared/safe-notification-target.ts +102 -0
- package/src/shared/session-messages-bounded.test.ts +112 -0
- package/src/shared/sqlite-acquisition-fence.test.ts +133 -0
- package/src/shared/sqlite-acquisition-routing.test.ts +145 -0
- package/src/shared/sqlite-bind-style.test.ts +80 -0
- package/src/shared/sqlite-context-pragmas.ts +24 -0
- package/src/shared/sqlite-helpers.ts +44 -0
- package/src/shared/sqlite-import-fence.test.ts +19 -0
- package/src/shared/sqlite-pass-scope.test.ts +154 -0
- package/src/shared/sqlite-transaction-mode-guard.test.ts +234 -0
- package/src/shared/sqlite-write-locker-test-support.ts +63 -0
- package/src/shared/sqlite.test.ts +58 -0
- package/src/shared/sqlite.ts +988 -0
- package/src/shared/stable-json.test.ts +87 -0
- package/src/shared/stable-json.ts +37 -0
- package/src/shared/status-detail-text.test.ts +194 -0
- package/src/shared/status-detail-text.ts +7 -0
- package/src/shared/status-summary.ts +189 -0
- package/src/shared/status-view-check.test.ts +252 -0
- package/src/shared/status-view-check.ts +519 -0
- package/src/shared/status-view.test.ts +395 -0
- package/src/shared/status-view.ts +794 -0
- package/src/shared/storage-busy.test.ts +73 -0
- package/src/shared/storage-permissions.test.ts +190 -0
- package/src/shared/storage-permissions.ts +212 -0
- package/src/shared/subagent-runner.ts +240 -0
- package/src/shared/summarize-child-stderr.test.ts +55 -0
- package/src/shared/summarize-child-stderr.ts +33 -0
- package/src/shared/system-directive.ts +9 -0
- package/src/shared/tag-owner-id.test.ts +33 -0
- package/src/shared/tag-owner-id.ts +29 -0
- package/src/shared/tag-transcript.test.ts +554 -0
- package/src/shared/tag-transcript.ts +1400 -0
- package/src/shared/tail-hygiene-status.ts +73 -0
- package/src/shared/test-temp-dir.test.ts +84 -0
- package/src/shared/test-temp-dir.ts +192 -0
- package/src/shared/transcript.ts +274 -0
- package/src/shared/user-answer.test.ts +12 -0
- package/src/shared/user-answer.ts +17 -0
- package/src/shared/user-facing-codes.test.ts +82 -0
- package/src/shared/user-facing-codes.ts +180 -0
- package/src/shared/window-geometry.test.ts +405 -0
- package/src/shared/window-geometry.ts +726 -0
- package/src/shared/windows-hidden-spawns.test.ts +133 -0
- package/src/shared/write-transaction-attribution.test.ts +214 -0
- package/src/shared/write-transaction-timing.ts +26 -0
- package/src/shared/xml-unescape.ts +19 -0
- package/README.md +0 -3
|
@@ -0,0 +1,940 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_EXECUTE_THRESHOLD_PERCENTAGE,
|
|
3
|
+
PER_HARNESS_MIGRATION_INVENTORY,
|
|
4
|
+
PER_HARNESS_MODEL_KEYS,
|
|
5
|
+
} from "./schema/magic-context";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Security hardening for PROJECT-level (repo-supplied, untrusted) config.
|
|
9
|
+
*
|
|
10
|
+
* A project config lives inside a repository the user cloned. Opening a repo
|
|
11
|
+
* must never let that repo's config escalate privilege or exfiltrate secrets.
|
|
12
|
+
* These helpers run on the raw project config BEFORE/AFTER it is merged over the
|
|
13
|
+
* trusted user config, mutating the relevant object in place and returning
|
|
14
|
+
* human-readable warnings.
|
|
15
|
+
*
|
|
16
|
+
* Shared by OpenCode and the Pi-compatible Pi/OMP extension so the trust
|
|
17
|
+
* boundary is identical across every supported harness.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/** Hidden agents that run with elevated/autonomous capability. */
|
|
21
|
+
const HIDDEN_AGENT_KEYS = ["historian"] as const;
|
|
22
|
+
const HARNESS_KEYS = PER_HARNESS_MODEL_KEYS;
|
|
23
|
+
/** Every historian model-resolution field, including per-harness qualifiers.
|
|
24
|
+
* Variant and thinking_level merge onto the user's historian model at resolve
|
|
25
|
+
* time, so leaving them would let a cloned repo force extra spend. */
|
|
26
|
+
const HISTORIAN_USER_ONLY_FIELDS = PER_HARNESS_MIGRATION_INVENTORY.historian.migrated_execution;
|
|
27
|
+
const PROMPT_SURFACE_USER_ONLY_FIELDS = ["guidance_override_path", "tool_descriptions"] as const;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Fields on a hidden-agent block that constitute a privilege-escalation /
|
|
31
|
+
* code-execution vector when set from an untrusted repo:
|
|
32
|
+
*
|
|
33
|
+
* - `prompt` — reprograms the agent's instructions.
|
|
34
|
+
* - `permission` — broadens the agent's per-tool permissions.
|
|
35
|
+
* - `tools` — enable/disable map; could flip a denied tool (e.g. `bash`)
|
|
36
|
+
* on for an agent whose allow-list intentionally excludes it.
|
|
37
|
+
* Historian model selection stays USER-tier only, and compaction thresholds are
|
|
38
|
+
* project raise-only, so a cloned repo cannot force earlier compaction or extra
|
|
39
|
+
* historian spend on the user's dime.
|
|
40
|
+
*/
|
|
41
|
+
const AGENT_ESCALATION_FIELDS = ["prompt", "permission", "tools"] as const;
|
|
42
|
+
const PERCENTAGE_THRESHOLD_REASON =
|
|
43
|
+
"security: a repository may only raise compaction thresholds above the user's effective value; it cannot force earlier historian work or cloned-repo cost escalation.";
|
|
44
|
+
const TOKEN_THRESHOLD_REASON =
|
|
45
|
+
"security: a repository may only raise execute_threshold_tokens above the user's trusted token threshold; it cannot force earlier historian work or cloned-repo cost escalation.";
|
|
46
|
+
const TOKEN_THRESHOLD_INTRODUCTION_REASON =
|
|
47
|
+
"security: a repository cannot introduce a new execute_threshold_tokens override when the user has no trusted token threshold for that key; that could force earlier historian work or cloned-repo cost escalation.";
|
|
48
|
+
const PROTECTED_TOKENS_REASON =
|
|
49
|
+
"security: a repository may only raise protected_tokens above the resolved user-or-derived floor; it cannot lower protection.";
|
|
50
|
+
|
|
51
|
+
interface PercentageThresholdConfig {
|
|
52
|
+
defaultValue: number;
|
|
53
|
+
overrides: Map<string, number>;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
interface TokenThresholdConfig {
|
|
57
|
+
defaultValue: number | undefined;
|
|
58
|
+
overrides: Map<string, number>;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
62
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function resolveProtectedTokensScalar(value: unknown): number | undefined {
|
|
66
|
+
if (
|
|
67
|
+
typeof value === "number" &&
|
|
68
|
+
Number.isInteger(value) &&
|
|
69
|
+
value >= 4000 &&
|
|
70
|
+
value <= 1_000_000
|
|
71
|
+
) {
|
|
72
|
+
return value;
|
|
73
|
+
}
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface ProtectedTokensTierOverrides {
|
|
78
|
+
readonly user?: number;
|
|
79
|
+
readonly project?: number;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const PROTECTED_TOKENS_TIER_OVERRIDES = Symbol.for(
|
|
83
|
+
"@retaw106/mmc-oc/protected-tokens-tier-overrides",
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
type ConfigWithProtectedTokensTiers = {
|
|
87
|
+
[PROTECTED_TOKENS_TIER_OVERRIDES]?: ProtectedTokensTierOverrides;
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Retain trusted user and project values outside the public config schema until
|
|
92
|
+
* live context geometry is available. The symbol is non-enumerable so runtime
|
|
93
|
+
* provenance cannot leak into saved JSON or generated schema surfaces.
|
|
94
|
+
*/
|
|
95
|
+
export function attachProtectedTokensTierOverrides<T extends object>(
|
|
96
|
+
config: T,
|
|
97
|
+
args: { trustedUser: unknown; project: unknown },
|
|
98
|
+
): T {
|
|
99
|
+
const user = resolveProtectedTokensScalar(args.trustedUser);
|
|
100
|
+
const rawProject = resolveProtectedTokensScalar(args.project);
|
|
101
|
+
const project =
|
|
102
|
+
rawProject !== undefined && (user === undefined || rawProject >= user)
|
|
103
|
+
? rawProject
|
|
104
|
+
: undefined;
|
|
105
|
+
if (user === undefined && project === undefined) return config;
|
|
106
|
+
|
|
107
|
+
Object.defineProperty(config, PROTECTED_TOKENS_TIER_OVERRIDES, {
|
|
108
|
+
value: {
|
|
109
|
+
...(user !== undefined ? { user } : {}),
|
|
110
|
+
...(project !== undefined ? { project } : {}),
|
|
111
|
+
},
|
|
112
|
+
configurable: false,
|
|
113
|
+
enumerable: false,
|
|
114
|
+
writable: false,
|
|
115
|
+
});
|
|
116
|
+
return config;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function getProtectedTokensTierOverrides(
|
|
120
|
+
config: object,
|
|
121
|
+
): ProtectedTokensTierOverrides | undefined {
|
|
122
|
+
return (config as ConfigWithProtectedTokensTiers)[PROTECTED_TOKENS_TIER_OVERRIDES];
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function stripListedFields(
|
|
126
|
+
target: Record<string, unknown>,
|
|
127
|
+
fields: readonly string[],
|
|
128
|
+
path: string,
|
|
129
|
+
removed: string[],
|
|
130
|
+
): void {
|
|
131
|
+
for (const field of fields) {
|
|
132
|
+
if (field in target) {
|
|
133
|
+
delete target[field];
|
|
134
|
+
removed.push(path.length > 0 ? `${path}.${field}` : field);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Strip prompt, permission, tools, and system_prompt from one agent, harness,
|
|
140
|
+
* task, or model-entry object, including each fallback_models entry. A cloned
|
|
141
|
+
* repo must not reprogram hidden agents through any of those nestings. */
|
|
142
|
+
function stripEscalationAtExecutableSite(
|
|
143
|
+
block: Record<string, unknown>,
|
|
144
|
+
path: string,
|
|
145
|
+
removed: string[],
|
|
146
|
+
): void {
|
|
147
|
+
stripListedFields(block, AGENT_ESCALATION_FIELDS, path, removed);
|
|
148
|
+
if (isPlainObject(block.model)) {
|
|
149
|
+
stripListedFields(block.model, AGENT_ESCALATION_FIELDS, `${path}.model`, removed);
|
|
150
|
+
}
|
|
151
|
+
if (Array.isArray(block.fallback_models)) {
|
|
152
|
+
for (let index = 0; index < block.fallback_models.length; index++) {
|
|
153
|
+
const entry = block.fallback_models[index];
|
|
154
|
+
if (isPlainObject(entry)) {
|
|
155
|
+
stripListedFields(
|
|
156
|
+
entry,
|
|
157
|
+
AGENT_ESCALATION_FIELDS,
|
|
158
|
+
`${path}.fallback_models.${index}`,
|
|
159
|
+
removed,
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Must match the schema's execute_threshold_percentage range (20-90). A narrower
|
|
167
|
+
// range here let a valid project value of 81-90 skip the raise-only clamp and
|
|
168
|
+
// reach the merged config as-is, lowering a higher user threshold.
|
|
169
|
+
function isValidPercentageThreshold(value: unknown): value is number {
|
|
170
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 20 && value <= 90;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function isValidTokenThreshold(value: unknown): value is number {
|
|
174
|
+
return (
|
|
175
|
+
typeof value === "number" && Number.isFinite(value) && value >= 5_000 && value <= 2_000_000
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function normalizeTrustedPercentageThresholds(value: unknown): PercentageThresholdConfig {
|
|
180
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
181
|
+
return { defaultValue: value, overrides: new Map() };
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (
|
|
185
|
+
isPlainObject(value) &&
|
|
186
|
+
typeof value.default === "number" &&
|
|
187
|
+
Number.isFinite(value.default)
|
|
188
|
+
) {
|
|
189
|
+
const overrides = new Map<string, number>();
|
|
190
|
+
for (const [key, child] of Object.entries(value)) {
|
|
191
|
+
if (key === "default") continue;
|
|
192
|
+
if (typeof child === "number" && Number.isFinite(child)) {
|
|
193
|
+
overrides.set(key, child);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return { defaultValue: value.default, overrides };
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return { defaultValue: DEFAULT_EXECUTE_THRESHOLD_PERCENTAGE, overrides: new Map() };
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function normalizeTrustedTokenThresholds(value: unknown): TokenThresholdConfig {
|
|
203
|
+
if (!isPlainObject(value)) {
|
|
204
|
+
return { defaultValue: undefined, overrides: new Map() };
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
const overrides = new Map<string, number>();
|
|
208
|
+
for (const [key, child] of Object.entries(value)) {
|
|
209
|
+
if (key === "default") continue;
|
|
210
|
+
if (typeof child === "number" && Number.isFinite(child)) {
|
|
211
|
+
overrides.set(key, child);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return {
|
|
216
|
+
defaultValue:
|
|
217
|
+
typeof value.default === "number" && Number.isFinite(value.default)
|
|
218
|
+
? value.default
|
|
219
|
+
: undefined,
|
|
220
|
+
overrides,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function clonePercentageThresholds(value: PercentageThresholdConfig): PercentageThresholdConfig {
|
|
225
|
+
return {
|
|
226
|
+
defaultValue: value.defaultValue,
|
|
227
|
+
overrides: new Map(value.overrides),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function cloneTokenThresholds(value: TokenThresholdConfig): TokenThresholdConfig {
|
|
232
|
+
return {
|
|
233
|
+
defaultValue: value.defaultValue,
|
|
234
|
+
overrides: new Map(value.overrides),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function percentageThresholdsEqual(
|
|
239
|
+
left: PercentageThresholdConfig,
|
|
240
|
+
right: PercentageThresholdConfig,
|
|
241
|
+
): boolean {
|
|
242
|
+
if (left.defaultValue !== right.defaultValue) return false;
|
|
243
|
+
if (left.overrides.size !== right.overrides.size) return false;
|
|
244
|
+
for (const [key, value] of left.overrides) {
|
|
245
|
+
if (right.overrides.get(key) !== value) return false;
|
|
246
|
+
}
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function setMergedPercentageThreshold(
|
|
251
|
+
mergedRaw: Record<string, unknown>,
|
|
252
|
+
value: PercentageThresholdConfig,
|
|
253
|
+
): void {
|
|
254
|
+
if (value.overrides.size === 0) {
|
|
255
|
+
mergedRaw.execute_threshold_percentage = value.defaultValue;
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const serialized: Record<string, number> = { default: value.defaultValue };
|
|
260
|
+
for (const [key, threshold] of value.overrides) {
|
|
261
|
+
serialized[key] = threshold;
|
|
262
|
+
}
|
|
263
|
+
mergedRaw.execute_threshold_percentage = serialized;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function setMergedTokenThreshold(
|
|
267
|
+
mergedRaw: Record<string, unknown>,
|
|
268
|
+
value: TokenThresholdConfig,
|
|
269
|
+
): void {
|
|
270
|
+
if (value.defaultValue === undefined && value.overrides.size === 0) {
|
|
271
|
+
delete mergedRaw.execute_threshold_tokens;
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
const serialized: Record<string, number> = {};
|
|
276
|
+
if (value.defaultValue !== undefined) {
|
|
277
|
+
serialized.default = value.defaultValue;
|
|
278
|
+
}
|
|
279
|
+
for (const [key, threshold] of value.overrides) {
|
|
280
|
+
serialized[key] = threshold;
|
|
281
|
+
}
|
|
282
|
+
mergedRaw.execute_threshold_tokens = serialized;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
function makeProjectThresholdWarning(field: string, reason: string): string {
|
|
286
|
+
return `Ignoring ${field} from project config (${reason})`;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Strip unsafe fields from a raw PROJECT config IN PLACE, before it is merged
|
|
291
|
+
* over the user config. Returns warnings describing what was ignored.
|
|
292
|
+
*
|
|
293
|
+
* Closes:
|
|
294
|
+
* - `profiles` — profile definitions choose hidden-agent models and must stay
|
|
295
|
+
* in trusted user config; a repository may select a named profile but cannot
|
|
296
|
+
* supply its contents.
|
|
297
|
+
* - `auto_update` — a repo must not suppress plugin self-updates (which can
|
|
298
|
+
* carry security fixes).
|
|
299
|
+
* - `fail_closed_blocking` — a repo must not un-block (or force-block) the
|
|
300
|
+
* loud inoperability gate; only the user may restore silent degrade.
|
|
301
|
+
* - `debug_rpc` — a repo must not enable process heap capture or memory diagnostics.
|
|
302
|
+
* - `allow_home_project` — only the user may opt a home-directory session
|
|
303
|
+
* into a durable project identity.
|
|
304
|
+
* - `output_reserve` / `models.window_overlay_path` — only the user may change
|
|
305
|
+
* process-wide window geometry inputs.
|
|
306
|
+
* - `language`: a repo must not inject prompt text through a user preference.
|
|
307
|
+
* - `maintenance` — budgets, cooldowns, and anomaly thresholds of the
|
|
308
|
+
* automatic memory-maintenance task are user-level only; a cloned repo
|
|
309
|
+
* must not re-budget or re-arm an autonomous spend-capable task.
|
|
310
|
+
* - `sqlite` — `sqlite.cache_size_mb` / `mmap_size_mb` become PRAGMAs on the
|
|
311
|
+
* process-global shared DB handle (one connection across every project in the
|
|
312
|
+
* process). A cloned repo could set a huge value to exhaust host memory /
|
|
313
|
+
* address space — a resource-exhaustion vector with no legitimate per-repo
|
|
314
|
+
* use. Honor user-level config only.
|
|
315
|
+
* - `storage.enforce_private_permissions` — changing a shared store from
|
|
316
|
+
* owner-private to group-readable changes every session and memory's local
|
|
317
|
+
* confidentiality. Only the machine operator's user config may opt into an
|
|
318
|
+
* externally managed trusted-group deployment.
|
|
319
|
+
* - historian model-resolution fields (model, fallback_models, variant,
|
|
320
|
+
* thinking_level), including both per-harness blocks — historian model
|
|
321
|
+
* spend is user-level only. Qualifiers merge onto the user's historian
|
|
322
|
+
* model at resolve time, so a cloned repo cannot force extra thinking or
|
|
323
|
+
* variant cost.
|
|
324
|
+
* - `pi.subagent_extensions` — a cloned repo must not choose which extensions
|
|
325
|
+
* the user's Pi child processes load.
|
|
326
|
+
* - `prompt_surface.guidance_override_path` / `tool_descriptions` — a repository
|
|
327
|
+
* may select a reviewed preset, but must not inject arbitrary guidance or tool
|
|
328
|
+
* description text into the user's provider-visible prompt.
|
|
329
|
+
* - hidden-agent `prompt`/`permission`/`tools`/`system_prompt` at the agent
|
|
330
|
+
* root, each harness block, each task block, and inside model/fallback
|
|
331
|
+
* entry objects — a repo must not reprogram or re-permission hidden agents.
|
|
332
|
+
*/
|
|
333
|
+
export function stripUnsafeProjectConfigFields(projectRaw: Record<string, unknown>): string[] {
|
|
334
|
+
const warnings: string[] = [];
|
|
335
|
+
|
|
336
|
+
if ("profiles" in projectRaw) {
|
|
337
|
+
delete projectRaw.profiles;
|
|
338
|
+
warnings.push(
|
|
339
|
+
"Ignoring profiles from project config (security: profile definitions are user-level only; a repository may select a named user profile with profile).",
|
|
340
|
+
);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
if ("auto_update" in projectRaw) {
|
|
344
|
+
delete projectRaw.auto_update;
|
|
345
|
+
warnings.push(
|
|
346
|
+
"Ignoring auto_update from project config (security: this setting only honors user-level config).",
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
if ("fail_closed_blocking" in projectRaw) {
|
|
351
|
+
delete projectRaw.fail_closed_blocking;
|
|
352
|
+
warnings.push(
|
|
353
|
+
"Ignoring fail_closed_blocking from project config (security: only user-level config may disable or force the loud inoperability gate).",
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
if ("debug_rpc" in projectRaw) {
|
|
358
|
+
delete projectRaw.debug_rpc;
|
|
359
|
+
warnings.push(
|
|
360
|
+
"Ignoring debug_rpc from project config (security: only user-level config may enable process heap diagnostics).",
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
if ("allow_home_project" in projectRaw) {
|
|
365
|
+
delete projectRaw.allow_home_project;
|
|
366
|
+
warnings.push(
|
|
367
|
+
"Ignoring allow_home_project from project config (security: only user-level config may opt the user's home directory into Magic Context).",
|
|
368
|
+
);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// compaction.enabled is USER-tier only: a cloned repo must never silently
|
|
372
|
+
// disable the user's context management (it changes how the window is
|
|
373
|
+
// owned and interacts with native compaction state). Field-scoped, not
|
|
374
|
+
// block-scoped: a sibling key in a project `compaction` block survives the
|
|
375
|
+
// strip, so a future project-tier compaction knob can still land.
|
|
376
|
+
const compaction = projectRaw.compaction;
|
|
377
|
+
if (isPlainObject(compaction) && "enabled" in compaction) {
|
|
378
|
+
delete compaction.enabled;
|
|
379
|
+
warnings.push(
|
|
380
|
+
"Ignoring compaction.enabled from project config (security: only user-level config may disable Magic Context's context-window management; a cloned repo cannot change how the user's window is owned).",
|
|
381
|
+
);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// maintenance.* is USER-tier only (memory-maintenance plan decision 27).
|
|
385
|
+
// The group budgets an autonomous, spend-capable task. Unlike
|
|
386
|
+
// compaction.enabled (field-scoped so a future project-tier compaction
|
|
387
|
+
// knob can land), EVERY key in this group is user-only, so the whole
|
|
388
|
+
// block is stripped: a cloned repo must not raise run budgets, relax
|
|
389
|
+
// cooldowns/backoff, or loosen the anomaly guard to weaponize the
|
|
390
|
+
// maintenance task (cost escalation or a mass-archive cover).
|
|
391
|
+
if ("maintenance" in projectRaw) {
|
|
392
|
+
delete projectRaw.maintenance;
|
|
393
|
+
warnings.push(
|
|
394
|
+
"Ignoring maintenance from project config (security: automatic memory maintenance budgets, cooldowns, and anomaly thresholds are user-level only; a cloned repo cannot re-budget or re-arm the maintenance task).",
|
|
395
|
+
);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
if ("output_reserve" in projectRaw) {
|
|
399
|
+
delete projectRaw.output_reserve;
|
|
400
|
+
warnings.push(
|
|
401
|
+
"Ignoring output_reserve from project config (security: output-token reservation only honors user-level config).",
|
|
402
|
+
);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
const models = projectRaw.models;
|
|
406
|
+
if (isPlainObject(models) && "window_overlay_path" in models) {
|
|
407
|
+
delete models.window_overlay_path;
|
|
408
|
+
warnings.push(
|
|
409
|
+
"Ignoring models.window_overlay_path from project config (security: only user-level config may select model geometry metadata).",
|
|
410
|
+
);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
if ("language" in projectRaw) {
|
|
414
|
+
delete projectRaw.language;
|
|
415
|
+
warnings.push(
|
|
416
|
+
"Ignoring language from project config (security: output language is a user-level setting).",
|
|
417
|
+
);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
if ("sqlite" in projectRaw) {
|
|
421
|
+
delete projectRaw.sqlite;
|
|
422
|
+
warnings.push(
|
|
423
|
+
"Ignoring sqlite.* from project config (security: SQLite cache/mmap PRAGMAs apply to the " +
|
|
424
|
+
"process-global shared database handle; only user-level config may set them).",
|
|
425
|
+
);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// storage.enforce_private_permissions is USER-tier only because disabling it
|
|
429
|
+
// changes the confidentiality of the process-global shared store. Field-scoped
|
|
430
|
+
// stripping preserves future project-tier storage settings in the same block.
|
|
431
|
+
const storage = projectRaw.storage;
|
|
432
|
+
if (isPlainObject(storage) && "enforce_private_permissions" in storage) {
|
|
433
|
+
delete storage.enforce_private_permissions;
|
|
434
|
+
warnings.push(
|
|
435
|
+
"Ignoring storage.enforce_private_permissions from project config (security: only user-level config may opt into externally managed shared storage permissions).",
|
|
436
|
+
);
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// Repositories may select preset routing, but project settings cannot add
|
|
440
|
+
// guidance or tool-description text to the provider-visible prompt; those
|
|
441
|
+
// user-only fields are removed before project settings are merged.
|
|
442
|
+
const promptSurface = projectRaw.prompt_surface;
|
|
443
|
+
if (isPlainObject(promptSurface)) {
|
|
444
|
+
const removed: string[] = [];
|
|
445
|
+
for (const field of PROMPT_SURFACE_USER_ONLY_FIELDS) {
|
|
446
|
+
if (field in promptSurface) {
|
|
447
|
+
delete promptSurface[field];
|
|
448
|
+
removed.push(field);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
if (removed.length > 0) {
|
|
452
|
+
warnings.push(
|
|
453
|
+
`Ignoring prompt_surface.${removed.join("/")} from project config (security: repositories may select prompt presets but only user config may provide guidance or tool-description text).`,
|
|
454
|
+
);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
const pi = projectRaw.pi;
|
|
459
|
+
if (isPlainObject(pi) && "subagent_extensions" in pi) {
|
|
460
|
+
delete pi.subagent_extensions;
|
|
461
|
+
warnings.push(
|
|
462
|
+
"Ignoring pi.subagent_extensions from project config (security: only user-level config may choose extensions loaded by Pi subagent children).",
|
|
463
|
+
);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
for (const agentKey of HIDDEN_AGENT_KEYS) {
|
|
467
|
+
const block = projectRaw[agentKey];
|
|
468
|
+
if (!isPlainObject(block)) continue;
|
|
469
|
+
const removed: string[] = [];
|
|
470
|
+
stripEscalationAtExecutableSite(block, agentKey, removed);
|
|
471
|
+
for (const harness of HARNESS_KEYS) {
|
|
472
|
+
const harnessBlock = block[harness];
|
|
473
|
+
if (!isPlainObject(harnessBlock)) continue;
|
|
474
|
+
stripEscalationAtExecutableSite(harnessBlock, `${agentKey}.${harness}`, removed);
|
|
475
|
+
const tasks = harnessBlock.tasks;
|
|
476
|
+
if (isPlainObject(tasks)) {
|
|
477
|
+
for (const [taskName, taskBlock] of Object.entries(tasks)) {
|
|
478
|
+
if (isPlainObject(taskBlock)) {
|
|
479
|
+
stripEscalationAtExecutableSite(
|
|
480
|
+
taskBlock,
|
|
481
|
+
`${agentKey}.${harness}.tasks.${taskName}`,
|
|
482
|
+
removed,
|
|
483
|
+
);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
const schedulingTasks = block.tasks;
|
|
489
|
+
if (isPlainObject(schedulingTasks)) {
|
|
490
|
+
for (const [taskName, taskBlock] of Object.entries(schedulingTasks)) {
|
|
491
|
+
if (isPlainObject(taskBlock)) {
|
|
492
|
+
stripListedFields(
|
|
493
|
+
taskBlock,
|
|
494
|
+
AGENT_ESCALATION_FIELDS,
|
|
495
|
+
`${agentKey}.tasks.${taskName}`,
|
|
496
|
+
removed,
|
|
497
|
+
);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
if (removed.length > 0) {
|
|
502
|
+
warnings.push(
|
|
503
|
+
`Ignoring ${removed.join(", ")} from project config ` +
|
|
504
|
+
"(security: a repository cannot reprogram or re-permission hidden agents).",
|
|
505
|
+
);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
const historian = projectRaw.historian;
|
|
510
|
+
if (isPlainObject(historian)) {
|
|
511
|
+
const removed: string[] = [];
|
|
512
|
+
for (const field of HISTORIAN_USER_ONLY_FIELDS) {
|
|
513
|
+
if (field in historian) {
|
|
514
|
+
delete historian[field];
|
|
515
|
+
removed.push(field);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
for (const harness of HARNESS_KEYS) {
|
|
519
|
+
const harnessBlock = historian[harness];
|
|
520
|
+
if (!isPlainObject(harnessBlock)) continue;
|
|
521
|
+
for (const field of HISTORIAN_USER_ONLY_FIELDS) {
|
|
522
|
+
if (field in harnessBlock) {
|
|
523
|
+
delete harnessBlock[field];
|
|
524
|
+
removed.push(`${harness}.${field}`);
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
if (removed.length > 0) {
|
|
529
|
+
warnings.push(
|
|
530
|
+
`Ignoring ${removed.map((path) => `historian.${path}`).join(", ")} from project config ` +
|
|
531
|
+
"(security: historian model selection is user-level only; a repository cannot force extra compaction cost).",
|
|
532
|
+
);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
return warnings;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
/**
|
|
540
|
+
* Clamp project-tier compaction thresholds after merge so a cloned repository
|
|
541
|
+
* may only DELAY compaction relative to the trusted user/default settings. A
|
|
542
|
+
* repo may never lower thresholds in a way that forces earlier historian work
|
|
543
|
+
* or cloned-repo cost escalation on the user's account.
|
|
544
|
+
*/
|
|
545
|
+
export function constrainProjectThresholdOverrides(args: {
|
|
546
|
+
mergedRaw: Record<string, unknown>;
|
|
547
|
+
projectRaw: Record<string, unknown>;
|
|
548
|
+
trustedBaseConfig: {
|
|
549
|
+
execute_threshold_percentage?: unknown;
|
|
550
|
+
execute_threshold_tokens?: unknown;
|
|
551
|
+
protected_tokens?: unknown;
|
|
552
|
+
};
|
|
553
|
+
}): string[] {
|
|
554
|
+
const warnings: string[] = [];
|
|
555
|
+
const basePercentage = normalizeTrustedPercentageThresholds(
|
|
556
|
+
args.trustedBaseConfig.execute_threshold_percentage,
|
|
557
|
+
);
|
|
558
|
+
const baseTokens = normalizeTrustedTokenThresholds(
|
|
559
|
+
args.trustedBaseConfig.execute_threshold_tokens,
|
|
560
|
+
);
|
|
561
|
+
|
|
562
|
+
if ("execute_threshold_percentage" in args.projectRaw) {
|
|
563
|
+
const projectValue = args.projectRaw.execute_threshold_percentage;
|
|
564
|
+
|
|
565
|
+
if (isValidPercentageThreshold(projectValue)) {
|
|
566
|
+
const constrained = clonePercentageThresholds(basePercentage);
|
|
567
|
+
constrained.defaultValue = Math.max(basePercentage.defaultValue, projectValue);
|
|
568
|
+
for (const [modelKey, threshold] of basePercentage.overrides) {
|
|
569
|
+
const raisedThreshold = Math.max(threshold, projectValue);
|
|
570
|
+
if (raisedThreshold === constrained.defaultValue) {
|
|
571
|
+
constrained.overrides.delete(modelKey);
|
|
572
|
+
} else {
|
|
573
|
+
constrained.overrides.set(modelKey, raisedThreshold);
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
setMergedPercentageThreshold(args.mergedRaw, constrained);
|
|
577
|
+
if (percentageThresholdsEqual(constrained, basePercentage)) {
|
|
578
|
+
warnings.push(
|
|
579
|
+
makeProjectThresholdWarning(
|
|
580
|
+
"execute_threshold_percentage",
|
|
581
|
+
PERCENTAGE_THRESHOLD_REASON,
|
|
582
|
+
),
|
|
583
|
+
);
|
|
584
|
+
}
|
|
585
|
+
} else if (isPlainObject(projectValue)) {
|
|
586
|
+
const constrained = clonePercentageThresholds(basePercentage);
|
|
587
|
+
let touchedValidEntry = false;
|
|
588
|
+
|
|
589
|
+
if (isValidPercentageThreshold(projectValue.default)) {
|
|
590
|
+
touchedValidEntry = true;
|
|
591
|
+
if (projectValue.default > basePercentage.defaultValue) {
|
|
592
|
+
constrained.defaultValue = projectValue.default;
|
|
593
|
+
} else {
|
|
594
|
+
warnings.push(
|
|
595
|
+
makeProjectThresholdWarning(
|
|
596
|
+
"execute_threshold_percentage.default",
|
|
597
|
+
PERCENTAGE_THRESHOLD_REASON,
|
|
598
|
+
),
|
|
599
|
+
);
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
for (const [modelKey, rawValue] of Object.entries(projectValue)) {
|
|
604
|
+
if (modelKey === "default") continue;
|
|
605
|
+
if (!isValidPercentageThreshold(rawValue)) continue;
|
|
606
|
+
touchedValidEntry = true;
|
|
607
|
+
const baseValue =
|
|
608
|
+
basePercentage.overrides.get(modelKey) ?? basePercentage.defaultValue;
|
|
609
|
+
if (rawValue > baseValue) {
|
|
610
|
+
if (rawValue === constrained.defaultValue) {
|
|
611
|
+
constrained.overrides.delete(modelKey);
|
|
612
|
+
} else {
|
|
613
|
+
constrained.overrides.set(modelKey, rawValue);
|
|
614
|
+
}
|
|
615
|
+
} else {
|
|
616
|
+
warnings.push(
|
|
617
|
+
makeProjectThresholdWarning(
|
|
618
|
+
`execute_threshold_percentage.${modelKey}`,
|
|
619
|
+
PERCENTAGE_THRESHOLD_REASON,
|
|
620
|
+
),
|
|
621
|
+
);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
if (touchedValidEntry) {
|
|
626
|
+
setMergedPercentageThreshold(args.mergedRaw, constrained);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
if (
|
|
632
|
+
"execute_threshold_tokens" in args.projectRaw &&
|
|
633
|
+
isPlainObject(args.projectRaw.execute_threshold_tokens)
|
|
634
|
+
) {
|
|
635
|
+
const projectValue = args.projectRaw.execute_threshold_tokens;
|
|
636
|
+
const constrained = cloneTokenThresholds(baseTokens);
|
|
637
|
+
let touchedValidEntry = false;
|
|
638
|
+
|
|
639
|
+
if (isValidTokenThreshold(projectValue.default)) {
|
|
640
|
+
touchedValidEntry = true;
|
|
641
|
+
if (baseTokens.defaultValue === undefined) {
|
|
642
|
+
warnings.push(
|
|
643
|
+
makeProjectThresholdWarning(
|
|
644
|
+
"execute_threshold_tokens.default",
|
|
645
|
+
TOKEN_THRESHOLD_INTRODUCTION_REASON,
|
|
646
|
+
),
|
|
647
|
+
);
|
|
648
|
+
} else if (projectValue.default > baseTokens.defaultValue) {
|
|
649
|
+
constrained.defaultValue = projectValue.default;
|
|
650
|
+
} else {
|
|
651
|
+
warnings.push(
|
|
652
|
+
makeProjectThresholdWarning(
|
|
653
|
+
"execute_threshold_tokens.default",
|
|
654
|
+
TOKEN_THRESHOLD_REASON,
|
|
655
|
+
),
|
|
656
|
+
);
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
for (const [modelKey, rawValue] of Object.entries(projectValue)) {
|
|
661
|
+
if (modelKey === "default") continue;
|
|
662
|
+
if (!isValidTokenThreshold(rawValue)) continue;
|
|
663
|
+
touchedValidEntry = true;
|
|
664
|
+
const baseValue = baseTokens.overrides.get(modelKey) ?? baseTokens.defaultValue;
|
|
665
|
+
if (baseValue === undefined) {
|
|
666
|
+
warnings.push(
|
|
667
|
+
makeProjectThresholdWarning(
|
|
668
|
+
`execute_threshold_tokens.${modelKey}`,
|
|
669
|
+
TOKEN_THRESHOLD_INTRODUCTION_REASON,
|
|
670
|
+
),
|
|
671
|
+
);
|
|
672
|
+
continue;
|
|
673
|
+
}
|
|
674
|
+
if (rawValue > baseValue) {
|
|
675
|
+
if (rawValue === constrained.defaultValue) {
|
|
676
|
+
constrained.overrides.delete(modelKey);
|
|
677
|
+
} else {
|
|
678
|
+
constrained.overrides.set(modelKey, rawValue);
|
|
679
|
+
}
|
|
680
|
+
} else {
|
|
681
|
+
warnings.push(
|
|
682
|
+
makeProjectThresholdWarning(
|
|
683
|
+
`execute_threshold_tokens.${modelKey}`,
|
|
684
|
+
TOKEN_THRESHOLD_REASON,
|
|
685
|
+
),
|
|
686
|
+
);
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
if (touchedValidEntry) {
|
|
691
|
+
setMergedTokenThreshold(args.mergedRaw, constrained);
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
|
|
695
|
+
if ("protected_tokens" in args.projectRaw) {
|
|
696
|
+
const rawProject = args.projectRaw.protected_tokens;
|
|
697
|
+
const projectVal = resolveProtectedTokensScalar(rawProject);
|
|
698
|
+
const trustedUserVal = resolveProtectedTokensScalar(
|
|
699
|
+
args.trustedBaseConfig.protected_tokens,
|
|
700
|
+
);
|
|
701
|
+
|
|
702
|
+
if (projectVal !== undefined) {
|
|
703
|
+
if (trustedUserVal !== undefined) {
|
|
704
|
+
if (projectVal >= trustedUserVal) {
|
|
705
|
+
args.mergedRaw.protected_tokens = projectVal;
|
|
706
|
+
} else {
|
|
707
|
+
args.mergedRaw.protected_tokens = trustedUserVal;
|
|
708
|
+
warnings.push(
|
|
709
|
+
makeProjectThresholdWarning("protected_tokens", PROTECTED_TOKENS_REASON),
|
|
710
|
+
);
|
|
711
|
+
}
|
|
712
|
+
} else {
|
|
713
|
+
args.mergedRaw.protected_tokens = projectVal;
|
|
714
|
+
}
|
|
715
|
+
} else {
|
|
716
|
+
if (trustedUserVal !== undefined) {
|
|
717
|
+
args.mergedRaw.protected_tokens = trustedUserVal;
|
|
718
|
+
} else {
|
|
719
|
+
delete args.mergedRaw.protected_tokens;
|
|
720
|
+
}
|
|
721
|
+
warnings.push(makeProjectThresholdWarning("protected_tokens", PROTECTED_TOKENS_REASON));
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
return warnings;
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
/** Path of a schema issue in the merged raw config, e.g. ["compaction", "enabled"]. */
|
|
729
|
+
export type ConfigIssuePath = readonly PropertyKey[];
|
|
730
|
+
|
|
731
|
+
/**
|
|
732
|
+
* Shortest prefix of `issuePath` whose value the PROJECT tier supplied, or
|
|
733
|
+
* undefined when the invalid value did not come from the project. The raw merge
|
|
734
|
+
* recurses only into plain objects on both sides, so the project owns the value
|
|
735
|
+
* at the first prefix where its node is not a plain object (a scalar, array or
|
|
736
|
+
* null replaces the user's value whole), or at the full issue path.
|
|
737
|
+
*/
|
|
738
|
+
function projectContributionPath(
|
|
739
|
+
projectRaw: Record<string, unknown>,
|
|
740
|
+
issuePath: ConfigIssuePath,
|
|
741
|
+
): ConfigIssuePath | undefined {
|
|
742
|
+
let node: unknown = projectRaw;
|
|
743
|
+
for (let index = 0; index < issuePath.length; index++) {
|
|
744
|
+
const segment = String(issuePath[index]);
|
|
745
|
+
if (!isPlainObject(node) || !Object.hasOwn(node, segment)) return undefined;
|
|
746
|
+
node = node[segment];
|
|
747
|
+
if (index === issuePath.length - 1 || !isPlainObject(node)) {
|
|
748
|
+
return issuePath.slice(0, index + 1);
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
return undefined;
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
/**
|
|
755
|
+
* The trusted value the project displaced along `contribution`, and where it
|
|
756
|
+
* sits. Walking down, the first trusted node that is not a plain object was
|
|
757
|
+
* replaced whole by the project's object (e.g. a user scalar threshold of 80
|
|
758
|
+
* under a project `{ default: 5 }`), so it is restored at that shorter path.
|
|
759
|
+
* Undefined when the trusted tier has no value there to protect.
|
|
760
|
+
*/
|
|
761
|
+
function displacedTrustedValue(
|
|
762
|
+
trustedRaw: Record<string, unknown>,
|
|
763
|
+
contribution: ConfigIssuePath,
|
|
764
|
+
): { path: ConfigIssuePath; value: unknown } | undefined {
|
|
765
|
+
let node: unknown = trustedRaw;
|
|
766
|
+
for (let index = 0; index < contribution.length; index++) {
|
|
767
|
+
const segment = String(contribution[index]);
|
|
768
|
+
if (!isPlainObject(node) || !Object.hasOwn(node, segment)) return undefined;
|
|
769
|
+
node = node[segment];
|
|
770
|
+
if (index === contribution.length - 1 || !isPlainObject(node)) {
|
|
771
|
+
return { path: contribution.slice(0, index + 1), value: node };
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
return undefined;
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
function defineOwnValue(target: Record<string, unknown>, key: string, value: unknown): void {
|
|
778
|
+
Object.defineProperty(target, key, {
|
|
779
|
+
value,
|
|
780
|
+
enumerable: true,
|
|
781
|
+
configurable: true,
|
|
782
|
+
writable: true,
|
|
783
|
+
});
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
/** Put `value` at `path` in `root`, copying each object on the way so objects
|
|
787
|
+
* shared with the trusted or project raw configs are never mutated. */
|
|
788
|
+
function writeOwnPath(root: Record<string, unknown>, path: ConfigIssuePath, value: unknown): void {
|
|
789
|
+
let node = root;
|
|
790
|
+
for (let index = 0; index < path.length - 1; index++) {
|
|
791
|
+
const segment = String(path[index]);
|
|
792
|
+
const child = node[segment];
|
|
793
|
+
if (!isPlainObject(child)) return;
|
|
794
|
+
const copy = { ...child };
|
|
795
|
+
defineOwnValue(node, segment, copy);
|
|
796
|
+
node = copy;
|
|
797
|
+
}
|
|
798
|
+
defineOwnValue(node, String(path[path.length - 1]), value);
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
/** Most rounds a single load can take; each round restores at least one path. */
|
|
802
|
+
const MAX_PROJECT_RESTORE_ROUNDS = 16;
|
|
803
|
+
|
|
804
|
+
/**
|
|
805
|
+
* After the project config is merged over the trusted (user + profile) config,
|
|
806
|
+
* put back the trusted value wherever an INVALID project value displaced it.
|
|
807
|
+
*
|
|
808
|
+
* Without this, a repository could reset user settings by writing a wrong type:
|
|
809
|
+
* `compaction: false` replaces the user's `compaction` block in the raw merge,
|
|
810
|
+
* the schema rejects it, and schema recovery drops the key and uses the schema
|
|
811
|
+
* default, so compaction turns back on, the historian loses its model, or the
|
|
812
|
+
* embedding provider flips and forces a full re-embed. A repository may only
|
|
813
|
+
* tighten what the user configured, so an invalid project value is ignored and
|
|
814
|
+
* the user's value stays. When the user has no value at that path, the project
|
|
815
|
+
* value is left for normal schema recovery, which already lands on the default
|
|
816
|
+
* the user would get anyway.
|
|
817
|
+
*
|
|
818
|
+
* `collectIssuePaths` runs the caller's own pre-schema migrations and schema
|
|
819
|
+
* check and returns every issue path (empty when the config is valid), so this
|
|
820
|
+
* stays aligned with the loader's real parse on every harness. `mergedRaw` is
|
|
821
|
+
* mutated in place.
|
|
822
|
+
*/
|
|
823
|
+
export function restoreTrustedValuesOverInvalidProjectValues(args: {
|
|
824
|
+
mergedRaw: Record<string, unknown>;
|
|
825
|
+
trustedRaw: Record<string, unknown>;
|
|
826
|
+
projectRaw: Record<string, unknown>;
|
|
827
|
+
collectIssuePaths: (raw: Record<string, unknown>) => readonly ConfigIssuePath[];
|
|
828
|
+
}): { warnings: string[]; restoredTopLevelKeys: string[] } {
|
|
829
|
+
const warnings: string[] = [];
|
|
830
|
+
const restoredTopLevelKeys = new Set<string>();
|
|
831
|
+
const restored = new Set<string>();
|
|
832
|
+
|
|
833
|
+
for (let round = 0; round < MAX_PROJECT_RESTORE_ROUNDS; round++) {
|
|
834
|
+
let changed = false;
|
|
835
|
+
for (const issuePath of args.collectIssuePaths(args.mergedRaw)) {
|
|
836
|
+
const contribution = projectContributionPath(args.projectRaw, issuePath);
|
|
837
|
+
if (contribution === undefined || contribution.length === 0) continue;
|
|
838
|
+
const trusted = displacedTrustedValue(args.trustedRaw, contribution);
|
|
839
|
+
if (trusted === undefined) continue;
|
|
840
|
+
const key = trusted.path.map(String).join(".");
|
|
841
|
+
// Already restored: any remaining issue there is in the user's own
|
|
842
|
+
// value, which normal schema recovery handles.
|
|
843
|
+
if (restored.has(key)) continue;
|
|
844
|
+
writeOwnPath(args.mergedRaw, trusted.path, trusted.value);
|
|
845
|
+
restored.add(key);
|
|
846
|
+
restoredTopLevelKeys.add(String(trusted.path[0]));
|
|
847
|
+
changed = true;
|
|
848
|
+
warnings.push(
|
|
849
|
+
`Ignoring invalid ${key} from project config and keeping the user-level value (security: a repository cannot reset user settings by supplying an invalid value).`,
|
|
850
|
+
);
|
|
851
|
+
}
|
|
852
|
+
if (!changed) break;
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
return { warnings, restoredTopLevelKeys: [...restoredTopLevelKeys] };
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
const PROJECT_COMMAND_STRING_FIELDS = ["description", "agent", "model"] as const;
|
|
859
|
+
|
|
860
|
+
/** A well-formed command entry with only the fields the command config uses. */
|
|
861
|
+
function wellFormedCommand(value: unknown): Record<string, unknown> | undefined {
|
|
862
|
+
if (!isPlainObject(value)) return undefined;
|
|
863
|
+
if (typeof value.template !== "string" || value.template.trim().length === 0) return undefined;
|
|
864
|
+
const command: Record<string, unknown> = { template: value.template };
|
|
865
|
+
for (const field of PROJECT_COMMAND_STRING_FIELDS) {
|
|
866
|
+
if (value[field] === undefined) continue;
|
|
867
|
+
if (typeof value[field] !== "string") return undefined;
|
|
868
|
+
command[field] = value[field];
|
|
869
|
+
}
|
|
870
|
+
if (value.subtask !== undefined) {
|
|
871
|
+
if (typeof value.subtask !== "boolean") return undefined;
|
|
872
|
+
command.subtask = value.subtask;
|
|
873
|
+
}
|
|
874
|
+
return command;
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
/**
|
|
878
|
+
* Rebuild the merged `command` block so a repository may only ADD commands.
|
|
879
|
+
*
|
|
880
|
+
* The command block is not part of the schema; it is copied into the host's
|
|
881
|
+
* command config after Magic Context's built-in commands. Merged as raw
|
|
882
|
+
* config, a project could replace a command the user defined, shadow a
|
|
883
|
+
* built-in /mmc-* command, wipe the user's commands with a non-object value,
|
|
884
|
+
* or pass malformed entries to the host. Now the user's commands are kept as
|
|
885
|
+
* they are, and a project entry is used only when it is well formed and its
|
|
886
|
+
* name is neither a user command nor one of `reservedNames`. `mergedRaw` is
|
|
887
|
+
* mutated in place.
|
|
888
|
+
*/
|
|
889
|
+
export function constrainProjectCommands(args: {
|
|
890
|
+
mergedRaw: Record<string, unknown>;
|
|
891
|
+
trustedRaw: Record<string, unknown>;
|
|
892
|
+
projectRaw: Record<string, unknown>;
|
|
893
|
+
reservedNames: readonly string[];
|
|
894
|
+
}): string[] {
|
|
895
|
+
if (!("command" in args.projectRaw)) return [];
|
|
896
|
+
const warnings: string[] = [];
|
|
897
|
+
const trustedCommands = isPlainObject(args.trustedRaw.command)
|
|
898
|
+
? args.trustedRaw.command
|
|
899
|
+
: undefined;
|
|
900
|
+
const merged: Record<string, unknown> = { ...(trustedCommands ?? {}) };
|
|
901
|
+
const projectCommands = args.projectRaw.command;
|
|
902
|
+
|
|
903
|
+
if (!isPlainObject(projectCommands)) {
|
|
904
|
+
warnings.push(
|
|
905
|
+
"Ignoring command from project config (it must be an object of named commands).",
|
|
906
|
+
);
|
|
907
|
+
} else {
|
|
908
|
+
for (const [name, value] of Object.entries(projectCommands)) {
|
|
909
|
+
if (trustedCommands && Object.hasOwn(trustedCommands, name)) {
|
|
910
|
+
warnings.push(
|
|
911
|
+
`Ignoring command.${name} from project config (security: a repository cannot replace a command defined in user config).`,
|
|
912
|
+
);
|
|
913
|
+
continue;
|
|
914
|
+
}
|
|
915
|
+
if (args.reservedNames.includes(name)) {
|
|
916
|
+
warnings.push(
|
|
917
|
+
`Ignoring command.${name} from project config (security: a repository cannot replace a built-in Magic Context command).`,
|
|
918
|
+
);
|
|
919
|
+
continue;
|
|
920
|
+
}
|
|
921
|
+
const command = wellFormedCommand(value);
|
|
922
|
+
if (!command) {
|
|
923
|
+
warnings.push(
|
|
924
|
+
`Ignoring command.${name} from project config (it needs a non-empty string template; description, agent and model must be strings and subtask a boolean).`,
|
|
925
|
+
);
|
|
926
|
+
continue;
|
|
927
|
+
}
|
|
928
|
+
Object.defineProperty(merged, name, {
|
|
929
|
+
value: command,
|
|
930
|
+
enumerable: true,
|
|
931
|
+
configurable: true,
|
|
932
|
+
writable: true,
|
|
933
|
+
});
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
if (Object.keys(merged).length === 0) delete args.mergedRaw.command;
|
|
938
|
+
else args.mergedRaw.command = merged;
|
|
939
|
+
return warnings;
|
|
940
|
+
}
|