@eir-labs/coltrane 0.4.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 +85 -0
- package/agents/anticipation-mapper.json +34 -0
- package/agents/claim-amender.json +34 -0
- package/agents/claim-architect.json +34 -0
- package/agents/claim-rewriter.json +32 -0
- package/agents/delivery-finalizer.json +40 -0
- package/agents/diamond-cutter.json +33 -0
- package/agents/disclosure-analyst.json +26 -0
- package/agents/domain-explorer.json +37 -0
- package/agents/e2e-runner.json +34 -0
- package/agents/e2e-suite-judge.json +26 -0
- package/agents/event-clusterer.json +29 -0
- package/agents/novelty-searcher.json +40 -0
- package/agents/patent-browser-scout.json +49 -0
- package/agents/patent-examiner.json +36 -0
- package/agents/phase_agents/claim-rewriter.md +44 -0
- package/agents/phase_agents/delivery-finalizer.md +30 -0
- package/agents/phase_agents/diamond-cutter.md +47 -0
- package/agents/phase_agents/domain-explorer.md +27 -0
- package/agents/phase_agents/novelty-searcher.md +50 -0
- package/agents/phase_agents/problem-definer.md +32 -0
- package/agents/phase_agents/solution-developer.md +26 -0
- package/agents/phase_agents/verdict-judger.md +70 -0
- package/agents/players/audience-modeler.md +40 -0
- package/agents/players/chain-audit-keeper.md +41 -0
- package/agents/players/illumination-reviewer.md +42 -0
- package/agents/players/methodology-cadence-keeper.md +42 -0
- package/agents/players/substrate-edge-keeper.md +45 -0
- package/agents/prior-art-scout.json +45 -0
- package/agents/problem-definer.json +35 -0
- package/agents/seeds/steve_seed_a.json +12 -0
- package/agents/seeds/steve_seed_b.json +12 -0
- package/agents/seeds/steve_seed_c.json +12 -0
- package/agents/seeds/steve_seed_d.json +12 -0
- package/agents/sensor.json +22 -0
- package/agents/solution-developer.json +35 -0
- package/agents/source-walker.json +38 -0
- package/agents/spec-drafter.json +31 -0
- package/agents/sub_thread_soft_judge.json +26 -0
- package/agents/sub_thread_trace_sensor.json +22 -0
- package/agents/summarizer.json +25 -0
- package/agents/synthesis-writer.json +29 -0
- package/agents/triage-judge.json +39 -0
- package/agents/user_flow_judge.json +26 -0
- package/agents/user_flow_sensor.json +22 -0
- package/agents/verdict-judger.json +39 -0
- package/core_types/artifact.json +17 -0
- package/core_types/interpretation.json +16 -0
- package/core_types/judgment.json +16 -0
- package/core_types/plan.json +16 -0
- package/core_types/signal.json +16 -0
- package/core_types/verdict.json +27 -0
- package/dist/src/access_grant.d.ts +46 -0
- package/dist/src/access_grant.js +76 -0
- package/dist/src/access_grant.js.map +1 -0
- package/dist/src/acoustics.d.ts +9 -0
- package/dist/src/acoustics.js +65 -0
- package/dist/src/acoustics.js.map +1 -0
- package/dist/src/agent_profile.d.ts +36 -0
- package/dist/src/agent_profile.js +57 -0
- package/dist/src/agent_profile.js.map +1 -0
- package/dist/src/bifrost_invoker.d.ts +33 -0
- package/dist/src/bifrost_invoker.js +85 -0
- package/dist/src/bifrost_invoker.js.map +1 -0
- package/dist/src/canonical_core_types.d.ts +2 -0
- package/dist/src/canonical_core_types.js +111 -0
- package/dist/src/canonical_core_types.js.map +1 -0
- package/dist/src/canonical_form.d.ts +55 -0
- package/dist/src/canonical_form.js +93 -0
- package/dist/src/canonical_form.js.map +1 -0
- package/dist/src/charter.d.ts +37 -0
- package/dist/src/charter.js +86 -0
- package/dist/src/charter.js.map +1 -0
- package/dist/src/circle_of_fifths.d.ts +27 -0
- package/dist/src/circle_of_fifths.js +78 -0
- package/dist/src/circle_of_fifths.js.map +1 -0
- package/dist/src/claude_invoker.d.ts +102 -0
- package/dist/src/claude_invoker.js +760 -0
- package/dist/src/claude_invoker.js.map +1 -0
- package/dist/src/coltrane_profile.d.ts +87 -0
- package/dist/src/coltrane_profile.js +132 -0
- package/dist/src/coltrane_profile.js.map +1 -0
- package/dist/src/composition.d.ts +57 -0
- package/dist/src/composition.js +447 -0
- package/dist/src/composition.js.map +1 -0
- package/dist/src/core_types.d.ts +6 -0
- package/dist/src/core_types.js +25 -0
- package/dist/src/core_types.js.map +1 -0
- package/dist/src/document_factory.d.ts +89 -0
- package/dist/src/document_factory.js +176 -0
- package/dist/src/document_factory.js.map +1 -0
- package/dist/src/genome_schema.d.ts +512 -0
- package/dist/src/genome_schema.js +168 -0
- package/dist/src/genome_schema.js.map +1 -0
- package/dist/src/genome_writer.d.ts +67 -0
- package/dist/src/genome_writer.js +179 -0
- package/dist/src/genome_writer.js.map +1 -0
- package/dist/src/gig_song.d.ts +29 -0
- package/dist/src/gig_song.js +56 -0
- package/dist/src/gig_song.js.map +1 -0
- package/dist/src/gig_tracker.d.ts +54 -0
- package/dist/src/gig_tracker.js +109 -0
- package/dist/src/gig_tracker.js.map +1 -0
- package/dist/src/harmonic_validation.d.ts +11 -0
- package/dist/src/harmonic_validation.js +35 -0
- package/dist/src/harmonic_validation.js.map +1 -0
- package/dist/src/hooks.d.ts +27 -0
- package/dist/src/hooks.js +2 -0
- package/dist/src/hooks.js.map +1 -0
- package/dist/src/index.d.ts +36 -0
- package/dist/src/index.js +37 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/jsong.d.ts +47 -0
- package/dist/src/jsong.js +130 -0
- package/dist/src/jsong.js.map +1 -0
- package/dist/src/judges/user_flow_judge.d.ts +89 -0
- package/dist/src/judges/user_flow_judge.js +200 -0
- package/dist/src/judges/user_flow_judge.js.map +1 -0
- package/dist/src/learner.d.ts +37 -0
- package/dist/src/learner.js +30 -0
- package/dist/src/learner.js.map +1 -0
- package/dist/src/ledger.d.ts +225 -0
- package/dist/src/ledger.js +306 -0
- package/dist/src/ledger.js.map +1 -0
- package/dist/src/loader.d.ts +87 -0
- package/dist/src/loader.js +504 -0
- package/dist/src/loader.js.map +1 -0
- package/dist/src/mcp.d.ts +23 -0
- package/dist/src/mcp.js +125 -0
- package/dist/src/mcp.js.map +1 -0
- package/dist/src/modulation_path.d.ts +42 -0
- package/dist/src/modulation_path.js +60 -0
- package/dist/src/modulation_path.js.map +1 -0
- package/dist/src/output_validation.d.ts +19 -0
- package/dist/src/output_validation.js +51 -0
- package/dist/src/output_validation.js.map +1 -0
- package/dist/src/outputs.d.ts +125 -0
- package/dist/src/outputs.js +452 -0
- package/dist/src/outputs.js.map +1 -0
- package/dist/src/overtones.d.ts +42 -0
- package/dist/src/overtones.js +98 -0
- package/dist/src/overtones.js.map +1 -0
- package/dist/src/player_to_claude_code.d.ts +17 -0
- package/dist/src/player_to_claude_code.js +141 -0
- package/dist/src/player_to_claude_code.js.map +1 -0
- package/dist/src/playwright_cage.d.ts +28 -0
- package/dist/src/playwright_cage.js +47 -0
- package/dist/src/playwright_cage.js.map +1 -0
- package/dist/src/polyphony.d.ts +46 -0
- package/dist/src/polyphony.js +91 -0
- package/dist/src/polyphony.js.map +1 -0
- package/dist/src/portfolio.d.ts +52 -0
- package/dist/src/portfolio.js +186 -0
- package/dist/src/portfolio.js.map +1 -0
- package/dist/src/pricing.d.ts +23 -0
- package/dist/src/pricing.js +16 -0
- package/dist/src/pricing.js.map +1 -0
- package/dist/src/registry.d.ts +46 -0
- package/dist/src/registry.js +199 -0
- package/dist/src/registry.js.map +1 -0
- package/dist/src/runtime.d.ts +304 -0
- package/dist/src/runtime.js +1099 -0
- package/dist/src/runtime.js.map +1 -0
- package/dist/src/server.d.ts +88 -0
- package/dist/src/server.js +1692 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/server_entry.d.ts +2 -0
- package/dist/src/server_entry.js +40 -0
- package/dist/src/server_entry.js.map +1 -0
- package/dist/src/server_relay.d.ts +82 -0
- package/dist/src/server_relay.js +341 -0
- package/dist/src/server_relay.js.map +1 -0
- package/dist/src/simulate.d.ts +60 -0
- package/dist/src/simulate.js +72 -0
- package/dist/src/simulate.js.map +1 -0
- package/dist/src/skill_runner.mjs +34 -0
- package/dist/src/skill_subprocess.d.ts +65 -0
- package/dist/src/skill_subprocess.js +132 -0
- package/dist/src/skill_subprocess.js.map +1 -0
- package/dist/src/skills.d.ts +85 -0
- package/dist/src/skills.js +258 -0
- package/dist/src/skills.js.map +1 -0
- package/dist/src/subthread_recorder.d.ts +68 -0
- package/dist/src/subthread_recorder.js +166 -0
- package/dist/src/subthread_recorder.js.map +1 -0
- package/dist/src/tensor_read.d.ts +38 -0
- package/dist/src/tensor_read.js +60 -0
- package/dist/src/tensor_read.js.map +1 -0
- package/dist/src/test_honest_broker.d.ts +34 -0
- package/dist/src/test_honest_broker.js +155 -0
- package/dist/src/test_honest_broker.js.map +1 -0
- package/dist/src/test_topology.d.ts +22 -0
- package/dist/src/test_topology.js +137 -0
- package/dist/src/test_topology.js.map +1 -0
- package/dist/src/tones.d.ts +20 -0
- package/dist/src/tones.js +81 -0
- package/dist/src/tones.js.map +1 -0
- package/dist/src/tool_providers.d.ts +45 -0
- package/dist/src/tool_providers.js +104 -0
- package/dist/src/tool_providers.js.map +1 -0
- package/dist/src/type_versioning.d.ts +23 -0
- package/dist/src/type_versioning.js +31 -0
- package/dist/src/type_versioning.js.map +1 -0
- package/dist/src/version.d.ts +28 -0
- package/dist/src/version.js +86 -0
- package/dist/src/version.js.map +1 -0
- package/domain_types/claim-draft.json +34 -0
- package/domain_types/coverage-report.json +31 -0
- package/domain_types/draft-agent-profile.json +31 -0
- package/domain_types/draft-domain-type.json +28 -0
- package/domain_types/draft-standard.json +46 -0
- package/domain_types/e2e-observation.json +32 -0
- package/domain_types/e2e-report.json +30 -0
- package/domain_types/e2e-target.json +26 -0
- package/domain_types/e2e-verdict.json +26 -0
- package/domain_types/examine-round-record.json +40 -0
- package/domain_types/examiner-rejection.json +28 -0
- package/domain_types/failure-modes.json +31 -0
- package/domain_types/invention-analysis.json +34 -0
- package/domain_types/invention-spec.json +34 -0
- package/domain_types/novelty-analysis.json +28 -0
- package/domain_types/novelty-verdict.json +35 -0
- package/domain_types/parsed-conversation-trace.json +38 -0
- package/domain_types/pattern-extraction.json +62 -0
- package/domain_types/prior-art-hit.json +50 -0
- package/domain_types/project-charter.json +71 -0
- package/domain_types/provisional-draft.json +34 -0
- package/domain_types/raw-note.json +19 -0
- package/domain_types/repo-survey.json +28 -0
- package/domain_types/seeding-verdict.json +70 -0
- package/domain_types/soft-verdict.json +55 -0
- package/domain_types/summary.json +19 -0
- package/domain_types/triage-verdict.json +59 -0
- package/domain_types/user-flow-transcript.json +43 -0
- package/domain_types/user-flow-verdict.json +60 -0
- package/domain_types/verdict-record.json +39 -0
- package/package.json +82 -0
- package/skills/citation-verify/fixtures/basic.json +14 -0
- package/skills/citation-verify/meta.json +10 -0
- package/skills/citation-verify/skill.mjs +26 -0
- package/skills/claim-element-decompose/fixtures/basic.json +11 -0
- package/skills/claim-element-decompose/meta.json +10 -0
- package/skills/claim-element-decompose/skill.mjs +14 -0
- package/skills/diamond-cutting-discipline/fixtures/basic.json +13 -0
- package/skills/diamond-cutting-discipline/meta.json +19 -0
- package/skills/diamond-cutting-discipline/skill.md +46 -0
- package/skills/element-mapping-matrix/fixtures/basic.json +13 -0
- package/skills/element-mapping-matrix/meta.json +10 -0
- package/skills/element-mapping-matrix/skill.mjs +20 -0
- package/skills/number-adder/fixtures/basic.json +9 -0
- package/skills/number-adder/meta.json +10 -0
- package/skills/number-adder/skill.mjs +12 -0
- package/skills/patent-fetch/fixtures/parse.json +18 -0
- package/skills/patent-fetch/meta.json +11 -0
- package/skills/patent-fetch/skill.mjs +34 -0
- package/skills/query-expand/fixtures/basic.json +14 -0
- package/skills/query-expand/meta.json +10 -0
- package/skills/query-expand/skill.mjs +29 -0
- package/skills/run-vitest-band/fixtures/basic.json +9 -0
- package/skills/run-vitest-band/meta.json +18 -0
- package/skills/run-vitest-band/skill.mjs +22 -0
- package/skills/statutory-checklist/fixtures/basic.json +16 -0
- package/skills/statutory-checklist/meta.json +10 -0
- package/skills/statutory-checklist/skill.mjs +25 -0
- package/skills/summarize-tight/fixtures/basic.json +13 -0
- package/skills/summarize-tight/meta.json +20 -0
- package/skills/summarize-tight/skill.md +1 -0
- package/skills/verdict-gate/fixtures/basic.json +9 -0
- package/skills/verdict-gate/meta.json +10 -0
- package/skills/verdict-gate/skill.mjs +82 -0
- package/standards/e2e-suite-v0.json +44 -0
- package/standards/patent-triage-v0.json +98 -0
- package/standards/patent-triage-v1.json +84 -0
- package/standards/seed-from-local-repos-v0.json +115 -0
- package/standards/sub_thread_invocation.json +50 -0
- package/standards/summarize.json +40 -0
- package/standards/synthesis-walk-v0.json +108 -0
- package/standards/user_flow_correctness.json +57 -0
package/dist/src/mcp.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { zodToMcpProps, AgentSchema, StandardSchema, SkillSchema, DomainTypeSchema } from "./genome_schema.js";
|
|
2
|
+
// A property value is either a bare JSON-schema type name (the common case) or a full schema
|
|
3
|
+
// fragment — needed for fields that are honestly nullable, e.g. a measurement the engine has no
|
|
4
|
+
// data to compute (#238). Declaring those as plain "number" is the same lie as returning 1.0.
|
|
5
|
+
const obj = (props) => ({
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: Object.fromEntries(Object.entries(props).map(([k, v]) => [k, typeof v === "string" ? { type: v } : v])),
|
|
8
|
+
});
|
|
9
|
+
const nullable = (type) => ({ type: [type, "null"] });
|
|
10
|
+
// Select named fields from a generated prop map (preserving their derived JSON types).
|
|
11
|
+
const pickProps = (src, keys) => Object.fromEntries(keys.filter((k) => src[k] !== undefined).map((k) => [k, src[k]]));
|
|
12
|
+
// type_register's surface is the AUTHORED projection of DomainTypeSchema (the single source) — field
|
|
13
|
+
// types are generated, so they can't drift from the schema; version/status are server-assigned (not
|
|
14
|
+
// authored), and `reason` is approval metadata. (type_extend is an extension DELTA — fields_to_add is
|
|
15
|
+
// not a restatement of the type record — so there's nothing to derive there.)
|
|
16
|
+
const DT_AUTHORED = pickProps(zodToMcpProps(DomainTypeSchema), ["slug", "extends", "domain", "schema", "required_fields"]);
|
|
17
|
+
export const MCP_TOOLS = [
|
|
18
|
+
{ slug: "type_resolve", category: "understand", input_schema: obj({ core_type: "string", domain: "string", semantic_description: "string", required_fields: "array" }), output_schema: obj({ action: "string", candidates: "array", recommendation: "object" }) },
|
|
19
|
+
{ slug: "type_browse", category: "understand", input_schema: obj({ domain: "string", extends: "string", min_usage: "number", status: "string" }), output_schema: obj({ types: "array", stats: "object" }) },
|
|
20
|
+
{ slug: "tool_registry_browse", category: "understand", input_schema: obj({ category: "string", usage_min: "number", unused_since: "string" }), output_schema: obj({ tools: "array", usage_stats: "array", dependency_map: "object" }) },
|
|
21
|
+
{ slug: "output_query", category: "understand", input_schema: obj({ domain_type: "string", gig_id: "string", agent_slug: "string", data_filter: "object" }), output_schema: obj({ outputs: "array", total_count: "number" }) },
|
|
22
|
+
{ slug: "output_trace", category: "understand", input_schema: obj({ output_id: "string", direction: "string", max_depth: "number" }), output_schema: obj({ graph: "object", root_signals: "array", terminal_outputs: "array" }) },
|
|
23
|
+
{ slug: "charter_read", category: "understand", input_schema: obj({ company_id: "string" }), output_schema: obj({ products: "array", goals: "array", pain_points: "array", tech_stack: "array", access_grants: "array" }) },
|
|
24
|
+
// #217 — advertised contract == handler. The five filters src/server.ts actually reads, and
|
|
25
|
+
// the two keys it actually returns. The old {company_id, domain} in / {gigs,
|
|
26
|
+
// performance_summary} out overlapped the handler in neither direction, so a client
|
|
27
|
+
// following the surface got an UNFILTERED DUMP of the audit trail and then looked for a key
|
|
28
|
+
// that was never returned.
|
|
29
|
+
{ slug: "execution_history_read", category: "understand", input_schema: obj({ gig_id: "string", standard_slug: "string", genome_hash: "string", after: "string", before: "string" }), output_schema: obj({ executions: "array", count: "number" }) },
|
|
30
|
+
{ slug: "access_grant_check", category: "understand", input_schema: obj({ company_id: "string", resource_uri: "string", required_permissions: "array" }), output_schema: obj({ granted: "boolean", missing_permissions: "array", expires_in: "number" }) },
|
|
31
|
+
{ slug: "type_register", category: "build", input_schema: obj({ ...DT_AUTHORED, reason: "string" }), output_schema: obj({ registered: "boolean", domain_type_id: "string", version: "number" }) },
|
|
32
|
+
{ slug: "type_extend", category: "build", input_schema: obj({ slug: "string", domain: "string", fields_to_add: "object", reason: "string" }), output_schema: obj({ new_version: "number", changelog_entry: "string" }) },
|
|
33
|
+
{ slug: "agent_define", category: "build", input_schema: obj(zodToMcpProps(AgentSchema)), output_schema: obj({ agent_profile_id: "string", validation_result: "object" }) },
|
|
34
|
+
{ slug: "agent_evolve", category: "build", input_schema: obj({ slug: "string", changes: "object", reason: "string", evidence: "object" }), output_schema: obj({ new_version: "number", cascade_check: "object" }) },
|
|
35
|
+
{ slug: "standard_compose", category: "build", input_schema: obj(zodToMcpProps(StandardSchema)), output_schema: obj({ standard_id: "string", validation_result: "object" }) },
|
|
36
|
+
// #239 — `basis`/`sample_size` say WHERE the estimate came from (a measured mean of real runs,
|
|
37
|
+
// the standard's real structure, or a per-slug guess). estimated_duration_ms is the key the
|
|
38
|
+
// handler actually returns; the old `estimated_duration` was never present on a response.
|
|
39
|
+
{ slug: "standard_simulate", category: "build", input_schema: obj({ standard_slug: "string", mock_input: "object", depth: "string" }), output_schema: obj({ phases: "array", estimated_cost: "number", estimated_duration_ms: "number", basis: "string", sample_size: "number" }) },
|
|
40
|
+
// #237 — `depth` is read now (and rejected when unrecognized); the response echoes the depth
|
|
41
|
+
// the run actually took, so "I ran a cheap iteration" is verifiable rather than assumed.
|
|
42
|
+
{ slug: "gig_dispatch", category: "run", input_schema: obj({ standard_slug: "string", input: "object", depth: "string", company_id: "string", wait: "boolean" }), output_schema: obj({ gig_id: "string", status: "string", depth: "string", manifest: "object" }) },
|
|
43
|
+
{ slug: "gig_monitor", category: "run", input_schema: obj({ gig_id: "string" }), output_schema: obj({ status: "string", phases_complete: "number", current_phase: "string", chairs: "array", outputs_so_far: "array" }) },
|
|
44
|
+
{ slug: "gig_logs", category: "understand", input_schema: obj({ gig_id: "string", role: "string", type: "string", tail: "number" }), output_schema: obj({ gig_id: "string", roles: "array", count: "number", events: "array" }) },
|
|
45
|
+
// #251 — `status` is the field both existing tests actually assert and it was not advertised.
|
|
46
|
+
// `aborted` now means "this call delivered a cancellation to a live run", not "we looked at
|
|
47
|
+
// the stores and guessed"; `cancellable` says whether this server could reach the run at all.
|
|
48
|
+
{ slug: "gig_abort", category: "run", input_schema: obj({ gig_id: "string", reason: "string" }), output_schema: obj({ status: "string", aborted: "boolean", cancellable: "boolean", cleanup_result: "object" }) },
|
|
49
|
+
{ slug: "output_write", category: "run", input_schema: obj({ core_type: "string", domain_type: "string", data: "object", input_refs: "array", refs: "array" }), output_schema: obj({ output_id: "string", validation_result: "object" }) },
|
|
50
|
+
{ slug: "agent_validate_pipeline", category: "improve", input_schema: obj({ agents: "array", standard_slug: "string" }), output_schema: obj({ valid: "boolean", graph: "object", unsatisfied_inputs: "array", illegal_progressions: "array" }) },
|
|
51
|
+
// #238 — success_rate and trend are NULLABLE, because the engine genuinely cannot compute
|
|
52
|
+
// them (a failed gig writes no ledger row, so the denominator does not exist) and a hardcoded
|
|
53
|
+
// 1.0 is a fabricated measurement presented as a measurement. The `*_basis` strings say why.
|
|
54
|
+
// `cost_usd` is real settled spend off the gig rows (#195), not an output count.
|
|
55
|
+
{ slug: "health_check", category: "improve", input_schema: obj({ entity_type: "string", kind: "string", slug: "string", window: "string" }), output_schema: obj({ entity: "string", kind: "string", output_count: "number", execution_count: "number", usage: "number", success_rate: nullable("number"), success_rate_basis: "string", cost: "number", cost_usd: "number", cost_basis: "string", trend: nullable("string"), trend_basis: "string", recommendations: "array" }) },
|
|
56
|
+
// #255 — the integrity fields are ADVERTISED, not just returned. This tool's whole purpose
|
|
57
|
+
// is that an operator can ask whether the system is healthy; a damage report they cannot
|
|
58
|
+
// discover from the schema is only marginally better than one that is never computed.
|
|
59
|
+
{ slug: "system_health", category: "improve", input_schema: obj({ window: "string" }), output_schema: obj({ gigs_run: "number", cost: "number", type_stats: "object", agent_stats: "object", tool_stats: "object", bottlenecks: "array", budget: "object", load_errors: "array", ledger_integrity: "object", outputs_integrity: "object", counts_complete: "boolean", counts_complete_basis: "string" }) },
|
|
60
|
+
// genome_reload — Rob #130. Re-reads agents/standards/types/skills/evals from
|
|
61
|
+
// disk and updates the live deps in place (no MCP server restart needed).
|
|
62
|
+
// Returns the diff vs the prior state, plus any load_errors from the new genome.
|
|
63
|
+
{ slug: "genome_reload", category: "improve", input_schema: obj({}), output_schema: obj({ reloaded: "boolean", changes: "object", load_errors: "array" }) },
|
|
64
|
+
// server_restart — Rob #N / PR #141. Picks up new server bytes after
|
|
65
|
+
// npm run build without ending the Claude Code conversation. This entry
|
|
66
|
+
// exists so coltrane's own introspection (tool_inspect, system_audit)
|
|
67
|
+
// sees the tool — but the server itself never executes it. The relay
|
|
68
|
+
// parent-process catches `tools/call server_restart` before it reaches
|
|
69
|
+
// the child server, kills + respawns the child, and replies. If the
|
|
70
|
+
// server-side handler below is ever reached, the relay is misconfigured
|
|
71
|
+
// (typically: COLTRANE_SERVER_DIRECT=1 was set, bypassing the relay).
|
|
72
|
+
{ slug: "server_restart", category: "improve", input_schema: obj({}), output_schema: obj({ restarted: "boolean", note: "string" }) },
|
|
73
|
+
{ slug: "system_audit", category: "improve", input_schema: obj({ scope: "string", check: "string" }), output_schema: obj({ findings: "array" }) },
|
|
74
|
+
{ slug: "proposal_create", category: "improve", input_schema: obj({ change_type: "string", target: "string", changes: "object", reason: "string", evidence: "object" }), output_schema: obj({ proposal_id: "string", cascade_impact: "object" }) },
|
|
75
|
+
{ slug: "tool_propose", category: "improve", input_schema: obj({ slug: "string", type: "string", spec: "object", reason: "string" }), output_schema: obj({ proposal_id: "string" }) },
|
|
76
|
+
// tool_register — close the propose→register loop. Adds a slug to the live
|
|
77
|
+
// tool registry so subsequent agent_define calls can grant scope to it.
|
|
78
|
+
// Without this, propose-only governance is half-built: there is no path to
|
|
79
|
+
// legitimately admit a tool, and the rejection gate becomes a permanent block.
|
|
80
|
+
{ slug: "tool_register", category: "improve", input_schema: obj({ slug: "string", type: "string", spec: "object", category: "string" }), output_schema: obj({ registered: "boolean", slug: "string" }) },
|
|
81
|
+
{ slug: "tool_deprecate_propose", category: "improve", input_schema: obj({ slug: "string", reason: "string", usage_stats: "object" }), output_schema: obj({ proposal_id: "string", affected_agents: "array" }) },
|
|
82
|
+
{ slug: "capability_research", category: "improve", input_schema: obj({ need: "string", context: "object" }), output_schema: obj({ approaches: "array", mcp_options: "array", recommendation: "object" }) },
|
|
83
|
+
{ slug: "session_review_write", category: "improve", input_schema: obj({ gig_id: "string", output_id: "string", agent_slug: "string", agent_version: "number", quality_score: "number", quality_scores: "object", domain: "string", notes: "string" }), output_schema: obj({ review_id: "string", recorded: "boolean" }) },
|
|
84
|
+
{ slug: "learning_synthesize", category: "improve", input_schema: obj({ agent_slug: "string", min_reviews: "number", since: "string", auto_propose: "boolean" }), output_schema: obj({ agent_slug: "string", review_count: "number", evidence_sufficient: "boolean", summary: "object", proposal_id: "string" }) },
|
|
85
|
+
{ slug: "agent_promote", category: "build", input_schema: obj({ slug: "string", status: "string" }), output_schema: obj({ slug: "string", status: "string", promoted: "boolean" }) },
|
|
86
|
+
{ slug: "standard_promote", category: "build", input_schema: obj({ slug: "string", status: "string" }), output_schema: obj({ slug: "string", status: "string", promoted: "boolean" }) },
|
|
87
|
+
{ slug: "skill_define", category: "build", input_schema: obj(zodToMcpProps(SkillSchema)), output_schema: obj({ skill_id: "string", content_hash: "string" }) },
|
|
88
|
+
{ slug: "skill_promote", category: "build", input_schema: obj({ slug: "string", status: "string" }), output_schema: obj({ slug: "string", status: "string", promoted: "boolean" }) },
|
|
89
|
+
{ slug: "charter_suggest_update", category: "manage_context", input_schema: obj({ company_id: "string", field: "string", current_value: "string", suggested_value: "string", evidence: "object" }), output_schema: obj({ proposal_id: "string" }) },
|
|
90
|
+
];
|
|
91
|
+
// Lifecycle promotion order — forward-only. agent/standard share the same chain;
|
|
92
|
+
// skill includes the explicit `testing` step before active.
|
|
93
|
+
export const AGENT_STATUS_ORDER = ["draft", "review", "approved", "active", "retired"];
|
|
94
|
+
export const STANDARD_STATUS_ORDER = ["draft", "active", "retired"];
|
|
95
|
+
export const SKILL_STATUS_ORDER = ["draft", "testing", "active", "retired"];
|
|
96
|
+
export class PromotionError extends Error {
|
|
97
|
+
}
|
|
98
|
+
/** Validate a forward-only transition through the given status chain. Throws on
|
|
99
|
+
* unknown current/target or any backward/sideways move. Idempotent (current = target). */
|
|
100
|
+
export function checkPromotion(current, target, order) {
|
|
101
|
+
const ci = order.indexOf(current);
|
|
102
|
+
const ti = order.indexOf(target);
|
|
103
|
+
if (ci < 0)
|
|
104
|
+
throw new PromotionError(`unknown current status "${current}"`);
|
|
105
|
+
if (ti < 0)
|
|
106
|
+
throw new PromotionError(`unknown target status "${target}"`);
|
|
107
|
+
if (ti < ci)
|
|
108
|
+
throw new PromotionError(`cannot promote backwards: ${current} → ${target}`);
|
|
109
|
+
}
|
|
110
|
+
const ALWAYS_APPROVAL = new Set([
|
|
111
|
+
"tool_propose",
|
|
112
|
+
"tool_deprecate_propose",
|
|
113
|
+
"charter_suggest_update",
|
|
114
|
+
]);
|
|
115
|
+
const APPROVAL_IF_BREAKING = new Set(["type_register", "type_extend"]);
|
|
116
|
+
export function requiresApproval(q) {
|
|
117
|
+
if (ALWAYS_APPROVAL.has(q.slug))
|
|
118
|
+
return true;
|
|
119
|
+
if (APPROVAL_IF_BREAKING.has(q.slug))
|
|
120
|
+
return q.change_class === "breaking";
|
|
121
|
+
if (q.slug === "proposal_create")
|
|
122
|
+
return q.target_kind === "permissions";
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type Key, type ModulationKind } from "./circle_of_fifths.js";
|
|
2
|
+
export interface PhaseStep {
|
|
3
|
+
phase: string;
|
|
4
|
+
key: Key;
|
|
5
|
+
}
|
|
6
|
+
export interface PathTransition {
|
|
7
|
+
from_phase: string;
|
|
8
|
+
to_phase: string;
|
|
9
|
+
from_key: Key;
|
|
10
|
+
to_key: Key;
|
|
11
|
+
distance: number;
|
|
12
|
+
kind: ModulationKind;
|
|
13
|
+
}
|
|
14
|
+
export interface ModulationPath {
|
|
15
|
+
steps: readonly PhaseStep[];
|
|
16
|
+
transitions: readonly PathTransition[];
|
|
17
|
+
starts_in: Key;
|
|
18
|
+
ends_in: Key;
|
|
19
|
+
}
|
|
20
|
+
export declare class ModulationPathError extends Error {
|
|
21
|
+
}
|
|
22
|
+
export declare function buildPath(steps: readonly PhaseStep[]): ModulationPath;
|
|
23
|
+
/**
|
|
24
|
+
* Lawful-only: every transition is either stay or lawful (no jarring jumps).
|
|
25
|
+
* Used by the validation tensor as ONE channel-read — not a global verdict.
|
|
26
|
+
*/
|
|
27
|
+
export declare function isLawful(path: ModulationPath): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Count jarring transitions. Returned as a number, not a boolean, so a
|
|
30
|
+
* validator can weight it inside a tensor instead of collapsing to pass/fail.
|
|
31
|
+
*/
|
|
32
|
+
export declare function jarringCount(path: ModulationPath): number;
|
|
33
|
+
/**
|
|
34
|
+
* Total distance traveled along the trajectory. Sum of per-step circle-of-fifths
|
|
35
|
+
* distances. NOT a verdict — a feature for the validation tensor.
|
|
36
|
+
*/
|
|
37
|
+
export declare function totalTravel(path: ModulationPath): number;
|
|
38
|
+
/**
|
|
39
|
+
* Did the path return to its starting key (closed loop)? Cadence-shaped:
|
|
40
|
+
* a song that resolves to where it began. Feature, not verdict.
|
|
41
|
+
*/
|
|
42
|
+
export declare function returnsHome(path: ModulationPath): boolean;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// The per-gig journey through 12-key space. A modulation path is the song's
|
|
2
|
+
// trajectory: which key it's in at each phase, what kind of move it made to get
|
|
3
|
+
// there. NOT collapsed to a scalar — preserved as a per-phase sequence so a
|
|
4
|
+
// validator can read it as one channel in a multi-channel tensor.
|
|
5
|
+
import { circleOfFifthsDistance, classifyModulation, } from "./circle_of_fifths.js";
|
|
6
|
+
export class ModulationPathError extends Error {
|
|
7
|
+
}
|
|
8
|
+
export function buildPath(steps) {
|
|
9
|
+
if (steps.length === 0) {
|
|
10
|
+
throw new ModulationPathError("modulation path requires at least one step");
|
|
11
|
+
}
|
|
12
|
+
const transitions = [];
|
|
13
|
+
for (let i = 1; i < steps.length; i++) {
|
|
14
|
+
const a = steps[i - 1];
|
|
15
|
+
const b = steps[i];
|
|
16
|
+
transitions.push({
|
|
17
|
+
from_phase: a.phase,
|
|
18
|
+
to_phase: b.phase,
|
|
19
|
+
from_key: a.key,
|
|
20
|
+
to_key: b.key,
|
|
21
|
+
distance: circleOfFifthsDistance(a.key, b.key),
|
|
22
|
+
kind: classifyModulation(a.key, b.key),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
steps,
|
|
27
|
+
transitions,
|
|
28
|
+
starts_in: steps[0].key,
|
|
29
|
+
ends_in: steps[steps.length - 1].key,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Lawful-only: every transition is either stay or lawful (no jarring jumps).
|
|
34
|
+
* Used by the validation tensor as ONE channel-read — not a global verdict.
|
|
35
|
+
*/
|
|
36
|
+
export function isLawful(path) {
|
|
37
|
+
return path.transitions.every((t) => t.kind !== "jarring");
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Count jarring transitions. Returned as a number, not a boolean, so a
|
|
41
|
+
* validator can weight it inside a tensor instead of collapsing to pass/fail.
|
|
42
|
+
*/
|
|
43
|
+
export function jarringCount(path) {
|
|
44
|
+
return path.transitions.filter((t) => t.kind === "jarring").length;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Total distance traveled along the trajectory. Sum of per-step circle-of-fifths
|
|
48
|
+
* distances. NOT a verdict — a feature for the validation tensor.
|
|
49
|
+
*/
|
|
50
|
+
export function totalTravel(path) {
|
|
51
|
+
return path.transitions.reduce((acc, t) => acc + t.distance, 0);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Did the path return to its starting key (closed loop)? Cadence-shaped:
|
|
55
|
+
* a song that resolves to where it began. Feature, not verdict.
|
|
56
|
+
*/
|
|
57
|
+
export function returnsHome(path) {
|
|
58
|
+
return path.starts_in === path.ends_in;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=modulation_path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modulation_path.js","sourceRoot":"","sources":["../../src/modulation_path.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,gFAAgF;AAChF,4EAA4E;AAC5E,kEAAkE;AAElE,OAAO,EAEL,sBAAsB,EACtB,kBAAkB,GAEnB,MAAM,uBAAuB,CAAC;AA0B/B,MAAM,OAAO,mBAAoB,SAAQ,KAAK;CAAG;AAEjD,MAAM,UAAU,SAAS,CAAC,KAA2B;IACnD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,mBAAmB,CAAC,4CAA4C,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,WAAW,GAAqB,EAAE,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACpB,WAAW,CAAC,IAAI,CAAC;YACf,UAAU,EAAE,CAAC,CAAC,KAAK;YACnB,QAAQ,EAAE,CAAC,CAAC,KAAK;YACjB,QAAQ,EAAE,CAAC,CAAC,GAAG;YACf,MAAM,EAAE,CAAC,CAAC,GAAG;YACb,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;YAC9C,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IACD,OAAO;QACL,KAAK;QACL,WAAW;QACX,SAAS,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,GAAG;QACxB,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,GAAG;KACtC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAoB;IAC3C,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAoB;IAC/C,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;AACrE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAoB;IAC9C,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAoB;IAC9C,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,OAAO,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type CoreType } from "./core_types.js";
|
|
2
|
+
export interface OutputCandidate {
|
|
3
|
+
core_type: CoreType;
|
|
4
|
+
domain_type: string;
|
|
5
|
+
data: Record<string, unknown>;
|
|
6
|
+
}
|
|
7
|
+
export interface ValidationResult {
|
|
8
|
+
valid: boolean;
|
|
9
|
+
reason?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface SubstanceRule {
|
|
12
|
+
field: string;
|
|
13
|
+
/** the declared JSON type of the floor field — decides what "empty" means */
|
|
14
|
+
shape: "array" | "string";
|
|
15
|
+
/** for array floors: a property every item must carry as a non-empty string */
|
|
16
|
+
item_requires?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare const CORE_SUBSTANCE: Readonly<Record<CoreType, SubstanceRule>>;
|
|
19
|
+
export declare function validateOutput(out: OutputCandidate): ValidationResult;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { CORE_TYPES } from "./core_types.js";
|
|
2
|
+
export const CORE_SUBSTANCE = {
|
|
3
|
+
Signal: { field: "source", shape: "string" },
|
|
4
|
+
Interpretation: { field: "claims", shape: "array" },
|
|
5
|
+
Plan: { field: "steps", shape: "array" },
|
|
6
|
+
Judgment: { field: "criteria", shape: "array" },
|
|
7
|
+
Artifact: { field: "validation_criteria", shape: "array" },
|
|
8
|
+
Verdict: { field: "checks", shape: "array", item_requires: "method" },
|
|
9
|
+
};
|
|
10
|
+
// Compile-time + load-time guard: every core has a floor. A seventh core (or a rename)
|
|
11
|
+
// cannot land without deciding what makes it substantive.
|
|
12
|
+
for (const core of CORE_TYPES) {
|
|
13
|
+
if (!CORE_SUBSTANCE[core])
|
|
14
|
+
throw new Error(`core type "${core}" has no substance invariant`);
|
|
15
|
+
}
|
|
16
|
+
export function validateOutput(out) {
|
|
17
|
+
const rule = CORE_SUBSTANCE[out.core_type];
|
|
18
|
+
// An unrecognised core_type is not this function's contract to police (the loader and
|
|
19
|
+
// the registry own that); it simply has no floor to apply.
|
|
20
|
+
if (!rule)
|
|
21
|
+
return { valid: true };
|
|
22
|
+
const value = out.data[rule.field];
|
|
23
|
+
if (rule.shape === "array") {
|
|
24
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
25
|
+
return {
|
|
26
|
+
valid: false,
|
|
27
|
+
reason: `${out.core_type} requires non-empty ${rule.field}[]`,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (rule.item_requires) {
|
|
31
|
+
for (const item of value) {
|
|
32
|
+
const got = item?.[rule.item_requires];
|
|
33
|
+
if (typeof got !== "string" || got.length === 0) {
|
|
34
|
+
return {
|
|
35
|
+
valid: false,
|
|
36
|
+
reason: `${out.core_type}.${rule.field}[*].${rule.item_requires} is required (string)`,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return { valid: true };
|
|
42
|
+
}
|
|
43
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
44
|
+
return {
|
|
45
|
+
valid: false,
|
|
46
|
+
reason: `${out.core_type} requires a non-empty ${rule.field}`,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
return { valid: true };
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=output_validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output_validation.js","sourceRoot":"","sources":["../../src/output_validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,iBAAiB,CAAC;AA2E5D,MAAM,CAAC,MAAM,cAAc,GAA8C;IACvE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;IAC5C,cAAc,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;IACnD,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IACxC,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE;IAC/C,QAAQ,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE;IAC1D,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE;CACtE,CAAC;AAEF,uFAAuF;AACvF,0DAA0D;AAC1D,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;IAC9B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,8BAA8B,CAAC,CAAC;AAC/F,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAoB;IACjD,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC3C,sFAAsF;IACtF,2DAA2D;IAC3D,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAElC,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChD,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,uBAAuB,IAAI,CAAC,KAAK,IAAI;aAC9D,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,KAAK,MAAM,IAAI,IAAI,KAAqB,EAAE,CAAC;gBACzC,MAAM,GAAG,GAAI,IAAmD,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACvF,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAChD,OAAO;wBACL,KAAK,EAAE,KAAK;wBACZ,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,aAAa,uBAAuB;qBACvF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,yBAAyB,IAAI,CAAC,KAAK,EAAE;SAC9D,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import type { Registry } from "./registry.js";
|
|
2
|
+
export declare const REF_RELATIONS: readonly ["derived_from", "validates", "challenges", "refines", "triggers", "contains"];
|
|
3
|
+
export type RefRelation = (typeof REF_RELATIONS)[number];
|
|
4
|
+
export interface OutputRecord {
|
|
5
|
+
id: string;
|
|
6
|
+
core_type: string;
|
|
7
|
+
domain_type: string;
|
|
8
|
+
domain_type_version: number;
|
|
9
|
+
domain: string;
|
|
10
|
+
gig_id: string;
|
|
11
|
+
agent_slug: string;
|
|
12
|
+
from_role?: string | undefined;
|
|
13
|
+
phase?: string | undefined;
|
|
14
|
+
primitive: string;
|
|
15
|
+
data: Record<string, unknown>;
|
|
16
|
+
content_sha: string;
|
|
17
|
+
input_refs: string[];
|
|
18
|
+
input_shas: string[];
|
|
19
|
+
created_at: string;
|
|
20
|
+
cost_usd?: number | undefined;
|
|
21
|
+
tokens_used?: number | undefined;
|
|
22
|
+
duration_ms?: number | undefined;
|
|
23
|
+
skill_provenance?: {
|
|
24
|
+
slug: string;
|
|
25
|
+
version: number;
|
|
26
|
+
code_hash: string;
|
|
27
|
+
tier: number;
|
|
28
|
+
} | undefined;
|
|
29
|
+
}
|
|
30
|
+
export interface OutputWrite {
|
|
31
|
+
core_type: string;
|
|
32
|
+
domain_type: string;
|
|
33
|
+
domain_type_version?: number | undefined;
|
|
34
|
+
domain: string;
|
|
35
|
+
gig_id: string;
|
|
36
|
+
agent_slug: string;
|
|
37
|
+
from_role?: string | undefined;
|
|
38
|
+
phase?: string | undefined;
|
|
39
|
+
primitive: string;
|
|
40
|
+
data: Record<string, unknown>;
|
|
41
|
+
input_refs?: string[] | undefined;
|
|
42
|
+
/** content_sha of each input_ref (same order) — the real predecessor hashes (#196). When omitted,
|
|
43
|
+
* write() resolves them from the store by input_refs id. */
|
|
44
|
+
input_shas?: string[] | undefined;
|
|
45
|
+
cost_usd?: number | undefined;
|
|
46
|
+
tokens_used?: number | undefined;
|
|
47
|
+
duration_ms?: number | undefined;
|
|
48
|
+
skill_provenance?: {
|
|
49
|
+
slug: string;
|
|
50
|
+
version: number;
|
|
51
|
+
code_hash: string;
|
|
52
|
+
tier: number;
|
|
53
|
+
} | undefined;
|
|
54
|
+
}
|
|
55
|
+
export interface OutputRef {
|
|
56
|
+
id: string;
|
|
57
|
+
from_output_id: string;
|
|
58
|
+
to_output_id: string;
|
|
59
|
+
relation: RefRelation;
|
|
60
|
+
primitive: string;
|
|
61
|
+
created_at: string;
|
|
62
|
+
}
|
|
63
|
+
export interface Finding {
|
|
64
|
+
id: string;
|
|
65
|
+
gig_id: string;
|
|
66
|
+
pattern_key?: string | undefined;
|
|
67
|
+
severity?: string | undefined;
|
|
68
|
+
title?: string | undefined;
|
|
69
|
+
evidence?: string | undefined;
|
|
70
|
+
location?: string | undefined;
|
|
71
|
+
recommendation?: string | undefined;
|
|
72
|
+
is_novel?: boolean | undefined;
|
|
73
|
+
kpi_impacts?: unknown;
|
|
74
|
+
status?: string | undefined;
|
|
75
|
+
agent_role: string;
|
|
76
|
+
dimension?: string | undefined;
|
|
77
|
+
created_at: string;
|
|
78
|
+
}
|
|
79
|
+
export declare class OutputStoreError extends Error {
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* One unreadable line in a persisted jsonl file. Same vocabulary as the ledger's
|
|
83
|
+
* `LedgerCorruption` (#211) — two stores in one engine should describe damage the same way.
|
|
84
|
+
*/
|
|
85
|
+
export interface OutputStoreCorruption {
|
|
86
|
+
path: string;
|
|
87
|
+
line_no: number;
|
|
88
|
+
reason: string;
|
|
89
|
+
preview: string;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* #248 — skip-and-REPORT, the shape PR #256 established for the ledger.
|
|
93
|
+
*
|
|
94
|
+
* A silent skip let a torn append (crash mid-write, disk full) delete an output from `all()`,
|
|
95
|
+
* `trace()` and `output_query` with no signal at all, so the engine reported a SHORTER CHAIN
|
|
96
|
+
* as if it were the whole chain. That is the exact INVERSE of the ledger's old problem, where
|
|
97
|
+
* the same situation threw and took the entire audit surface offline. Two stores, opposite
|
|
98
|
+
* failure modes, neither correct: one hid corruption, the other was destroyed by it. Reads
|
|
99
|
+
* stay forgiving — the intact rows keep serving — and this is how an operator learns the
|
|
100
|
+
* store is damaged.
|
|
101
|
+
*/
|
|
102
|
+
export interface OutputStoreIntegrityReport {
|
|
103
|
+
ok: boolean;
|
|
104
|
+
/** jsonl files actually read this session. 0 for a purely in-memory store. */
|
|
105
|
+
scanned: number;
|
|
106
|
+
corrupt: OutputStoreCorruption[];
|
|
107
|
+
}
|
|
108
|
+
export interface OutputStore {
|
|
109
|
+
write(o: OutputWrite): OutputRecord;
|
|
110
|
+
get(id: string): OutputRecord | undefined;
|
|
111
|
+
all(): readonly OutputRecord[];
|
|
112
|
+
addRef(from_output_id: string, to_output_id: string, relation: RefRelation, primitive: string): OutputRef;
|
|
113
|
+
refs(): readonly OutputRef[];
|
|
114
|
+
trace(id: string, opts?: {
|
|
115
|
+
max_depth?: number;
|
|
116
|
+
}): OutputRecord[];
|
|
117
|
+
findings(): Finding[];
|
|
118
|
+
coreTypeOf(typeSlug: string): string | null;
|
|
119
|
+
integrity(): OutputStoreIntegrityReport;
|
|
120
|
+
}
|
|
121
|
+
export interface OutputStoreOptions {
|
|
122
|
+
persistDir?: string | undefined;
|
|
123
|
+
}
|
|
124
|
+
export declare function defaultOutputsPersistDir(): string;
|
|
125
|
+
export declare function createOutputStore(registry: Registry, options?: OutputStoreOptions): OutputStore;
|