codetrellis 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +27 -2
- package/bin/codetrellis.mjs +4 -0
- package/package.json +43 -4
- package/reader/material-reader.mjs +130346 -0
- package/resources/tree-sitter/README.md +150 -0
- package/resources/tree-sitter/tree-sitter-c-sharp.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-go.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-java.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-javascript.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-kotlin.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-php.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-python.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-ruby.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-rust.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-swift.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-tsx.wasm +0 -0
- package/resources/tree-sitter/tree-sitter-typescript.wasm +0 -0
- package/resources/tree-sitter/tree-sitter.wasm +0 -0
- package/src/backend/agent/claude-code-watcher.js +270 -0
- package/src/backend/index.js +8 -0
- package/src/backend/lib/sha256-file.js +39 -0
- package/src/backend/lib/zip-entries.js +98 -0
- package/src/backend/lifecycle.js +102 -0
- package/src/backend/mcp/binding-headers.js +54 -0
- package/src/backend/mcp/client-identity.js +44 -0
- package/src/backend/mcp/connector/command.js +110 -0
- package/src/backend/mcp/connector/core.js +278 -0
- package/src/backend/mcp/connector/files.js +121 -0
- package/src/backend/mcp/connector/hook.js +284 -0
- package/src/backend/mcp/connector/main.js +126 -0
- package/src/backend/mcp/connector/sse-upstream.js +152 -0
- package/src/backend/mcp/helpers.js +43 -0
- package/src/backend/mcp/prompt-builders.js +104 -0
- package/src/backend/mcp/resources.js +197 -0
- package/src/backend/mcp/server.js +813 -0
- package/src/backend/mcp/skill-guide.js +1528 -0
- package/src/backend/mcp/tools/architecture-tools.js +273 -0
- package/src/backend/mcp/tools/audio-tools.js +117 -0
- package/src/backend/mcp/tools/awareness-tools.js +623 -0
- package/src/backend/mcp/tools/budget-tools.js +185 -0
- package/src/backend/mcp/tools/channel-tools.js +205 -0
- package/src/backend/mcp/tools/contribution-tools.js +181 -0
- package/src/backend/mcp/tools/drift-tools.js +252 -0
- package/src/backend/mcp/tools/git-tools.js +316 -0
- package/src/backend/mcp/tools/governance-tools.js +175 -0
- package/src/backend/mcp/tools/graph-tools.js +181 -0
- package/src/backend/mcp/tools/intake-tools.js +244 -0
- package/src/backend/mcp/tools/mobile-tools.js +118 -0
- package/src/backend/mcp/tools/peer-tools.js +330 -0
- package/src/backend/mcp/tools/plan-item-tools.js +1601 -0
- package/src/backend/mcp/tools/plan-tools.js +680 -0
- package/src/backend/mcp/tools/presence-tools.js +185 -0
- package/src/backend/mcp/tools/project-config-tools.js +150 -0
- package/src/backend/mcp/tools/review-tools.js +172 -0
- package/src/backend/mcp/tools/session-tools.js +554 -0
- package/src/backend/mcp/tools/system-docs-tools.js +168 -0
- package/src/backend/mcp/tools/terminal-tools.js +186 -0
- package/src/backend/mcp/tools/test-tools.js +117 -0
- package/src/backend/mcp/tools/ui-tools.js +356 -0
- package/src/backend/mcp/types.js +15 -0
- package/src/backend/middleware/local-auth.js +116 -0
- package/src/backend/server.js +5951 -0
- package/src/backend/services/agent-event-log.js +350 -0
- package/src/backend/services/architecture-rule.js +584 -0
- package/src/backend/services/architecture-rules.js +275 -0
- package/src/backend/services/artefact-content-service.js +181 -0
- package/src/backend/services/artefact-service.js +305 -0
- package/src/backend/services/artefact-watcher.js +167 -0
- package/src/backend/services/ast-parser.js +327 -0
- package/src/backend/services/audio-buffer-service.js +152 -0
- package/src/backend/services/awareness-notices.js +139 -0
- package/src/backend/services/awareness-replies.js +194 -0
- package/src/backend/services/awareness-service.js +344 -0
- package/src/backend/services/awareness-signals.js +267 -0
- package/src/backend/services/baseline-store.js +83 -0
- package/src/backend/services/branch-workstreams.js +341 -0
- package/src/backend/services/breakpoint-service.js +584 -0
- package/src/backend/services/brief-service.js +299 -0
- package/src/backend/services/budget-service.js +528 -0
- package/src/backend/services/callsites/base.js +15 -0
- package/src/backend/services/callsites/csharp.js +148 -0
- package/src/backend/services/callsites/go.js +163 -0
- package/src/backend/services/callsites/index.js +53 -0
- package/src/backend/services/callsites/kotlin.js +123 -0
- package/src/backend/services/callsites/process-env.js +125 -0
- package/src/backend/services/callsites/python.js +91 -0
- package/src/backend/services/callsites/ruby.js +164 -0
- package/src/backend/services/callsites/shared.js +198 -0
- package/src/backend/services/callsites/swift.js +115 -0
- package/src/backend/services/callsites/typescript.js +87 -0
- package/src/backend/services/capability-token.js +108 -0
- package/src/backend/services/change-check.js +156 -0
- package/src/backend/services/channel-dispatcher-service.js +235 -0
- package/src/backend/services/channel-event-file-service.js +125 -0
- package/src/backend/services/channel-event-service.js +297 -0
- package/src/backend/services/check-runs.js +177 -0
- package/src/backend/services/checkout-identity.js +73 -0
- package/src/backend/services/claude-code-parallel.js +221 -0
- package/src/backend/services/claude-desktop-config.js +186 -0
- package/src/backend/services/clock.js +57 -0
- package/src/backend/services/cloud-files.js +191 -0
- package/src/backend/services/coalesce.js +50 -0
- package/src/backend/services/code-breakpoints.js +291 -0
- package/src/backend/services/comment-service.js +168 -0
- package/src/backend/services/commit-attribution.js +134 -0
- package/src/backend/services/commit-edges.js +99 -0
- package/src/backend/services/confined-fs.js +241 -0
- package/src/backend/services/conformity-gate.js +132 -0
- package/src/backend/services/contribution-service.js +409 -0
- package/src/backend/services/coverage-service.js +173 -0
- package/src/backend/services/criteria-service.js +721 -0
- package/src/backend/services/criterion-checks.js +387 -0
- package/src/backend/services/criterion-loop-service.js +411 -0
- package/src/backend/services/cross-system-service.js +231 -0
- package/src/backend/services/database.js +916 -0
- package/src/backend/services/db-schema.js +1358 -0
- package/src/backend/services/deviation-service.js +344 -0
- package/src/backend/services/diff-engine.js +168 -0
- package/src/backend/services/evidence.js +363 -0
- package/src/backend/services/external-intake-service.js +269 -0
- package/src/backend/services/external-pointer-service.js +195 -0
- package/src/backend/services/external-refs-service.js +214 -0
- package/src/backend/services/file-history.js +158 -0
- package/src/backend/services/file-watcher.js +193 -0
- package/src/backend/services/folder-requests.js +118 -0
- package/src/backend/services/freeze-service.js +189 -0
- package/src/backend/services/gemini-cli-hook.js +172 -0
- package/src/backend/services/git-activity-service.js +325 -0
- package/src/backend/services/git-blobs.js +70 -0
- package/src/backend/services/git-branches.js +357 -0
- package/src/backend/services/git-checkout.js +153 -0
- package/src/backend/services/git-commit-service.js +91 -0
- package/src/backend/services/git-env.js +121 -0
- package/src/backend/services/git-identity.js +84 -0
- package/src/backend/services/git-refs.js +386 -0
- package/src/backend/services/git-safety.js +58 -0
- package/src/backend/services/grant-guard.js +67 -0
- package/src/backend/services/html-view-policy.js +135 -0
- package/src/backend/services/human-decision.js +55 -0
- package/src/backend/services/importers.js +159 -0
- package/src/backend/services/intent-service.js +105 -0
- package/src/backend/services/ipc-dispatcher.js +164 -0
- package/src/backend/services/item-git-state.js +208 -0
- package/src/backend/services/line-changes.js +232 -0
- package/src/backend/services/line-history.js +174 -0
- package/src/backend/services/local-api-changes.js +40 -0
- package/src/backend/services/logger.js +217 -0
- package/src/backend/services/material-footprints.js +203 -0
- package/src/backend/services/material-place.js +82 -0
- package/src/backend/services/material-reader/child.js +4 -0
- package/src/backend/services/material-reader/docx-markdown.js +198 -0
- package/src/backend/services/material-reader/fixtures.test-helper.js +169 -0
- package/src/backend/services/material-reader/quote.js +44 -0
- package/src/backend/services/material-reader/read.js +430 -0
- package/src/backend/services/material-reader/reader-host.js +202 -0
- package/src/backend/services/material-signals.js +141 -0
- package/src/backend/services/mcp-capabilities.js +390 -0
- package/src/backend/services/mdns-service.js +304 -0
- package/src/backend/services/mobile-api-server.js +281 -0
- package/src/backend/services/mobile-approvals.js +306 -0
- package/src/backend/services/mobile-awareness.js +180 -0
- package/src/backend/services/mobile-breakpoints.js +115 -0
- package/src/backend/services/mobile-budget.js +98 -0
- package/src/backend/services/mobile-freeze.js +106 -0
- package/src/backend/services/mobile-proposals.js +100 -0
- package/src/backend/services/mobile-rpc-service.js +1289 -0
- package/src/backend/services/mobile-workstreams.js +160 -0
- package/src/backend/services/monorepo-detector.js +131 -0
- package/src/backend/services/other-work.js +45 -0
- package/src/backend/services/pack-seal.js +129 -0
- package/src/backend/services/paired-device-service.js +192 -0
- package/src/backend/services/pairing-server.js +323 -0
- package/src/backend/services/pairing-service.js +200 -0
- package/src/backend/services/pantry-resolution-service.js +166 -0
- package/src/backend/services/parsers/base.js +124 -0
- package/src/backend/services/parsers/csharp.js +224 -0
- package/src/backend/services/parsers/go.js +180 -0
- package/src/backend/services/parsers/index.js +101 -0
- package/src/backend/services/parsers/java.js +103 -0
- package/src/backend/services/parsers/kotlin.js +252 -0
- package/src/backend/services/parsers/php.js +113 -0
- package/src/backend/services/parsers/python.js +189 -0
- package/src/backend/services/parsers/ruby.js +212 -0
- package/src/backend/services/parsers/rust.js +97 -0
- package/src/backend/services/parsers/swift.js +221 -0
- package/src/backend/services/parsers/typescript.js +235 -0
- package/src/backend/services/pattern-scan.js +65 -0
- package/src/backend/services/patterns.js +281 -0
- package/src/backend/services/peer-audit-service.js +123 -0
- package/src/backend/services/peer-auth.js +153 -0
- package/src/backend/services/peer-capabilities.js +209 -0
- package/src/backend/services/peer-connection-service.js +450 -0
- package/src/backend/services/peer-grants.js +33 -0
- package/src/backend/services/persistence.js +116 -0
- package/src/backend/services/personal-sync-service.js +232 -0
- package/src/backend/services/pipeline-approvals.js +72 -0
- package/src/backend/services/pipeline.js +232 -0
- package/src/backend/services/plan-arrivals.js +68 -0
- package/src/backend/services/plan-changes-service.js +273 -0
- package/src/backend/services/plan-conflict-service.js +288 -0
- package/src/backend/services/plan-dependencies.js +91 -0
- package/src/backend/services/plan-doc-guard.js +90 -0
- package/src/backend/services/plan-documents-service.js +275 -0
- package/src/backend/services/plan-event-service.js +154 -0
- package/src/backend/services/plan-file-refs.js +106 -0
- package/src/backend/services/plan-file-service.js +1564 -0
- package/src/backend/services/plan-history-service.js +156 -0
- package/src/backend/services/plan-import-service.js +261 -0
- package/src/backend/services/plan-item-service.js +1223 -0
- package/src/backend/services/plan-migrate-service.js +395 -0
- package/src/backend/services/plan-overlay-service.js +173 -0
- package/src/backend/services/plan-phases-service.js +182 -0
- package/src/backend/services/plan-progress-service.js +134 -0
- package/src/backend/services/plan-review-service.js +262 -0
- package/src/backend/services/plan-service.js +682 -0
- package/src/backend/services/plan-status.js +113 -0
- package/src/backend/services/plan-template-publish-service.js +217 -0
- package/src/backend/services/plan-templates-service.js +242 -0
- package/src/backend/services/plan-templates.js +1164 -0
- package/src/backend/services/planned-overlap-actions.js +200 -0
- package/src/backend/services/plans-home.js +224 -0
- package/src/backend/services/play-forward.js +256 -0
- package/src/backend/services/playback-service.js +117 -0
- package/src/backend/services/power-service.js +167 -0
- package/src/backend/services/power-signals.js +81 -0
- package/src/backend/services/pr-draft-service.js +142 -0
- package/src/backend/services/presence-service.js +122 -0
- package/src/backend/services/pricing.js +60 -0
- package/src/backend/services/project-config-service.js +474 -0
- package/src/backend/services/project-scanner.js +184 -0
- package/src/backend/services/projection-service.js +69 -0
- package/src/backend/services/push-notification-service.js +288 -0
- package/src/backend/services/recent-projects-service.js +204 -0
- package/src/backend/services/record-chain.js +162 -0
- package/src/backend/services/recurrence-rule.js +63 -0
- package/src/backend/services/recurring-agent.js +89 -0
- package/src/backend/services/recurring-scheduler.js +77 -0
- package/src/backend/services/recurring-service.js +276 -0
- package/src/backend/services/reference-service.js +169 -0
- package/src/backend/services/release-public-key.js +30 -0
- package/src/backend/services/release-signature.js +64 -0
- package/src/backend/services/remote-audio-service.js +224 -0
- package/src/backend/services/remote-interaction-service.js +275 -0
- package/src/backend/services/remote-terminal-service.js +324 -0
- package/src/backend/services/rendition/child/main.js +76 -0
- package/src/backend/services/rendition/engine-host.js +249 -0
- package/src/backend/services/rendition/engine-lock.js +39 -0
- package/src/backend/services/rendition/engine-lock.json +14 -0
- package/src/backend/services/rendition/engine-manifest.js +97 -0
- package/src/backend/services/rendition/network-proof.js +73 -0
- package/src/backend/services/rendition/rendition-service.js +175 -0
- package/src/backend/services/replay-frames.js +387 -0
- package/src/backend/services/replay-state.js +201 -0
- package/src/backend/services/resolvers/base.js +108 -0
- package/src/backend/services/resolvers/csharp.js +109 -0
- package/src/backend/services/resolvers/go.js +105 -0
- package/src/backend/services/resolvers/index.js +60 -0
- package/src/backend/services/resolvers/java.js +63 -0
- package/src/backend/services/resolvers/kotlin.js +109 -0
- package/src/backend/services/resolvers/php.js +89 -0
- package/src/backend/services/resolvers/python.js +154 -0
- package/src/backend/services/resolvers/ruby.js +103 -0
- package/src/backend/services/resolvers/rust.js +77 -0
- package/src/backend/services/resolvers/swift.js +98 -0
- package/src/backend/services/resolvers/typescript.js +71 -0
- package/src/backend/services/retention.js +54 -0
- package/src/backend/services/review-architecture.js +236 -0
- package/src/backend/services/review-attest.js +68 -0
- package/src/backend/services/review-bundle.js +226 -0
- package/src/backend/services/review-graduation.js +93 -0
- package/src/backend/services/review-host/bitbucket.js +79 -0
- package/src/backend/services/review-host/detect.js +80 -0
- package/src/backend/services/review-host/github.js +97 -0
- package/src/backend/services/review-host/gitlab.js +77 -0
- package/src/backend/services/review-host/host-state.js +103 -0
- package/src/backend/services/review-host/http.js +58 -0
- package/src/backend/services/review-host/switch.js +120 -0
- package/src/backend/services/review-marks.js +72 -0
- package/src/backend/services/review-notes.js +169 -0
- package/src/backend/services/review-other-work.js +90 -0
- package/src/backend/services/review-queue-service.js +147 -0
- package/src/backend/services/review-risk.js +127 -0
- package/src/backend/services/review-task.js +121 -0
- package/src/backend/services/rule-approvals.js +268 -0
- package/src/backend/services/rule-baseline.js +134 -0
- package/src/backend/services/rule-changes.js +162 -0
- package/src/backend/services/rule-preview.js +47 -0
- package/src/backend/services/rule-proposals.js +104 -0
- package/src/backend/services/rule-scope.js +76 -0
- package/src/backend/services/rulebook.js +286 -0
- package/src/backend/services/rules-at.js +56 -0
- package/src/backend/services/rules-overview.js +88 -0
- package/src/backend/services/schema-reconciler.js +250 -0
- package/src/backend/services/secret-store.js +119 -0
- package/src/backend/services/section-workstreams.js +95 -0
- package/src/backend/services/self-write-tracker.js +75 -0
- package/src/backend/services/sensor-bridge-service.js +285 -0
- package/src/backend/services/session-service.js +192 -0
- package/src/backend/services/settings-service.js +324 -0
- package/src/backend/services/signal-breakpoints.js +172 -0
- package/src/backend/services/signed-approval-record.js +86 -0
- package/src/backend/services/signed-approvals.js +244 -0
- package/src/backend/services/signoff-pack.js +328 -0
- package/src/backend/services/signoff-rows.js +114 -0
- package/src/backend/services/skill-arrival-service.js +138 -0
- package/src/backend/services/skill-model.js +193 -0
- package/src/backend/services/skill-use-service.js +140 -0
- package/src/backend/services/skills-service.js +150 -0
- package/src/backend/services/snapshot-compare-service.js +397 -0
- package/src/backend/services/source-control.js +189 -0
- package/src/backend/services/spec-links-service.js +123 -0
- package/src/backend/services/spec-proposal-withdraw.js +50 -0
- package/src/backend/services/spec-proposals-service.js +470 -0
- package/src/backend/services/sql/embedded.js +95 -0
- package/src/backend/services/sql/index.js +63 -0
- package/src/backend/services/sql/refs.js +357 -0
- package/src/backend/services/sql/schema.js +312 -0
- package/src/backend/services/sql/tokenizer.js +195 -0
- package/src/backend/services/stack-overlaps.js +117 -0
- package/src/backend/services/stack-service.js +225 -0
- package/src/backend/services/state-sync-service.js +384 -0
- package/src/backend/services/stuck-sensor-service.js +200 -0
- package/src/backend/services/system-discovery.js +481 -0
- package/src/backend/services/system-docs-service.js +701 -0
- package/src/backend/services/task-attachments-service.js +340 -0
- package/src/backend/services/task-grounding.js +60 -0
- package/src/backend/services/task-records/check-run-record.js +146 -0
- package/src/backend/services/task-records/check-runs.js +115 -0
- package/src/backend/services/task-records/heads.js +88 -0
- package/src/backend/services/task-records/material-reads.js +225 -0
- package/src/backend/services/task-records/read-record.js +100 -0
- package/src/backend/services/task-records/record.js +173 -0
- package/src/backend/services/task-records/run-record.js +136 -0
- package/src/backend/services/task-records/shared-state.js +548 -0
- package/src/backend/services/task-records/signing.js +140 -0
- package/src/backend/services/task-records/split-signals.js +52 -0
- package/src/backend/services/task-records/test-runs.js +164 -0
- package/src/backend/services/task-records/trust.js +243 -0
- package/src/backend/services/task-rules.js +81 -0
- package/src/backend/services/task-workstreams.js +90 -0
- package/src/backend/services/terminal-history-service.js +266 -0
- package/src/backend/services/terminal-service.js +267 -0
- package/src/backend/services/test-clock.js +53 -0
- package/src/backend/services/tests/grounding.js +266 -0
- package/src/backend/services/tests/junit.js +104 -0
- package/src/backend/services/tests/teammate-runs.js +134 -0
- package/src/backend/services/tests/test-results.js +234 -0
- package/src/backend/services/tree-watcher.js +204 -0
- package/src/backend/services/trellis-service.js +204 -0
- package/src/backend/services/trusted-roots.js +186 -0
- package/src/backend/services/update-download-service.js +342 -0
- package/src/backend/services/update-service.js +266 -0
- package/src/backend/services/watch-ignore.js +76 -0
- package/src/backend/services/webhook-egress.js +206 -0
- package/src/backend/services/webrtc-service.js +413 -0
- package/src/backend/services/work-changes.js +59 -0
- package/src/backend/services/workstream-binding.js +82 -0
- package/src/backend/services/workstream-commits.js +116 -0
- package/src/backend/services/workstream-imports.js +177 -0
- package/src/backend/services/workstream-service.js +335 -0
- package/src/backend/services/workstream-symbols.js +223 -0
- package/src/backend/services/workstream-watch-service.js +391 -0
- package/src/backend/services/worktree-service.js +235 -0
- package/src/cli/agent.js +100 -0
- package/src/cli/args.js +201 -0
- package/src/cli/conformity.js +106 -0
- package/src/cli/desktop.js +91 -0
- package/src/cli/main.js +409 -0
- package/src/cli/pipeline.js +109 -0
- package/src/cli/plan-verbs.js +259 -0
- package/src/cli/review-adapters.js +218 -0
- package/src/cli/review-output.js +93 -0
- package/src/cli/review-post.js +89 -0
- package/src/cli/review-sink.js +183 -0
- package/src/cli/review-skill.js +44 -0
- package/src/cli/review-verify.js +104 -0
- package/src/cli/review.js +386 -0
- package/src/cli/sarif.js +148 -0
- package/src/cli/verbs.js +359 -0
- package/src/shared/build-info.js +39 -0
- package/src/shared/lib/agent-review.js +199 -0
- package/src/shared/lib/agent-turns.js +140 -0
- package/src/shared/lib/awareness-digest.js +120 -0
- package/src/shared/lib/branch-name.js +45 -0
- package/src/shared/lib/breakpoint-words.js +118 -0
- package/src/shared/lib/budget-words.js +56 -0
- package/src/shared/lib/burst.js +69 -0
- package/src/shared/lib/call-entry.js +105 -0
- package/src/shared/lib/check-compare.js +42 -0
- package/src/shared/lib/check-words.js +216 -0
- package/src/shared/lib/csv.js +62 -0
- package/src/shared/lib/folder-entry.js +87 -0
- package/src/shared/lib/freeze-words.js +60 -0
- package/src/shared/lib/fuzzy.js +84 -0
- package/src/shared/lib/git-state-words.js +80 -0
- package/src/shared/lib/grep-entry.js +86 -0
- package/src/shared/lib/grounding-line.js +61 -0
- package/src/shared/lib/import-line.js +71 -0
- package/src/shared/lib/item-status.js +249 -0
- package/src/shared/lib/line-changes.js +53 -0
- package/src/shared/lib/locator.js +71 -0
- package/src/shared/lib/matcher.js +120 -0
- package/src/shared/lib/merge-order.js +65 -0
- package/src/shared/lib/open-findings.js +68 -0
- package/src/shared/lib/other-work.js +108 -0
- package/src/shared/lib/package-entry.js +142 -0
- package/src/shared/lib/plan-vocab.js +40 -0
- package/src/shared/lib/pptx-xml.js +86 -0
- package/src/shared/lib/proposal-words.js +61 -0
- package/src/shared/lib/recurrence.js +183 -0
- package/src/shared/lib/references.js +72 -0
- package/src/shared/lib/rule-pattern.js +56 -0
- package/src/shared/lib/sdp-fingerprint.js +115 -0
- package/src/shared/lib/sdp-minimal.js +123 -0
- package/src/shared/lib/secret-paths.js +34 -0
- package/src/shared/lib/signal-words.js +172 -0
- package/src/shared/lib/signoff.js +56 -0
- package/src/shared/lib/skills-note.js +60 -0
- package/src/shared/lib/spec-sections.js +78 -0
- package/src/shared/lib/symbol-entry.js +60 -0
- package/src/shared/lib/tool-phrasing.js +338 -0
- package/src/shared/lib/turn-gap.js +27 -0
- package/src/shared/lib/workstream-words.js +38 -0
- package/src/shared/lib/xlsx-xml.js +144 -0
- package/src/shared/lib/zip-reader.js +99 -0
- package/src/shared/types/agent.js +27 -0
- package/src/shared/types/architecture-rules.js +30 -0
- package/src/shared/types/ast.js +15 -0
- package/src/shared/types/breakpoint.js +33 -0
- package/src/shared/types/channel.js +41 -0
- package/src/shared/types/criteria.js +15 -0
- package/src/shared/types/graph.js +15 -0
- package/src/shared/types/index.js +53 -0
- package/src/shared/types/peer.js +36 -0
- package/src/shared/types/pipeline.js +15 -0
- package/src/shared/types/plan.js +15 -0
- package/src/shared/types/play-forward.js +15 -0
- package/src/shared/types/power.js +15 -0
- package/src/shared/types/presence.js +15 -0
- package/src/shared/types/project-config.js +35 -0
- package/src/shared/types/project.js +15 -0
- package/src/shared/types/record.js +15 -0
- package/src/shared/types/recurring.js +15 -0
- package/src/shared/types/review.js +15 -0
- package/src/shared/types/settings.js +114 -0
- package/src/shared/types/stack.js +15 -0
- package/src/shared/types/system-doc.js +15 -0
- package/src/shared/types/system.js +15 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
var peer_audit_service_exports = {};
|
|
29
|
+
__export(peer_audit_service_exports, {
|
|
30
|
+
_resetAuditCache: () => _resetAuditCache,
|
|
31
|
+
flushAudit: () => flushAudit,
|
|
32
|
+
listPeerAudit: () => listPeerAudit,
|
|
33
|
+
recordPeerAudit: () => recordPeerAudit,
|
|
34
|
+
terminalAuditDetail: () => terminalAuditDetail
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(peer_audit_service_exports);
|
|
37
|
+
var import_node_fs = __toESM(require("node:fs"));
|
|
38
|
+
var import_node_path = __toESM(require("node:path"));
|
|
39
|
+
var import_persistence = require("./persistence");
|
|
40
|
+
var import_retention = require("./retention");
|
|
41
|
+
const MAX_ENTRIES = import_retention.DEVICE_LOG_CAP;
|
|
42
|
+
function trimOld(all, now = Date.now()) {
|
|
43
|
+
const cutoff = (0, import_retention.retentionCutoff)(now);
|
|
44
|
+
if (cutoff !== null) {
|
|
45
|
+
const keepFrom = all.findIndex((e) => Date.parse(e.at) >= cutoff);
|
|
46
|
+
all.splice(0, keepFrom === -1 ? all.length : keepFrom);
|
|
47
|
+
}
|
|
48
|
+
if (all.length > MAX_ENTRIES) all.splice(0, all.length - MAX_ENTRIES);
|
|
49
|
+
}
|
|
50
|
+
let entries = null;
|
|
51
|
+
let flushTimer = null;
|
|
52
|
+
function auditPath() {
|
|
53
|
+
return import_node_path.default.join((0, import_persistence.getSettingsDir)(), "peer-audit.json");
|
|
54
|
+
}
|
|
55
|
+
function ensureLoaded() {
|
|
56
|
+
if (entries) return entries;
|
|
57
|
+
try {
|
|
58
|
+
const raw = JSON.parse(import_node_fs.default.readFileSync(auditPath(), "utf-8"));
|
|
59
|
+
entries = Array.isArray(raw) ? raw.slice(-MAX_ENTRIES) : [];
|
|
60
|
+
trimOld(entries);
|
|
61
|
+
} catch {
|
|
62
|
+
entries = [];
|
|
63
|
+
}
|
|
64
|
+
return entries;
|
|
65
|
+
}
|
|
66
|
+
function scheduleFlush() {
|
|
67
|
+
if (flushTimer) return;
|
|
68
|
+
flushTimer = setTimeout(() => {
|
|
69
|
+
flushTimer = null;
|
|
70
|
+
flushAudit();
|
|
71
|
+
}, 1e3);
|
|
72
|
+
if (typeof flushTimer === "object" && flushTimer && "unref" in flushTimer) {
|
|
73
|
+
flushTimer.unref();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function flushAudit() {
|
|
77
|
+
if (!entries) return;
|
|
78
|
+
try {
|
|
79
|
+
const dir = import_node_path.default.dirname(auditPath());
|
|
80
|
+
if (!import_node_fs.default.existsSync(dir)) import_node_fs.default.mkdirSync(dir, { recursive: true });
|
|
81
|
+
import_node_fs.default.writeFileSync(auditPath(), JSON.stringify(entries, null, 2), "utf-8");
|
|
82
|
+
} catch (err) {
|
|
83
|
+
console.warn("[PeerAudit] Failed to persist:", err);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function recordPeerAudit(entry) {
|
|
87
|
+
const all = ensureLoaded();
|
|
88
|
+
all.push({ at: (/* @__PURE__ */ new Date()).toISOString(), ...entry });
|
|
89
|
+
trimOld(all);
|
|
90
|
+
scheduleFlush();
|
|
91
|
+
}
|
|
92
|
+
function listPeerAudit(opts = {}) {
|
|
93
|
+
const all = ensureLoaded();
|
|
94
|
+
const filtered = opts.fingerprint ? all.filter((e) => e.fingerprint === opts.fingerprint) : all;
|
|
95
|
+
const limit = Math.min(Math.max(opts.limit ?? 200, 1), MAX_ENTRIES);
|
|
96
|
+
return filtered.slice(-limit).reverse();
|
|
97
|
+
}
|
|
98
|
+
function terminalAuditDetail(params) {
|
|
99
|
+
const id = params.terminalId ?? params.id;
|
|
100
|
+
if (typeof id === "string" && id) return `terminal ${sanitiseId(id)}`;
|
|
101
|
+
if (typeof params.index === "number" && Number.isFinite(params.index)) {
|
|
102
|
+
return `terminal #${params.index}`;
|
|
103
|
+
}
|
|
104
|
+
return void 0;
|
|
105
|
+
}
|
|
106
|
+
function sanitiseId(id) {
|
|
107
|
+
return id.replace(/[^A-Za-z0-9_-]/g, "").slice(0, 64);
|
|
108
|
+
}
|
|
109
|
+
function _resetAuditCache() {
|
|
110
|
+
entries = null;
|
|
111
|
+
if (flushTimer) {
|
|
112
|
+
clearTimeout(flushTimer);
|
|
113
|
+
flushTimer = null;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
117
|
+
0 && (module.exports = {
|
|
118
|
+
_resetAuditCache,
|
|
119
|
+
flushAudit,
|
|
120
|
+
listPeerAudit,
|
|
121
|
+
recordPeerAudit,
|
|
122
|
+
terminalAuditDetail
|
|
123
|
+
});
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var peer_auth_exports = {};
|
|
19
|
+
__export(peer_auth_exports, {
|
|
20
|
+
CHALLENGE_TTL_MS: () => CHALLENGE_TTL_MS,
|
|
21
|
+
PeerAuthError: () => PeerAuthError,
|
|
22
|
+
canonicalChallenge: () => canonicalChallenge,
|
|
23
|
+
computeAnswerMac: () => computeAnswerMac,
|
|
24
|
+
computeChallengeMac: () => computeChallengeMac,
|
|
25
|
+
computeReconnectAnswerMac: () => computeReconnectAnswerMac,
|
|
26
|
+
computeReconnectOfferMac: () => computeReconnectOfferMac,
|
|
27
|
+
deriveConfirmationCode: () => deriveConfirmationCode,
|
|
28
|
+
generateSharedSecret: () => generateSharedSecret,
|
|
29
|
+
isUsableSecret: () => isUsableSecret,
|
|
30
|
+
issueChallenge: () => issueChallenge,
|
|
31
|
+
macsEqual: () => macsEqual,
|
|
32
|
+
outstandingChallengeCount: () => outstandingChallengeCount,
|
|
33
|
+
resetChallenges: () => resetChallenges,
|
|
34
|
+
verifyChallengeResponse: () => verifyChallengeResponse
|
|
35
|
+
});
|
|
36
|
+
module.exports = __toCommonJS(peer_auth_exports);
|
|
37
|
+
var import_node_crypto = require("node:crypto");
|
|
38
|
+
const CHALLENGE_TTL_MS = 3e4;
|
|
39
|
+
const MAX_OUTSTANDING = 256;
|
|
40
|
+
const SECRET_BYTES = 32;
|
|
41
|
+
const NONCE_BYTES = 32;
|
|
42
|
+
class PeerAuthError extends Error {
|
|
43
|
+
code = "EPEER_AUTH";
|
|
44
|
+
constructor(message) {
|
|
45
|
+
super(message);
|
|
46
|
+
this.name = "PeerAuthError";
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function generateSharedSecret() {
|
|
50
|
+
return (0, import_node_crypto.randomBytes)(SECRET_BYTES).toString("hex");
|
|
51
|
+
}
|
|
52
|
+
function isUsableSecret(secret) {
|
|
53
|
+
return typeof secret === "string" && /^[0-9a-f]{64,}$/i.test(secret);
|
|
54
|
+
}
|
|
55
|
+
function canonicalChallenge(pairingId, nonce, expiresAt) {
|
|
56
|
+
return ["ct-peer-auth:v1", pairingId, nonce, String(expiresAt)].join("\n");
|
|
57
|
+
}
|
|
58
|
+
function computeChallengeMac(secretHex, pairingId, nonce, expiresAt) {
|
|
59
|
+
if (!isUsableSecret(secretHex)) {
|
|
60
|
+
throw new PeerAuthError("No usable pairing secret \u2014 the device must be paired again");
|
|
61
|
+
}
|
|
62
|
+
return (0, import_node_crypto.createHmac)("sha256", Buffer.from(secretHex, "hex")).update(canonicalChallenge(pairingId, nonce, expiresAt)).digest("hex");
|
|
63
|
+
}
|
|
64
|
+
function macsEqual(a, b) {
|
|
65
|
+
if (typeof a !== "string" || typeof b !== "string") return false;
|
|
66
|
+
if (a.length !== b.length || a.length === 0) return false;
|
|
67
|
+
try {
|
|
68
|
+
return (0, import_node_crypto.timingSafeEqual)(Buffer.from(a, "utf-8"), Buffer.from(b, "utf-8"));
|
|
69
|
+
} catch {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function computeAnswerMac(code, nonce, fingerprint) {
|
|
74
|
+
const normalised = String(fingerprint ?? "").replace(/[^0-9A-Fa-f]/g, "").toUpperCase();
|
|
75
|
+
return (0, import_node_crypto.createHmac)("sha256", Buffer.from(String(code), "utf-8")).update(["ct-pair:v5", nonce, normalised].join("\n")).digest("hex");
|
|
76
|
+
}
|
|
77
|
+
function computeReconnectOfferMac(secretHex, pairingId, challengeNonce, fingerprint) {
|
|
78
|
+
if (!isUsableSecret(secretHex)) {
|
|
79
|
+
throw new PeerAuthError("No usable pairing secret \u2014 the device must be paired again");
|
|
80
|
+
}
|
|
81
|
+
const normalised = String(fingerprint ?? "").replace(/[^0-9A-Fa-f]/g, "").toUpperCase();
|
|
82
|
+
return (0, import_node_crypto.createHmac)("sha256", Buffer.from(secretHex, "hex")).update(["ct-reconnect-offer:v1", pairingId, challengeNonce, normalised].join("\n")).digest("hex");
|
|
83
|
+
}
|
|
84
|
+
function computeReconnectAnswerMac(secretHex, pairingId, nonce, fingerprint) {
|
|
85
|
+
if (!isUsableSecret(secretHex)) {
|
|
86
|
+
throw new PeerAuthError("No usable pairing secret \u2014 the device must be paired again");
|
|
87
|
+
}
|
|
88
|
+
const normalised = String(fingerprint ?? "").replace(/[^0-9A-Fa-f]/g, "").toUpperCase();
|
|
89
|
+
return (0, import_node_crypto.createHmac)("sha256", Buffer.from(secretHex, "hex")).update(["ct-reconnect-answer:v1", pairingId, nonce, normalised].join("\n")).digest("hex");
|
|
90
|
+
}
|
|
91
|
+
const outstanding = /* @__PURE__ */ new Map();
|
|
92
|
+
function purgeExpired(now) {
|
|
93
|
+
for (const [nonce, c] of outstanding) {
|
|
94
|
+
if (c.expiresAt <= now) outstanding.delete(nonce);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
function issueChallenge(pairingId, now = Date.now()) {
|
|
98
|
+
purgeExpired(now);
|
|
99
|
+
while (outstanding.size >= MAX_OUTSTANDING) {
|
|
100
|
+
const oldest = outstanding.keys().next();
|
|
101
|
+
if (oldest.done) break;
|
|
102
|
+
outstanding.delete(oldest.value);
|
|
103
|
+
}
|
|
104
|
+
const nonce = (0, import_node_crypto.randomBytes)(NONCE_BYTES).toString("hex");
|
|
105
|
+
const expiresAt = now + CHALLENGE_TTL_MS;
|
|
106
|
+
outstanding.set(nonce, { pairingId, expiresAt });
|
|
107
|
+
return { nonce, expiresAt };
|
|
108
|
+
}
|
|
109
|
+
function verifyChallengeResponse(args, now = Date.now()) {
|
|
110
|
+
purgeExpired(now);
|
|
111
|
+
const issued = outstanding.get(args.nonce);
|
|
112
|
+
outstanding.delete(args.nonce);
|
|
113
|
+
if (!issued) return { ok: false, reason: "unknown or already-used challenge" };
|
|
114
|
+
if (issued.expiresAt <= now) return { ok: false, reason: "challenge expired" };
|
|
115
|
+
if (issued.pairingId !== args.pairingId) return { ok: false, reason: "challenge was issued for a different device" };
|
|
116
|
+
if (issued.expiresAt !== args.expiresAt) return { ok: false, reason: "expiry does not match the issued challenge" };
|
|
117
|
+
if (!isUsableSecret(args.secret)) return { ok: false, reason: "device has no pairing secret \u2014 re-pair required" };
|
|
118
|
+
const expected = computeChallengeMac(args.secret, args.pairingId, args.nonce, issued.expiresAt);
|
|
119
|
+
if (!macsEqual(expected, args.mac)) return { ok: false, reason: "incorrect proof" };
|
|
120
|
+
return { ok: true };
|
|
121
|
+
}
|
|
122
|
+
function resetChallenges() {
|
|
123
|
+
outstanding.clear();
|
|
124
|
+
}
|
|
125
|
+
function outstandingChallengeCount() {
|
|
126
|
+
return outstanding.size;
|
|
127
|
+
}
|
|
128
|
+
function deriveConfirmationCode(nonce, fingerprintA, fingerprintB) {
|
|
129
|
+
const sorted = [normaliseFp(fingerprintA), normaliseFp(fingerprintB)].sort();
|
|
130
|
+
const hash = (0, import_node_crypto.createHash)("sha256").update(`${nonce}:${sorted[0]}:${sorted[1]}`).digest("hex");
|
|
131
|
+
return (parseInt(hash.slice(0, 8), 16) % 1e6).toString().padStart(6, "0");
|
|
132
|
+
}
|
|
133
|
+
function normaliseFp(fp) {
|
|
134
|
+
return String(fp ?? "").replace(/[^0-9A-Fa-f]/g, "").toUpperCase();
|
|
135
|
+
}
|
|
136
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
137
|
+
0 && (module.exports = {
|
|
138
|
+
CHALLENGE_TTL_MS,
|
|
139
|
+
PeerAuthError,
|
|
140
|
+
canonicalChallenge,
|
|
141
|
+
computeAnswerMac,
|
|
142
|
+
computeChallengeMac,
|
|
143
|
+
computeReconnectAnswerMac,
|
|
144
|
+
computeReconnectOfferMac,
|
|
145
|
+
deriveConfirmationCode,
|
|
146
|
+
generateSharedSecret,
|
|
147
|
+
isUsableSecret,
|
|
148
|
+
issueChallenge,
|
|
149
|
+
macsEqual,
|
|
150
|
+
outstandingChallengeCount,
|
|
151
|
+
resetChallenges,
|
|
152
|
+
verifyChallengeResponse
|
|
153
|
+
});
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var peer_capabilities_exports = {};
|
|
19
|
+
__export(peer_capabilities_exports, {
|
|
20
|
+
ALL_CAPABILITIES: () => ALL_CAPABILITIES,
|
|
21
|
+
DEFAULT_GRANTS: () => DEFAULT_GRANTS,
|
|
22
|
+
METHOD_CAPABILITIES: () => METHOD_CAPABILITIES,
|
|
23
|
+
PeerAuthorizationError: () => PeerAuthorizationError,
|
|
24
|
+
assertPeerMayCall: () => assertPeerMayCall,
|
|
25
|
+
listAuthorisedMethods: () => listAuthorisedMethods
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(peer_capabilities_exports);
|
|
28
|
+
const ALL_CAPABILITIES = Object.freeze([
|
|
29
|
+
"read",
|
|
30
|
+
"write",
|
|
31
|
+
"project",
|
|
32
|
+
"files",
|
|
33
|
+
"capture",
|
|
34
|
+
"settings",
|
|
35
|
+
"terminal"
|
|
36
|
+
]);
|
|
37
|
+
const METHOD_CAPABILITIES = Object.freeze({
|
|
38
|
+
// ── read ────────────────────────────────────────────────────────────
|
|
39
|
+
"changes.summary": "read",
|
|
40
|
+
"channel.events": "read",
|
|
41
|
+
"channel.eventsSinceSeq": "read",
|
|
42
|
+
"channel.get": "read",
|
|
43
|
+
"channel.thread": "read",
|
|
44
|
+
"deviation.list": "read",
|
|
45
|
+
"graph.directory": "read",
|
|
46
|
+
"graph.file": "read",
|
|
47
|
+
"graph.fileSearch": "read",
|
|
48
|
+
"graph.overview": "read",
|
|
49
|
+
"graph.scene": "read",
|
|
50
|
+
"graph.search": "read",
|
|
51
|
+
"plan.copyAsPrompt": "read",
|
|
52
|
+
"plan.document": "read",
|
|
53
|
+
"plan.get": "read",
|
|
54
|
+
"plan.item.get": "read",
|
|
55
|
+
"plan.items": "read",
|
|
56
|
+
"plan.list": "read",
|
|
57
|
+
"plan.nextItem": "read",
|
|
58
|
+
"plan.status": "read",
|
|
59
|
+
"plan.template.list": "read",
|
|
60
|
+
// Phase 29 mobile review flow. All four are read-only by
|
|
61
|
+
// construction: review and pr-draft never touch the repository (the
|
|
62
|
+
// agent does the git and opens the PR with its own credentials), and
|
|
63
|
+
// comparands / compare only read snapshots. 'read' is therefore the
|
|
64
|
+
// right grant — giving them 'project' would hand a phone more than
|
|
65
|
+
// the flow needs.
|
|
66
|
+
"review.comparands": "read",
|
|
67
|
+
"review.compare": "read",
|
|
68
|
+
"review.get": "read",
|
|
69
|
+
"review.prDraft": "read",
|
|
70
|
+
"review.queue": "read",
|
|
71
|
+
"stack.summary": "read",
|
|
72
|
+
"playForward.summary": "read",
|
|
73
|
+
// Phase 32 C4.3a — the recurring series, and starting the run due now.
|
|
74
|
+
"recurring.list": "read",
|
|
75
|
+
"power.status": "read",
|
|
76
|
+
"project.active": "read",
|
|
77
|
+
"project.list": "read",
|
|
78
|
+
"settings.get": "read",
|
|
79
|
+
"sysdoc.list": "read",
|
|
80
|
+
"sysdoc.read": "read",
|
|
81
|
+
"diagnostics.flush": "read",
|
|
82
|
+
// Phase 31 §12 — what is waiting on a person, and one item's criteria.
|
|
83
|
+
"criteria.awaiting": "read",
|
|
84
|
+
"criteria.list": "read",
|
|
85
|
+
// A plan's budget and the agent changes still flagged (mobile-budget.ts).
|
|
86
|
+
"budget.get": "read",
|
|
87
|
+
"freeze.get": "read",
|
|
88
|
+
// Phase 32 B4.4 — what is held for the person (mobile-breakpoints.ts).
|
|
89
|
+
"breakpoint.waiting": "read",
|
|
90
|
+
// Phase 32 B7.6 — proposed spec changes, in the desktop's words (mobile-proposals.ts).
|
|
91
|
+
"proposal.list": "read",
|
|
92
|
+
"proposal.get": "read",
|
|
93
|
+
// Phase 32 A4.2 — what overlaps, in the desktop's words (mobile-awareness.ts).
|
|
94
|
+
"awareness.needsYou": "read",
|
|
95
|
+
"awareness.signal": "read",
|
|
96
|
+
// Phase 32 A4.3 — the lines of work and their turns (mobile-workstreams.ts).
|
|
97
|
+
"workstreams.list": "read",
|
|
98
|
+
"workstreams.detail": "read",
|
|
99
|
+
// ── write ───────────────────────────────────────────────────────────
|
|
100
|
+
"channel.post": "write",
|
|
101
|
+
// Phase 31 §12 — a person's approval or send-back. `write` admits it;
|
|
102
|
+
// the handler also requires a CONFIRMED pairing, because the sign-off is
|
|
103
|
+
// recorded as the person's (mobile-approvals.ts).
|
|
104
|
+
"criterion.decide": "write",
|
|
105
|
+
// Marking an agent's budget change seen: also needs a CONFIRMED pairing.
|
|
106
|
+
"budget.acknowledge": "write",
|
|
107
|
+
"freeze.acknowledge": "write",
|
|
108
|
+
// Answering a held call: also needs a CONFIRMED pairing, and is audited.
|
|
109
|
+
"breakpoint.answer": "write",
|
|
110
|
+
// Deciding a spec change: also a CONFIRMED pairing, audited; the person's, never an agent's.
|
|
111
|
+
"proposal.decide": "write",
|
|
112
|
+
"playForward.decide": "write",
|
|
113
|
+
"recurring.start": "write",
|
|
114
|
+
// Answering a signal or replying to its agents: also a CONFIRMED pairing, audited.
|
|
115
|
+
"awareness.answer": "write",
|
|
116
|
+
"awareness.reply": "write",
|
|
117
|
+
"channel.resolve": "write",
|
|
118
|
+
"comment.add": "write",
|
|
119
|
+
"deviation.resolve": "write",
|
|
120
|
+
"input.respond": "write",
|
|
121
|
+
"item.ref.add": "write",
|
|
122
|
+
"item.ref.remove": "write",
|
|
123
|
+
"plan.create": "write",
|
|
124
|
+
"plan.delete": "write",
|
|
125
|
+
"plan.file.discover": "write",
|
|
126
|
+
"plan.file.export": "write",
|
|
127
|
+
"plan.file.import": "write",
|
|
128
|
+
"plan.item.create": "write",
|
|
129
|
+
"plan.item.update": "write",
|
|
130
|
+
"plan.template.create": "write",
|
|
131
|
+
"plan.update": "write",
|
|
132
|
+
"sysdoc.create": "write",
|
|
133
|
+
"sysdoc.delete": "write",
|
|
134
|
+
"sysdoc.update": "write",
|
|
135
|
+
"sysdoc.verify": "write",
|
|
136
|
+
// ── project ─────────────────────────────────────────────────────────
|
|
137
|
+
"project.alias": "project",
|
|
138
|
+
"project.close": "project",
|
|
139
|
+
"project.open": "project",
|
|
140
|
+
"project.pin": "project",
|
|
141
|
+
"project.remove": "project",
|
|
142
|
+
"project.rescan": "project",
|
|
143
|
+
// ── files ───────────────────────────────────────────────────────────
|
|
144
|
+
// Separated from `read` because these return file CONTENT and enumerate
|
|
145
|
+
// directories, rather than the plan/graph metadata `read` covers.
|
|
146
|
+
// Phase 31 §12 — the cited place in a piece of evidence: file content,
|
|
147
|
+
// read through the same confined reader as read_material.
|
|
148
|
+
"artefact.preview": "files",
|
|
149
|
+
"fs.browse": "files",
|
|
150
|
+
"graph.fileSource": "files",
|
|
151
|
+
// ── settings ────────────────────────────────────────────────────────
|
|
152
|
+
// Includes `device.exposeMobileApi`. A device must not be able to widen
|
|
153
|
+
// its own reach, so this is not granted by default.
|
|
154
|
+
"settings.update": "settings",
|
|
155
|
+
// ── terminal — COMMAND EXECUTION ────────────────────────────────────
|
|
156
|
+
"terminal.create": "terminal",
|
|
157
|
+
"terminal.history": "terminal",
|
|
158
|
+
"terminal.kill": "terminal",
|
|
159
|
+
"terminal.list": "terminal",
|
|
160
|
+
"terminal.read": "terminal",
|
|
161
|
+
"terminal.resize": "terminal",
|
|
162
|
+
"terminal.stream": "terminal",
|
|
163
|
+
"terminal.write": "terminal"
|
|
164
|
+
});
|
|
165
|
+
const DEFAULT_GRANTS = Object.freeze([
|
|
166
|
+
"read",
|
|
167
|
+
"write",
|
|
168
|
+
"project",
|
|
169
|
+
"files"
|
|
170
|
+
]);
|
|
171
|
+
class PeerAuthorizationError extends Error {
|
|
172
|
+
code = "EPEER_FORBIDDEN";
|
|
173
|
+
constructor(message) {
|
|
174
|
+
super(message);
|
|
175
|
+
this.name = "PeerAuthorizationError";
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
function assertPeerMayCall(method, grants, opts = { confirmed: false }) {
|
|
179
|
+
const required = METHOD_CAPABILITIES[method];
|
|
180
|
+
if (!required) {
|
|
181
|
+
throw new PeerAuthorizationError(
|
|
182
|
+
`Method "${method}" is not authorised for peers. Every method must be listed in METHOD_CAPABILITIES; unlisted methods are refused.`
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
const held = grants ?? [];
|
|
186
|
+
if (!held.includes(required)) {
|
|
187
|
+
throw new PeerAuthorizationError(
|
|
188
|
+
`Device${opts.alias ? ` "${opts.alias}"` : ""} does not hold the "${required}" capability required by "${method}"`
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
if (required === "terminal" && !opts.confirmed) {
|
|
192
|
+
throw new PeerAuthorizationError(
|
|
193
|
+
`"${method}" runs commands on this machine and requires a confirmed pairing`
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
return required;
|
|
197
|
+
}
|
|
198
|
+
function listAuthorisedMethods() {
|
|
199
|
+
return Object.keys(METHOD_CAPABILITIES);
|
|
200
|
+
}
|
|
201
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
202
|
+
0 && (module.exports = {
|
|
203
|
+
ALL_CAPABILITIES,
|
|
204
|
+
DEFAULT_GRANTS,
|
|
205
|
+
METHOD_CAPABILITIES,
|
|
206
|
+
PeerAuthorizationError,
|
|
207
|
+
assertPeerMayCall,
|
|
208
|
+
listAuthorisedMethods
|
|
209
|
+
});
|