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,273 @@
|
|
|
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 architecture_tools_exports = {};
|
|
29
|
+
__export(architecture_tools_exports, {
|
|
30
|
+
register: () => register
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(architecture_tools_exports);
|
|
33
|
+
var import_node_path = __toESM(require("node:path"));
|
|
34
|
+
var import_zod = require("zod");
|
|
35
|
+
var import_rules_overview = require("../../services/rules-overview");
|
|
36
|
+
var import_architecture_rules = require("../../services/architecture-rules");
|
|
37
|
+
var import_rule_preview = require("../../services/rule-preview");
|
|
38
|
+
var import_rule_scope = require("../../services/rule-scope");
|
|
39
|
+
var import_rule_proposals = require("../../services/rule-proposals");
|
|
40
|
+
var import_helpers = require("../helpers");
|
|
41
|
+
function register(server, deps) {
|
|
42
|
+
server.registerTool(
|
|
43
|
+
"search_symbols",
|
|
44
|
+
{
|
|
45
|
+
description: "Search for functions, classes, interfaces, and other symbols across the codebase by name",
|
|
46
|
+
inputSchema: {
|
|
47
|
+
query: import_zod.z.string().describe("Symbol name to search for (substring match)")
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
async ({ query }) => {
|
|
51
|
+
const results = deps.searchSymbols(query);
|
|
52
|
+
return { content: [{ type: "text", text: JSON.stringify(results, null, 2) }] };
|
|
53
|
+
}
|
|
54
|
+
);
|
|
55
|
+
server.registerTool(
|
|
56
|
+
"get_dependencies",
|
|
57
|
+
{
|
|
58
|
+
description: "Get what a file imports and what imports it. Returns incoming and outgoing dependency edges.",
|
|
59
|
+
inputSchema: {
|
|
60
|
+
file_path: import_zod.z.string().describe("Path to the file: absolute, or relative to the project root")
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
async ({ file_path }) => {
|
|
64
|
+
const result = deps.getFileDependencies(file_path);
|
|
65
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
server.registerTool(
|
|
69
|
+
"check_architecture",
|
|
70
|
+
{
|
|
71
|
+
description: "Query the codebase dependency graph. Returns all file-to-file import edges, showing how the codebase is connected.",
|
|
72
|
+
inputSchema: {
|
|
73
|
+
query: import_zod.z.string().optional().describe("Optional: filter edges by file path substring")
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
async ({ query }) => {
|
|
77
|
+
let edges = deps.getDependencyEdges();
|
|
78
|
+
if (query) {
|
|
79
|
+
edges = edges.filter(
|
|
80
|
+
(e) => e.sourceRelative.includes(query) || e.targetRelative.includes(query)
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
const stats = deps.getDbStats();
|
|
84
|
+
return { content: [{ type: "text", text: JSON.stringify({ stats, edges }, null, 2) }] };
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
server.registerTool(
|
|
88
|
+
"list_cross_system_edges",
|
|
89
|
+
{
|
|
90
|
+
description: "Cross-system edges \u2014 non-import couplings between files inferred from runtime patterns. Today: HTTP fetches in TS/JS matched against FastAPI/Flask routes in Python (more protocols coming: SQL refs, subprocess, env-configured URLs, OpenAPI contracts). Use this to see how the frontend talks to the backend even when no import edges exist.",
|
|
91
|
+
inputSchema: {}
|
|
92
|
+
},
|
|
93
|
+
async () => {
|
|
94
|
+
return {
|
|
95
|
+
content: [{
|
|
96
|
+
type: "text",
|
|
97
|
+
text: JSON.stringify({ stats: deps.getCrossSystemStats(), edges: deps.listCrossSystemEdges() }, null, 2)
|
|
98
|
+
}]
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
server.registerTool(
|
|
103
|
+
"check_conformity",
|
|
104
|
+
{
|
|
105
|
+
description: `Check proposed imports before you write them: whether each would cross one of the team's architecture rules ("web/ may not import db/", kept in .codetrellis/rules/<suite>.yaml, with why), or create a direct two-file cycle. suite, rule or path limits it to part of the rulebook. A clean result means no rule is broken and no direct cycle made; list_rules shows the rules.`,
|
|
106
|
+
inputSchema: {
|
|
107
|
+
proposed_imports: import_zod.z.array(import_zod.z.object({
|
|
108
|
+
from: import_zod.z.string().describe("File that would contain the import (absolute, or relative to the project root)"),
|
|
109
|
+
importing: import_zod.z.string().describe("File being imported (absolute, or relative to the project root)")
|
|
110
|
+
})).describe("List of proposed import relationships to check"),
|
|
111
|
+
project_path: import_zod.z.string().optional().describe("An opened project. Omit for the one open in the app."),
|
|
112
|
+
suite: import_zod.z.string().max(500).optional().describe("Check only these suites' rules (comma-separated, like payments)."),
|
|
113
|
+
rule: import_zod.z.string().max(500).optional().describe("Check only these rules, by id (comma-separated)."),
|
|
114
|
+
path: import_zod.z.string().max(500).optional().describe("Check only the rules about these paths (comma-separated).")
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
async ({ proposed_imports, project_path, suite, rule: ruleIds, path: scopePath }) => {
|
|
118
|
+
const root = project_path ?? deps.getActiveProjectPath();
|
|
119
|
+
const edges = deps.getDependencyEdges();
|
|
120
|
+
const edgeSet = new Set(edges.map((e) => `${e.sourceRelative}->${e.targetRelative}`));
|
|
121
|
+
const violations = [];
|
|
122
|
+
const rel = (p) => {
|
|
123
|
+
const r = root && import_node_path.default.isAbsolute(p) ? import_node_path.default.relative(root, p) : p;
|
|
124
|
+
return r.split(import_node_path.default.sep).join("/").replace(/^\.\//, "");
|
|
125
|
+
};
|
|
126
|
+
const rules = root ? (0, import_rule_scope.scopeRules)((0, import_architecture_rules.rulesOf)(root), (0, import_rule_scope.parseScope)({ suite, rule: ruleIds, path: scopePath })) : [];
|
|
127
|
+
for (const imp of proposed_imports) {
|
|
128
|
+
const from = rel(imp.from);
|
|
129
|
+
const to = rel(imp.importing);
|
|
130
|
+
for (const b of (0, import_architecture_rules.checkEdges)(rules, [{ from, to }])) {
|
|
131
|
+
const rule = rules.find((r) => r.id === b.rule);
|
|
132
|
+
violations.push({ rule: rule.id, message: (0, import_architecture_rules.breachWords)(rule, b), ...rule.because ? { because: rule.because } : {} });
|
|
133
|
+
}
|
|
134
|
+
if (edgeSet.has(`${to}->${from}`)) {
|
|
135
|
+
violations.push({
|
|
136
|
+
rule: "circular-dependency",
|
|
137
|
+
message: `Adding ${imp.from} -> ${imp.importing} would create a circular dependency (${imp.importing} already imports ${imp.from})`
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
content: [{
|
|
143
|
+
type: "text",
|
|
144
|
+
text: JSON.stringify({
|
|
145
|
+
conformant: violations.length === 0,
|
|
146
|
+
violations,
|
|
147
|
+
checkedImports: proposed_imports.length,
|
|
148
|
+
rules: rules.length
|
|
149
|
+
}, null, 2)
|
|
150
|
+
}]
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
);
|
|
154
|
+
server.registerTool(
|
|
155
|
+
"list_rules",
|
|
156
|
+
{
|
|
157
|
+
description: `The team's architecture rules (Phase 32 A7): path boundaries such as "web/ may not import db/ (except db/types.ts): web talks to db through the API", kept in committed suite files (.codetrellis/rules/<suite>.yaml), each with the imports that break it today. A person sets them in the app; this only reads. Check an import before writing it with check_conformity.`,
|
|
158
|
+
inputSchema: {
|
|
159
|
+
project_path: import_zod.z.string().optional().describe("An opened project. Omit for the one open in the app.")
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
async ({ project_path }) => {
|
|
163
|
+
const root = project_path ?? deps.getActiveProjectPath();
|
|
164
|
+
if (!root) return { isError: true, content: [{ type: "text", text: "No project is open." }] };
|
|
165
|
+
const view = (0, import_architecture_rules.rulesView)(root, (0, import_architecture_rules.edgesIfLoaded)(root, deps.getActiveProjectPath(), deps.getDependencyEdges));
|
|
166
|
+
const debt = (0, import_rules_overview.debtByRule)(root);
|
|
167
|
+
return { content: [{ type: "text", text: JSON.stringify({ rules: view.map((v) => ({ ...v, debt: debt.get(v.rule.id) ?? 0 })) }, null, 2) }] };
|
|
168
|
+
}
|
|
169
|
+
);
|
|
170
|
+
server.registerTool(
|
|
171
|
+
"propose_rule",
|
|
172
|
+
{
|
|
173
|
+
description: "Propose a change to one of the team's architecture rules (Phase 33 R3): a new rule, a changed one, or stopping one (remove). Nothing changes: the proposal waits for a person, who sees what it would do against the code and accepts or rejects it in the app. Returns what it would do now, in the words the check uses. You cannot change a rule yourself, and editing .codetrellis/rules/ directly is caught by the check, which judges a branch by its base's rules.",
|
|
174
|
+
inputSchema: {
|
|
175
|
+
id: import_zod.z.string().min(1).max(63).describe("The rule's id, a short slug like web-not-db: an existing rule to change or stop, or a new one."),
|
|
176
|
+
kind: import_zod.z.enum(["imports", "package", "symbol", "calls", "folder", "grep"]).optional().describe("imports (the default): files in from may not import files in may_not_import. package: only the files in only may import the outside package named in package. symbol: only the files in only may import the export named in symbol, directly or through a barrel. calls: only the files in only may make the call named in calls. folder: the files in folder are named to files, of kinds, and export one name each when exports is one. grep: no line of the files in in may hold must_not, or each must hold must."),
|
|
177
|
+
from: import_zod.z.string().max(300).optional().describe("The files it is about: a folder ending in / or a pattern. Required for an imports rule unless remove; for a package rule, where it applies (everywhere if omitted)."),
|
|
178
|
+
may_not_import: import_zod.z.string().max(300).optional().describe("What they may not import. Required for an imports rule unless remove."),
|
|
179
|
+
package: import_zod.z.string().max(300).optional().describe("A package rule's outside package, ecosystem and name: npm:stripe, pypi:requests, go:github.com/stripe/stripe-go, maven:com.stripe."),
|
|
180
|
+
symbol: import_zod.z.string().max(300).optional().describe("A symbol rule's export, a file and a name: src/payments/charge.ts#createCharge."),
|
|
181
|
+
calls: import_zod.z.string().max(300).optional().describe("A call rule's call: http: and a host or path (http:api.stripe.com, http:/api/admin), or sql: and a table (sql:payments). A * makes it a glob: http:*.stripe.com, sql:payments_*. Or a kind of the project's own that its .codetrellis/patterns/ find (B4): queue:orders.*, flag:new-checkout."),
|
|
182
|
+
match: import_zod.z.enum(["exact", "glob", "regex", "fuzzy"]).optional().describe("How a package, symbol or call rule's target is matched (B1): exact (the default), glob (a * in the target says so too), or regex over the whole entry, like http:api\\.(stripe|paypal)\\.com(/.*)?. For a grep rule, how its text is: exact (the default, literal, a * is a *), glob, or regex searched in each line. fuzzy (B3): like it and not it, a look-alike, at or above threshold; then only may be empty (nothing may)."),
|
|
183
|
+
threshold: import_zod.z.number().gt(0.5).lt(1).optional().describe("For match fuzzy: how alike, 0.85 unless said. A swapped pair in an 8-letter name is 0.88."),
|
|
184
|
+
in: import_zod.z.array(import_zod.z.string().max(300)).max(50).optional().describe("A grep rule's files, like src/backend/ or src/routes/*.ts."),
|
|
185
|
+
must_not: import_zod.z.string().max(200).optional().describe("A grep rule's text no line may hold, like console.log(."),
|
|
186
|
+
must: import_zod.z.string().max(200).optional().describe("A grep rule's text each file must hold on some line, like requireAuth."),
|
|
187
|
+
ignore_case: import_zod.z.boolean().optional().describe("A grep rule: read its text in any case."),
|
|
188
|
+
engine: import_zod.z.enum(["deterministic", "fuzzy", "agent"]).optional().describe("Who judges it (B5): deterministic (code, the default), fuzzy (a match: fuzzy target), or agent: words an agent review judges a change by, in rule_words, about the files in in. No code checks an agent rule; it blocks only at block."),
|
|
189
|
+
rule_words: import_zod.z.string().max(1e3).optional().describe("An agent rule's words: Code that moves money records it through services/ledger, never by writing balances directly."),
|
|
190
|
+
folder: import_zod.z.string().max(300).optional().describe("A folder rule's folder, like src/backend/services/."),
|
|
191
|
+
files: import_zod.z.array(import_zod.z.string().max(100)).max(20).optional().describe("A folder rule's name patterns, like *-service.ts."),
|
|
192
|
+
kinds: import_zod.z.array(import_zod.z.string().max(20)).max(20).optional().describe("A folder rule's file kinds, by extension, like ts."),
|
|
193
|
+
exports: import_zod.z.enum(["one"]).optional().describe("A folder rule: one, each file exports one name."),
|
|
194
|
+
guide: import_zod.z.string().max(1e3).optional().describe("A folder rule's judgement half, in prose: shown to people and agents, never checked."),
|
|
195
|
+
only: import_zod.z.array(import_zod.z.string().max(300)).max(50).optional().describe("A package, symbol or call rule's files that alone may import it or make the call, like src/payments/index.ts."),
|
|
196
|
+
except: import_zod.z.array(import_zod.z.string().max(300)).max(50).optional().describe("Files they may import all the same."),
|
|
197
|
+
because: import_zod.z.string().max(200).optional().describe("Why the rule exists, in the team's words."),
|
|
198
|
+
strength: import_zod.z.enum(["block", "warn", "guide"]).optional().describe("block fails the check; warn is said; guide is never checked. A new rule starts at warn."),
|
|
199
|
+
suite: import_zod.z.string().max(63).optional().describe("The suite file it belongs in, like payments."),
|
|
200
|
+
tags: import_zod.z.array(import_zod.z.string().max(32)).max(10).optional().describe("Words a pipeline stage or a check selects it by, like pci (short slugs). Dropping one loosens the rule."),
|
|
201
|
+
remove: import_zod.z.boolean().optional().describe("Propose stopping the rule."),
|
|
202
|
+
why: import_zod.z.string().min(1).max(1e3).describe("Why you propose it: what you found, and the evidence."),
|
|
203
|
+
project_path: import_zod.z.string().optional().describe("An opened project. Omit for the one open in the app.")
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
async (args, extra) => {
|
|
207
|
+
const root = args.project_path ?? deps.getActiveProjectPath();
|
|
208
|
+
if (!root) return { isError: true, content: [{ type: "text", text: "No project is open." }] };
|
|
209
|
+
const id = (0, import_helpers.authorFromExtra)(deps, extra);
|
|
210
|
+
const body = args.remove ? null : {
|
|
211
|
+
from: args.from,
|
|
212
|
+
mayNotImport: args.may_not_import,
|
|
213
|
+
except: args.except,
|
|
214
|
+
because: args.because,
|
|
215
|
+
strength: args.strength,
|
|
216
|
+
suite: args.suite,
|
|
217
|
+
...args.kind ? { kind: args.kind } : {},
|
|
218
|
+
...args.package ? { package: args.package } : {},
|
|
219
|
+
...args.only ? { only: args.only } : {},
|
|
220
|
+
...args.symbol ? { symbol: args.symbol } : {},
|
|
221
|
+
...args.calls ? { calls: args.calls } : {},
|
|
222
|
+
...args.match ? { match: args.match } : {},
|
|
223
|
+
...args.threshold !== void 0 ? { threshold: args.threshold } : {},
|
|
224
|
+
...args.folder ? { folder: args.folder } : {},
|
|
225
|
+
...args.files ? { files: args.files } : {},
|
|
226
|
+
...args.kinds ? { kinds: args.kinds } : {},
|
|
227
|
+
...args.exports ? { exports: args.exports } : {},
|
|
228
|
+
...args.guide ? { guide: args.guide } : {},
|
|
229
|
+
...args.in ? { in: args.in } : {},
|
|
230
|
+
...args.must_not !== void 0 ? { mustNot: args.must_not } : {},
|
|
231
|
+
...args.must !== void 0 ? { must: args.must } : {},
|
|
232
|
+
...args.ignore_case !== void 0 ? { ignoreCase: args.ignore_case } : {},
|
|
233
|
+
...args.engine ? { engine: args.engine } : {},
|
|
234
|
+
...args.rule_words ? { rule: args.rule_words } : {},
|
|
235
|
+
...args.tags ? { tags: args.tags } : {}
|
|
236
|
+
};
|
|
237
|
+
try {
|
|
238
|
+
if (!body && !(0, import_architecture_rules.findRule)(root, args.id)) return { isError: true, content: [{ type: "text", text: `No architecture rule "${args.id}" in this project to stop.` }] };
|
|
239
|
+
const next = body ? (0, import_architecture_rules.proposedRule)(root, { ...body, id: args.id }, id.author).rule : null;
|
|
240
|
+
const preview = (0, import_rule_preview.previewChange)(root, args.id, next, (0, import_architecture_rules.edgesIfLoaded)(root, deps.getActiveProjectPath(), deps.getDependencyEdges, void 0, next ? [next] : []));
|
|
241
|
+
if (!preview.change) return { isError: true, content: [{ type: "text", text: `${preview.words} Nothing to propose.` }] };
|
|
242
|
+
const proposal = (0, import_rule_proposals.addRuleProposal)({
|
|
243
|
+
projectRoot: root,
|
|
244
|
+
ruleId: args.id,
|
|
245
|
+
body,
|
|
246
|
+
why: args.why,
|
|
247
|
+
effect: preview.change.effect,
|
|
248
|
+
words: preview.words,
|
|
249
|
+
author: id.author,
|
|
250
|
+
authorType: id.authorType,
|
|
251
|
+
sessionId: deps.sessionId ?? null
|
|
252
|
+
});
|
|
253
|
+
deps.broadcast?.("rules-changed", { project: root });
|
|
254
|
+
return {
|
|
255
|
+
_meta: { summary: `Proposed a change to ${args.id}; a person decides` },
|
|
256
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
257
|
+
proposal: proposal.uid,
|
|
258
|
+
status: proposal.status,
|
|
259
|
+
...(0, import_rule_preview.previewJson)(preview),
|
|
260
|
+
next: "A person decides in the app. Until then the rule is as it was; carry on under it."
|
|
261
|
+
}, null, 2) }]
|
|
262
|
+
};
|
|
263
|
+
} catch (err) {
|
|
264
|
+
if (err instanceof import_architecture_rules.RuleError) return { isError: true, content: [{ type: "text", text: err.message }] };
|
|
265
|
+
throw err;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
271
|
+
0 && (module.exports = {
|
|
272
|
+
register
|
|
273
|
+
});
|
|
@@ -0,0 +1,117 @@
|
|
|
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 audio_tools_exports = {};
|
|
19
|
+
__export(audio_tools_exports, {
|
|
20
|
+
registerAudioTools: () => registerAudioTools
|
|
21
|
+
});
|
|
22
|
+
module.exports = __toCommonJS(audio_tools_exports);
|
|
23
|
+
var import_zod = require("zod");
|
|
24
|
+
var import_audio_buffer_service = require("../../services/audio-buffer-service");
|
|
25
|
+
function registerAudioTools(server) {
|
|
26
|
+
server.tool(
|
|
27
|
+
"start_audio_capture",
|
|
28
|
+
"Start capturing audio from the user's microphone. Audio streams into a rolling buffer (default 120 seconds). Use get_audio_context to retrieve the buffered audio.",
|
|
29
|
+
{
|
|
30
|
+
max_buffer_seconds: import_zod.z.number().min(1).max(600).optional().describe("Maximum buffer duration in seconds, 1\u2013600 (default: 120)")
|
|
31
|
+
},
|
|
32
|
+
async ({ max_buffer_seconds }) => {
|
|
33
|
+
import_audio_buffer_service.audioBuffer.startCapture(max_buffer_seconds);
|
|
34
|
+
const status = import_audio_buffer_service.audioBuffer.getStatus();
|
|
35
|
+
return {
|
|
36
|
+
content: [{ type: "text", text: JSON.stringify({ message: "Audio capture started", status }) }]
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
server.tool(
|
|
41
|
+
"stop_audio_capture",
|
|
42
|
+
"Stop audio capture. The buffer is preserved and can still be read via get_audio_context until the next start.",
|
|
43
|
+
{},
|
|
44
|
+
async () => {
|
|
45
|
+
import_audio_buffer_service.audioBuffer.stopCapture();
|
|
46
|
+
const status = import_audio_buffer_service.audioBuffer.getStatus();
|
|
47
|
+
return {
|
|
48
|
+
content: [{ type: "text", text: JSON.stringify({ message: "Audio capture stopped", status }) }]
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
server.tool(
|
|
53
|
+
"push_audio_chunk",
|
|
54
|
+
"Push a chunk of audio data into the capture buffer. Used internally by the frontend \u2014 agents should use get_audio_context to read audio.",
|
|
55
|
+
{
|
|
56
|
+
audio_base64: import_zod.z.string().describe("Base64-encoded audio data (WebM/Opus)"),
|
|
57
|
+
duration_ms: import_zod.z.number().positive().max(6e4).describe("Duration of this chunk in milliseconds (up to 60000)")
|
|
58
|
+
},
|
|
59
|
+
async ({ audio_base64, duration_ms }) => {
|
|
60
|
+
if (!import_audio_buffer_service.audioBuffer.isCapturing()) {
|
|
61
|
+
return {
|
|
62
|
+
content: [{ type: "text", text: JSON.stringify({ error: "Audio capture is not active" }) }],
|
|
63
|
+
isError: true
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const data = Buffer.from(audio_base64, "base64");
|
|
67
|
+
import_audio_buffer_service.audioBuffer.addChunk(data, duration_ms);
|
|
68
|
+
return {
|
|
69
|
+
content: [{ type: "text", text: JSON.stringify({ accepted: true, status: import_audio_buffer_service.audioBuffer.getStatus() }) }]
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
server.tool(
|
|
74
|
+
"get_audio_context",
|
|
75
|
+
"Get the most recent audio from the capture buffer. Returns base64-encoded WebM/Opus audio that multi-modal models can process directly. Use this when the user invokes you during a meeting or discussion \u2014 the audio provides conversation context without transcription.",
|
|
76
|
+
{
|
|
77
|
+
seconds: import_zod.z.number().optional().describe(
|
|
78
|
+
"How many seconds of recent audio to return (default: entire buffer, max: buffer size)"
|
|
79
|
+
)
|
|
80
|
+
},
|
|
81
|
+
async ({ seconds }) => {
|
|
82
|
+
const snapshot = import_audio_buffer_service.audioBuffer.getRecentAudio(seconds);
|
|
83
|
+
if (!snapshot) {
|
|
84
|
+
const status = import_audio_buffer_service.audioBuffer.getStatus();
|
|
85
|
+
const reason = status.capturing ? "Audio capture is active but the buffer is empty \u2014 no chunks received yet." : "Audio capture is not active. Ask the user to start audio capture first.";
|
|
86
|
+
return {
|
|
87
|
+
content: [{ type: "text", text: JSON.stringify({ error: "No audio available", reason, status }) }]
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
92
|
+
durationSeconds: snapshot.durationSeconds,
|
|
93
|
+
mimeType: snapshot.mimeType,
|
|
94
|
+
startsAt: snapshot.startsAt,
|
|
95
|
+
endsAt: snapshot.endsAt,
|
|
96
|
+
chunkCount: snapshot.chunkCount,
|
|
97
|
+
audioBase64: snapshot.audioBase64
|
|
98
|
+
}) }]
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
server.tool(
|
|
103
|
+
"get_audio_status",
|
|
104
|
+
"Check the audio capture state \u2014 whether capture is active, how much audio is buffered, and when capture started. Use this before get_audio_context to verify audio is available.",
|
|
105
|
+
{},
|
|
106
|
+
async () => {
|
|
107
|
+
const status = import_audio_buffer_service.audioBuffer.getStatus();
|
|
108
|
+
return {
|
|
109
|
+
content: [{ type: "text", text: JSON.stringify(status) }]
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
115
|
+
0 && (module.exports = {
|
|
116
|
+
registerAudioTools
|
|
117
|
+
});
|