harnery 0.34.0 → 0.35.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/dist/commander.d.ts.map +1 -1
- package/dist/commander.js +2 -0
- package/dist/commands/agents.d.ts +15 -4
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +91 -162
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +26 -2
- package/dist/commands/decision.d.ts.map +1 -1
- package/dist/commands/decision.js +2 -2
- package/dist/commands/events.d.ts.map +1 -1
- package/dist/commands/events.js +18 -1
- package/dist/commands/presence.d.ts.map +1 -1
- package/dist/commands/presence.js +2 -2
- package/dist/commands/semantic.d.ts +4 -0
- package/dist/commands/semantic.d.ts.map +1 -0
- package/dist/commands/semantic.js +147 -0
- package/dist/commands/web.d.ts.map +1 -1
- package/dist/commands/web.js +17 -0
- package/dist/core/agents/canonical-emit.d.ts +3 -0
- package/dist/core/agents/canonical-emit.d.ts.map +1 -1
- package/dist/core/agents/canonical-emit.js +12 -0
- package/dist/core/agents/claim-path.d.ts +11 -0
- package/dist/core/agents/claim-path.d.ts.map +1 -0
- package/dist/core/agents/claim-path.js +22 -0
- package/dist/core/agents/coord-client.d.ts +29 -3
- package/dist/core/agents/coord-client.d.ts.map +1 -1
- package/dist/core/agents/coord-client.js +88 -9
- package/dist/core/agents/live-authority-v3.d.ts.map +1 -1
- package/dist/core/agents/live-authority-v3.js +1 -3
- package/dist/core/agents/live-lifecycle-v3.js +3 -3
- package/dist/core/agents/live-observation-v3.d.ts.map +1 -1
- package/dist/core/agents/live-observation-v3.js +2 -2
- package/dist/core/agents/render/prompt-context.js +12 -10
- package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
- package/dist/core/agents/rules/stop-hook.js +23 -11
- package/dist/core/agents/session-name-display.d.ts +2 -1
- package/dist/core/agents/session-name-display.d.ts.map +1 -1
- package/dist/core/agents/session-name-display.js +10 -3
- package/dist/core/agents/state/heartbeat-reader.d.ts +46 -0
- package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -0
- package/dist/core/agents/state/heartbeat-reader.js +25 -0
- package/dist/core/agents/state/heartbeat-writer.d.ts +3 -48
- package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +16 -34
- package/dist/core/agents/state/live-coordination-view.d.ts +1 -1
- package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
- package/dist/core/agents/state/live-coordination-view.js +25 -1
- package/dist/core/agents/state/names.d.ts +9 -1
- package/dist/core/agents/state/names.d.ts.map +1 -1
- package/dist/core/agents/state/names.js +190 -182
- package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
- package/dist/core/agents/state/stale-sweep.js +23 -5
- package/dist/core/artifacts/constants.d.ts +5 -0
- package/dist/core/artifacts/constants.d.ts.map +1 -0
- package/dist/core/artifacts/constants.js +4 -0
- package/dist/core/artifacts/index.d.ts +3 -3
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +50 -7
- package/dist/core/events/v3/base-contract.d.ts +795 -0
- package/dist/core/events/v3/base-contract.d.ts.map +1 -1
- package/dist/core/events/v3/base-contract.js +33 -0
- package/dist/core/events/v3/capabilities.d.ts +11 -0
- package/dist/core/events/v3/capabilities.d.ts.map +1 -1
- package/dist/core/events/v3/capabilities.js +23 -0
- package/dist/core/events/v3/generated.d.ts +1 -1
- package/dist/core/events/v3/generated.js +1 -1
- package/dist/core/events/v3/index.d.ts +4 -3
- package/dist/core/events/v3/index.d.ts.map +1 -1
- package/dist/core/events/v3/index.js +4 -3
- package/dist/core/events/v3/latency.d.ts +31 -1
- package/dist/core/events/v3/latency.d.ts.map +1 -1
- package/dist/core/events/v3/latency.js +127 -3
- package/dist/core/events/v3/live-routing.d.ts +30 -0
- package/dist/core/events/v3/live-routing.d.ts.map +1 -1
- package/dist/core/events/v3/live-routing.js +109 -1
- package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/command-recorder.js +10 -1
- package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/coordination-recorder.js +14 -3
- package/dist/core/events/v3/producers/hook-base.d.ts +17 -1
- package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
- package/dist/core/events/v3/producers/hook-base.js +82 -1
- package/dist/core/events/v3/producers/intake.d.ts +6 -0
- package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
- package/dist/core/events/v3/producers/intake.js +11 -0
- package/dist/core/events/v3/producers/recorder.d.ts +62 -0
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +654 -18
- package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts +51 -0
- package/dist/core/events/v3/runtime-telemetry-capabilities.d.ts.map +1 -0
- package/dist/core/events/v3/runtime-telemetry-capabilities.js +54 -0
- package/dist/core/events/v3/turn-telemetry.d.ts +9 -0
- package/dist/core/events/v3/turn-telemetry.d.ts.map +1 -1
- package/dist/core/hooks/adapter/parse.d.ts +3 -0
- package/dist/core/hooks/adapter/parse.d.ts.map +1 -1
- package/dist/core/hooks/adapter/parse.js +14 -0
- package/dist/core/hooks/adapter/runtime-telemetry.d.ts +119 -0
- package/dist/core/hooks/adapter/runtime-telemetry.d.ts.map +1 -0
- package/dist/core/hooks/adapter/runtime-telemetry.js +568 -0
- package/dist/core/hooks/cli.js +114 -38
- package/dist/core/hooks/remediation-cap.d.ts +34 -0
- package/dist/core/hooks/remediation-cap.d.ts.map +1 -0
- package/dist/core/hooks/remediation-cap.js +71 -0
- package/dist/core/hooks/resolve/transcript.d.ts +25 -9
- package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
- package/dist/core/hooks/resolve/transcript.js +35 -17
- package/dist/core/semantic/adapters.d.ts +34 -0
- package/dist/core/semantic/adapters.d.ts.map +1 -0
- package/dist/core/semantic/adapters.js +222 -0
- package/dist/core/semantic/contract.d.ts +588 -0
- package/dist/core/semantic/contract.d.ts.map +1 -0
- package/dist/core/semantic/contract.js +230 -0
- package/dist/core/semantic/evidence.d.ts +11 -0
- package/dist/core/semantic/evidence.d.ts.map +1 -0
- package/dist/core/semantic/evidence.js +262 -0
- package/dist/core/semantic/index.d.ts +10 -0
- package/dist/core/semantic/index.d.ts.map +1 -0
- package/dist/core/semantic/index.js +9 -0
- package/dist/core/semantic/once.d.ts +33 -0
- package/dist/core/semantic/once.d.ts.map +1 -0
- package/dist/core/semantic/once.js +293 -0
- package/dist/core/semantic/prompt.d.ts +12 -0
- package/dist/core/semantic/prompt.d.ts.map +1 -0
- package/dist/core/semantic/prompt.js +70 -0
- package/dist/core/semantic/scheduler.d.ts +16 -0
- package/dist/core/semantic/scheduler.d.ts.map +1 -0
- package/dist/core/semantic/scheduler.js +67 -0
- package/dist/core/semantic/service-status.d.ts +31 -0
- package/dist/core/semantic/service-status.d.ts.map +1 -0
- package/dist/core/semantic/service-status.js +84 -0
- package/dist/core/semantic/service.d.ts +51 -0
- package/dist/core/semantic/service.d.ts.map +1 -0
- package/dist/core/semantic/service.js +470 -0
- package/dist/core/semantic/storage.d.ts +71 -0
- package/dist/core/semantic/storage.d.ts.map +1 -0
- package/dist/core/semantic/storage.js +179 -0
- package/dist/core/semantic/validate.d.ts +16 -0
- package/dist/core/semantic/validate.d.ts.map +1 -0
- package/dist/core/semantic/validate.js +174 -0
- package/dist/lib/browser/client.d.ts +11 -0
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +13 -0
- package/dist/lib/browser/index.d.ts +1 -0
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/standalone-html.d.ts +25 -0
- package/dist/lib/browser/standalone-html.d.ts.map +1 -0
- package/dist/lib/browser/standalone-html.js +284 -0
- package/dist/lib/instructions/apply.d.ts.map +1 -1
- package/dist/lib/instructions/apply.js +1 -0
- package/dist/lib/instructions/templates.d.ts +2 -0
- package/dist/lib/instructions/templates.d.ts.map +1 -1
- package/dist/lib/instructions/templates.js +144 -4
- package/package.json +6 -1
- package/schemas/event-v3.schema.json +2758 -478
- package/src/commander.ts +2 -0
- package/src/commands/agents.ts +104 -152
- package/src/commands/browse.ts +25 -2
- package/src/commands/decision.ts +8 -2
- package/src/commands/events.ts +21 -1
- package/src/commands/presence.ts +7 -2
- package/src/commands/semantic.ts +179 -0
- package/src/commands/web.ts +15 -0
- package/src/core/agents/canonical-emit.ts +15 -0
- package/src/core/agents/claim-path.ts +23 -0
- package/src/core/agents/coord-client.ts +92 -8
- package/src/core/agents/live-authority-v3.ts +1 -4
- package/src/core/agents/live-lifecycle-v3.ts +8 -3
- package/src/core/agents/live-observation-v3.ts +7 -2
- package/src/core/agents/render/prompt-context.ts +13 -10
- package/src/core/agents/rules/stop-hook.ts +24 -11
- package/src/core/agents/session-name-display.ts +11 -3
- package/src/core/agents/state/heartbeat-reader.ts +69 -0
- package/src/core/agents/state/heartbeat-writer.ts +20 -84
- package/src/core/agents/state/live-coordination-view.ts +26 -1
- package/src/core/agents/state/names.ts +190 -182
- package/src/core/agents/state/stale-sweep.ts +25 -5
- package/src/core/artifacts/constants.ts +4 -0
- package/src/core/artifacts/index.ts +49 -7
- package/src/core/events/v3/base-contract.ts +39 -0
- package/src/core/events/v3/capabilities.ts +34 -0
- package/src/core/events/v3/generated.ts +1 -1
- package/src/core/events/v3/index.ts +21 -0
- package/src/core/events/v3/latency.ts +213 -2
- package/src/core/events/v3/live-routing.ts +120 -1
- package/src/core/events/v3/producers/command-recorder.ts +10 -1
- package/src/core/events/v3/producers/coordination-recorder.ts +17 -5
- package/src/core/events/v3/producers/hook-base.ts +115 -1
- package/src/core/events/v3/producers/intake.ts +18 -0
- package/src/core/events/v3/producers/recorder.ts +856 -21
- package/src/core/events/v3/runtime-telemetry-capabilities.ts +137 -0
- package/src/core/events/v3/turn-telemetry.ts +10 -0
- package/src/core/hooks/adapter/parse.ts +16 -0
- package/src/core/hooks/adapter/runtime-telemetry.ts +805 -0
- package/src/core/hooks/cli.ts +126 -41
- package/src/core/hooks/remediation-cap.ts +77 -0
- package/src/core/hooks/resolve/transcript.ts +49 -17
- package/src/core/semantic/adapters.ts +293 -0
- package/src/core/semantic/contract.ts +298 -0
- package/src/core/semantic/evidence.ts +336 -0
- package/src/core/semantic/index.ts +127 -0
- package/src/core/semantic/once.ts +410 -0
- package/src/core/semantic/prompt.ts +84 -0
- package/src/core/semantic/scheduler.ts +107 -0
- package/src/core/semantic/service-status.ts +118 -0
- package/src/core/semantic/service.ts +580 -0
- package/src/core/semantic/storage.ts +286 -0
- package/src/core/semantic/validate.ts +212 -0
- package/src/lib/browser/client.ts +21 -0
- package/src/lib/browser/index.ts +4 -0
- package/src/lib/browser/standalone-html.ts +312 -0
- package/src/lib/instructions/apply.ts +1 -0
- package/src/lib/instructions/templates.ts +149 -4
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import type { V3HeartbeatMaterialization } from "../agents/state/live-coordination-view.ts";
|
|
2
|
+
import { readLiveCoordinationRows } from "../agents/state/live-coordination-view.ts";
|
|
3
|
+
import type { EventV3 } from "../events/v3/contract.ts";
|
|
4
|
+
import {
|
|
5
|
+
type CoordinationGenerationViewV3,
|
|
6
|
+
type CoordinationViewV3,
|
|
7
|
+
projectCoordinationViewV3,
|
|
8
|
+
} from "../events/v3/coordination-view.ts";
|
|
9
|
+
import { canonicalJsonV3, sha256V3 } from "../events/v3/index.ts";
|
|
10
|
+
import { type ReadLedgerV3Result, readLedgerV3 } from "../events/v3/reader.ts";
|
|
11
|
+
import { type PresenceCodecDigest, projectPresenceCodecDigests } from "../presence/codec-digest.ts";
|
|
12
|
+
import {
|
|
13
|
+
SEMANTIC_EVIDENCE_CONTRACT_VERSION,
|
|
14
|
+
SEMANTIC_EVIDENCE_SCHEMA_VERSION,
|
|
15
|
+
type SemanticEvidenceObservationV1,
|
|
16
|
+
type SemanticEvidenceV1,
|
|
17
|
+
type SemanticHarness,
|
|
18
|
+
} from "./contract.ts";
|
|
19
|
+
import { isSemanticPrivacySafe, validateSemanticEvidencePrivacy } from "./validate.ts";
|
|
20
|
+
|
|
21
|
+
const MAX_RECENT = 8;
|
|
22
|
+
export const SEMANTIC_RECENTLY_ENDED_WINDOW_MS = 30 * 60_000;
|
|
23
|
+
|
|
24
|
+
/** Read canonical V3 authority and project one privacy-safe envelope per active generation. */
|
|
25
|
+
export function buildSemanticEvidenceV1(
|
|
26
|
+
coordRoot: string,
|
|
27
|
+
nowMs = Date.now(),
|
|
28
|
+
): SemanticEvidenceV1[] {
|
|
29
|
+
const read = readLedgerV3(coordRoot, { authority: "active" });
|
|
30
|
+
if (!read.complete || !read.genesis_id) return [];
|
|
31
|
+
return projectSemanticEvidenceV1(read, readLiveCoordinationRows(coordRoot), nowMs);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Pure projection seam used by replay and contract tests. */
|
|
35
|
+
export function projectSemanticEvidenceV1(
|
|
36
|
+
read: ReadLedgerV3Result,
|
|
37
|
+
liveRows: readonly V3HeartbeatMaterialization[] = [],
|
|
38
|
+
nowMs = Date.now(),
|
|
39
|
+
): SemanticEvidenceV1[] {
|
|
40
|
+
if (!read.complete || !read.genesis_id) return [];
|
|
41
|
+
const view = projectCoordinationViewV3(read);
|
|
42
|
+
if (!view.authority_safe) return [];
|
|
43
|
+
return projectSemanticEvidenceFromViewV1(read, view, liveRows, nowMs);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function projectSemanticEvidenceFromViewV1(
|
|
47
|
+
read: ReadLedgerV3Result,
|
|
48
|
+
view: CoordinationViewV3,
|
|
49
|
+
liveRows: readonly V3HeartbeatMaterialization[] = [],
|
|
50
|
+
nowMs = Date.now(),
|
|
51
|
+
): SemanticEvidenceV1[] {
|
|
52
|
+
if (!read.complete || !read.genesis_id || !view.authority_safe) return [];
|
|
53
|
+
const events = read.events.map(({ event }) => event);
|
|
54
|
+
const codec = projectPresenceCodecDigests(events);
|
|
55
|
+
const rows = new Map(liveRows.map((row) => [row.v3_generation_id, row]));
|
|
56
|
+
const recentTerminal = Object.values(view.terminal_generations).filter((generation) => {
|
|
57
|
+
const endedAt = Date.parse(generation.terminal?.observed_at ?? "");
|
|
58
|
+
return (
|
|
59
|
+
generation.evidence_complete &&
|
|
60
|
+
Number.isFinite(endedAt) &&
|
|
61
|
+
nowMs - endedAt >= 0 &&
|
|
62
|
+
nowMs - endedAt <= SEMANTIC_RECENTLY_ENDED_WINDOW_MS
|
|
63
|
+
);
|
|
64
|
+
});
|
|
65
|
+
return [...Object.values(view.instances), ...recentTerminal]
|
|
66
|
+
.filter((generation) => generation.authority_eligible || generation.phase === "terminal")
|
|
67
|
+
.sort((left, right) => left.generation_id.localeCompare(right.generation_id))
|
|
68
|
+
.flatMap((generation) => {
|
|
69
|
+
const evidence = projectGeneration(
|
|
70
|
+
read.genesis_id!,
|
|
71
|
+
generation,
|
|
72
|
+
events.filter((event) => eventGenerationId(event) === generation.generation_id),
|
|
73
|
+
rows.get(generation.generation_id as `gen_${string}`),
|
|
74
|
+
codec.get(generation.instance_id),
|
|
75
|
+
);
|
|
76
|
+
return evidence ? [evidence] : [];
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function projectGeneration(
|
|
81
|
+
genesisId: string,
|
|
82
|
+
generation: CoordinationGenerationViewV3,
|
|
83
|
+
events: readonly EventV3[],
|
|
84
|
+
row: V3HeartbeatMaterialization | undefined,
|
|
85
|
+
codec: PresenceCodecDigest | undefined,
|
|
86
|
+
): SemanticEvidenceV1 | undefined {
|
|
87
|
+
const start = events.find((event) => event.event_type === "session.started");
|
|
88
|
+
if (!start || start.event_type !== "session.started") return undefined;
|
|
89
|
+
const harness = observedHarness(start.payload.runtime_attestation.adapter);
|
|
90
|
+
if (!harness) return undefined;
|
|
91
|
+
|
|
92
|
+
const latestTask = latest(events, "coord.task_changed");
|
|
93
|
+
const latestLifecycle = latest(events, "coord.lifecycle_changed");
|
|
94
|
+
const latestIntent = latest(events, "turn.started");
|
|
95
|
+
const task =
|
|
96
|
+
latestTask && row?.task && row.v3_task_state === "set" && isSemanticPrivacySafe(row.task)
|
|
97
|
+
? { value: row.task.slice(0, 200), event_id: latestTask.event_id }
|
|
98
|
+
: undefined;
|
|
99
|
+
const lifecycle = latestLifecycle
|
|
100
|
+
? { state: latestLifecycle.payload.new_state, event_id: latestLifecycle.event_id }
|
|
101
|
+
: undefined;
|
|
102
|
+
const intent = latestIntent
|
|
103
|
+
? { kind: latestIntent.payload.intent_kind, event_id: latestIntent.event_id }
|
|
104
|
+
: undefined;
|
|
105
|
+
const operation =
|
|
106
|
+
codec?.operation && isSemanticPrivacySafe(codec.operation.label)
|
|
107
|
+
? {
|
|
108
|
+
category: codec.operation.category,
|
|
109
|
+
label: codec.operation.label,
|
|
110
|
+
event_id: codec.operation.event_id,
|
|
111
|
+
}
|
|
112
|
+
: undefined;
|
|
113
|
+
const waits = generation.waits.slice(0, 8).map((wait) => ({
|
|
114
|
+
kind: wait.kind,
|
|
115
|
+
event_id: wait.started_event_id,
|
|
116
|
+
started_at: wait.started_at,
|
|
117
|
+
}));
|
|
118
|
+
const recent = events.flatMap(toRecentObservation).slice(-MAX_RECENT);
|
|
119
|
+
const attention = attentionObservation(generation, events, recent);
|
|
120
|
+
const dependencyIds = generation.waits
|
|
121
|
+
.map((wait) => wait.authority_reference)
|
|
122
|
+
.filter((value): value is string => Boolean(value))
|
|
123
|
+
.filter((value) => /^[a-zA-Z0-9][a-zA-Z0-9._:+-]{0,127}$/.test(value))
|
|
124
|
+
.slice(0, 16);
|
|
125
|
+
const relationships =
|
|
126
|
+
generation.parent_generation_id || dependencyIds.length
|
|
127
|
+
? {
|
|
128
|
+
...(generation.parent_generation_id
|
|
129
|
+
? { parent_generation_id: generation.parent_generation_id }
|
|
130
|
+
: {}),
|
|
131
|
+
dependency_ids: [...new Set(dependencyIds)],
|
|
132
|
+
}
|
|
133
|
+
: undefined;
|
|
134
|
+
const evidenceEventIds = unique([
|
|
135
|
+
start.event_id,
|
|
136
|
+
task?.event_id,
|
|
137
|
+
lifecycle?.event_id,
|
|
138
|
+
intent?.event_id,
|
|
139
|
+
operation?.event_id,
|
|
140
|
+
...waits.map((wait) => wait.event_id),
|
|
141
|
+
...recent.map((item) => item.event_id),
|
|
142
|
+
attention?.event_id,
|
|
143
|
+
]).slice(0, 64);
|
|
144
|
+
const observedThrough = newestEvidenceEvent(events, evidenceEventIds) ?? start;
|
|
145
|
+
const unsigned = {
|
|
146
|
+
schema_version: SEMANTIC_EVIDENCE_SCHEMA_VERSION,
|
|
147
|
+
evidence_contract_version: SEMANTIC_EVIDENCE_CONTRACT_VERSION,
|
|
148
|
+
instance_id: generation.instance_id,
|
|
149
|
+
generation_id: generation.generation_id,
|
|
150
|
+
source_harness: harness,
|
|
151
|
+
source: {
|
|
152
|
+
ledger_genesis_id: genesisId,
|
|
153
|
+
observed_through_event_id: observedThrough.event_id,
|
|
154
|
+
observed_through_ts: observedThrough.time.observed_at,
|
|
155
|
+
},
|
|
156
|
+
...(task ? { task } : {}),
|
|
157
|
+
...(lifecycle ? { lifecycle } : {}),
|
|
158
|
+
...(intent ? { intent } : {}),
|
|
159
|
+
...(operation ? { operation } : {}),
|
|
160
|
+
waits,
|
|
161
|
+
recent,
|
|
162
|
+
...(attention ? { attention } : {}),
|
|
163
|
+
...(relationships ? { relationships } : {}),
|
|
164
|
+
evidence_event_ids: evidenceEventIds,
|
|
165
|
+
} as const;
|
|
166
|
+
const evidence: SemanticEvidenceV1 = {
|
|
167
|
+
...unsigned,
|
|
168
|
+
evidence_digest: sha256V3(canonicalJsonV3(unsigned)),
|
|
169
|
+
};
|
|
170
|
+
return validateSemanticEvidencePrivacy(evidence).ok ? evidence : undefined;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function toRecentObservation(event: EventV3): SemanticEvidenceObservationV1[] {
|
|
174
|
+
const base = { event_id: event.event_id, observed_at: event.time.observed_at };
|
|
175
|
+
switch (event.event_type) {
|
|
176
|
+
case "progress.observed":
|
|
177
|
+
return [
|
|
178
|
+
{
|
|
179
|
+
...base,
|
|
180
|
+
kind: "progress",
|
|
181
|
+
label: progressLabel(event.payload.kind),
|
|
182
|
+
outcome: "succeeded",
|
|
183
|
+
},
|
|
184
|
+
];
|
|
185
|
+
case "artifact.observed":
|
|
186
|
+
return [
|
|
187
|
+
{
|
|
188
|
+
...base,
|
|
189
|
+
kind: "artifact",
|
|
190
|
+
label: artifactLabel(event.payload.operation),
|
|
191
|
+
outcome: "succeeded",
|
|
192
|
+
},
|
|
193
|
+
];
|
|
194
|
+
case "tool.completed":
|
|
195
|
+
return [
|
|
196
|
+
{
|
|
197
|
+
...base,
|
|
198
|
+
kind: event.payload.outcome === "failed" ? "error" : "action",
|
|
199
|
+
label:
|
|
200
|
+
event.payload.outcome === "succeeded" ? "Tool action succeeded" : "Tool action ended",
|
|
201
|
+
outcome: event.payload.outcome,
|
|
202
|
+
...(event.payload.error?.class ? { error_class: event.payload.error.class } : {}),
|
|
203
|
+
},
|
|
204
|
+
];
|
|
205
|
+
case "command.completed":
|
|
206
|
+
return [
|
|
207
|
+
{
|
|
208
|
+
...base,
|
|
209
|
+
kind: event.payload.outcome === "failed" ? "error" : "action",
|
|
210
|
+
label: event.payload.outcome === "succeeded" ? "Command succeeded" : "Command ended",
|
|
211
|
+
outcome: event.payload.outcome,
|
|
212
|
+
...(event.payload.error_class ? { error_class: event.payload.error_class } : {}),
|
|
213
|
+
},
|
|
214
|
+
];
|
|
215
|
+
case "turn.completed":
|
|
216
|
+
return [{ ...base, kind: "action", label: "Turn completed", outcome: event.payload.outcome }];
|
|
217
|
+
case "session.ended":
|
|
218
|
+
return [
|
|
219
|
+
{ ...base, kind: "terminal", label: "Session ended", outcome: event.payload.outcome },
|
|
220
|
+
];
|
|
221
|
+
case "session.resumed":
|
|
222
|
+
case "lifecycle.recovered":
|
|
223
|
+
return [{ ...base, kind: "recovery", label: "Work recovered", outcome: "succeeded" }];
|
|
224
|
+
case "coord.claim_changed":
|
|
225
|
+
return event.payload.operation === "denied"
|
|
226
|
+
? [{ ...base, kind: "claim-conflict", label: "Write claim conflicted", outcome: "denied" }]
|
|
227
|
+
: [];
|
|
228
|
+
default:
|
|
229
|
+
return [];
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function attentionObservation(
|
|
234
|
+
generation: CoordinationGenerationViewV3,
|
|
235
|
+
events: readonly EventV3[],
|
|
236
|
+
recent: readonly SemanticEvidenceObservationV1[],
|
|
237
|
+
): SemanticEvidenceObservationV1 | undefined {
|
|
238
|
+
const activeWait = generation.waits.at(-1);
|
|
239
|
+
if (activeWait) {
|
|
240
|
+
return {
|
|
241
|
+
kind: "wait",
|
|
242
|
+
event_id: activeWait.started_event_id,
|
|
243
|
+
observed_at: activeWait.started_at,
|
|
244
|
+
label: `Waiting for ${waitLabel(activeWait.kind)}`,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
const lifecycle = latest(events, "coord.lifecycle_changed");
|
|
248
|
+
if (lifecycle?.payload.new_state === "blocked") {
|
|
249
|
+
return {
|
|
250
|
+
kind: "lifecycle",
|
|
251
|
+
event_id: lifecycle.event_id,
|
|
252
|
+
observed_at: lifecycle.time.observed_at,
|
|
253
|
+
label: "Work is explicitly blocked",
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
return [...recent]
|
|
257
|
+
.reverse()
|
|
258
|
+
.find((item) => item.kind === "error" || item.kind === "claim-conflict");
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function observedHarness(
|
|
262
|
+
observation: Extract<
|
|
263
|
+
EventV3,
|
|
264
|
+
{ event_type: "session.started" }
|
|
265
|
+
>["payload"]["runtime_attestation"]["adapter"],
|
|
266
|
+
): SemanticHarness | undefined {
|
|
267
|
+
if (observation.state !== "observed") return undefined;
|
|
268
|
+
const id = observation.value.id;
|
|
269
|
+
return id === "claude-code" || id === "codex" || id === "cursor" ? id : undefined;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function latest<T extends EventV3["event_type"]>(
|
|
273
|
+
events: readonly EventV3[],
|
|
274
|
+
eventType: T,
|
|
275
|
+
): Extract<EventV3, { event_type: T }> | undefined {
|
|
276
|
+
return [...events].reverse().find((event) => event.event_type === eventType) as
|
|
277
|
+
| Extract<EventV3, { event_type: T }>
|
|
278
|
+
| undefined;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function eventGenerationId(event: EventV3): string | undefined {
|
|
282
|
+
return "generation_id" in event.scope ? event.scope.generation_id : undefined;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
function newestEvidenceEvent(
|
|
286
|
+
events: readonly EventV3[],
|
|
287
|
+
ids: readonly string[],
|
|
288
|
+
): EventV3 | undefined {
|
|
289
|
+
const allowed = new Set(ids);
|
|
290
|
+
return [...events].reverse().find((event) => allowed.has(event.event_id));
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function unique(values: Array<string | undefined>): string[] {
|
|
294
|
+
return [...new Set(values.filter((value): value is string => Boolean(value)))];
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
function progressLabel(kind: string): string {
|
|
298
|
+
return (
|
|
299
|
+
{
|
|
300
|
+
write: "Files changed",
|
|
301
|
+
test: "Tests observed",
|
|
302
|
+
commit: "Commit observed",
|
|
303
|
+
deploy: "Deployment observed",
|
|
304
|
+
publication: "Publication observed",
|
|
305
|
+
review: "Review observed",
|
|
306
|
+
artifact: "Artifact observed",
|
|
307
|
+
}[kind] ?? "Progress observed"
|
|
308
|
+
);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
function artifactLabel(operation: string): string {
|
|
312
|
+
return (
|
|
313
|
+
{
|
|
314
|
+
created: "Artifact created",
|
|
315
|
+
updated: "Artifact updated",
|
|
316
|
+
viewed: "Artifact viewed",
|
|
317
|
+
published: "Artifact published",
|
|
318
|
+
}[operation] ?? "Artifact observed"
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function waitLabel(kind: string): string {
|
|
323
|
+
return (
|
|
324
|
+
{
|
|
325
|
+
permission: "permission",
|
|
326
|
+
needs_input: "input",
|
|
327
|
+
operator_input: "operator input",
|
|
328
|
+
approval: "approval",
|
|
329
|
+
decision: "a decision",
|
|
330
|
+
dependency: "a dependency",
|
|
331
|
+
scheduled: "a scheduled time",
|
|
332
|
+
rate_limit: "a rate limit",
|
|
333
|
+
unknown: "attention",
|
|
334
|
+
}[kind] ?? "attention"
|
|
335
|
+
);
|
|
336
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
export {
|
|
2
|
+
createSemanticAdapters,
|
|
3
|
+
discoverSemanticReaders,
|
|
4
|
+
SEMANTIC_READER_ROUTES,
|
|
5
|
+
type SemanticAdapter,
|
|
6
|
+
type SemanticAdapterFailure,
|
|
7
|
+
type SemanticAdapterResult,
|
|
8
|
+
type SemanticAdapterSuccess,
|
|
9
|
+
type SemanticReaderRoute,
|
|
10
|
+
} from "./adapters.ts";
|
|
11
|
+
export {
|
|
12
|
+
SEMANTIC_CONFIGURED_MODELS,
|
|
13
|
+
SEMANTIC_EVIDENCE_CONTRACT_VERSION,
|
|
14
|
+
SEMANTIC_EVIDENCE_KINDS,
|
|
15
|
+
SEMANTIC_EVIDENCE_SCHEMA_VERSION,
|
|
16
|
+
SEMANTIC_EXPRESSION_CUES,
|
|
17
|
+
SEMANTIC_HARNESSES,
|
|
18
|
+
SEMANTIC_PHASES,
|
|
19
|
+
SEMANTIC_PROMPT_CONTRACT_VERSION,
|
|
20
|
+
SEMANTIC_READ_MODEL_SCHEMA_VERSION,
|
|
21
|
+
SEMANTIC_TAGS,
|
|
22
|
+
type SemanticAcceptedReadModelV2,
|
|
23
|
+
SemanticAcceptedReadModelV2Schema,
|
|
24
|
+
type SemanticAgentReadModelV2,
|
|
25
|
+
SemanticAgentReadModelV2Schema,
|
|
26
|
+
type SemanticBasis,
|
|
27
|
+
type SemanticConfidence,
|
|
28
|
+
type SemanticConfiguredModel,
|
|
29
|
+
SemanticDeferredReadModelV2Schema,
|
|
30
|
+
type SemanticEvidenceKind,
|
|
31
|
+
type SemanticEvidenceObservationV1,
|
|
32
|
+
SemanticEvidenceObservationV1Schema,
|
|
33
|
+
type SemanticEvidenceV1,
|
|
34
|
+
SemanticEvidenceV1Schema,
|
|
35
|
+
type SemanticExpressionCue,
|
|
36
|
+
type SemanticField,
|
|
37
|
+
type SemanticHarness,
|
|
38
|
+
SemanticInvalidReadModelV2Schema,
|
|
39
|
+
type SemanticMeaningV2,
|
|
40
|
+
SemanticMeaningV2Schema,
|
|
41
|
+
type SemanticModelReplyV2,
|
|
42
|
+
SemanticModelReplyV2Schema,
|
|
43
|
+
type SemanticPhase,
|
|
44
|
+
type SemanticTag,
|
|
45
|
+
SemanticUnavailableReadModelV2Schema,
|
|
46
|
+
} from "./contract.ts";
|
|
47
|
+
export {
|
|
48
|
+
buildSemanticEvidenceV1,
|
|
49
|
+
projectSemanticEvidenceFromViewV1,
|
|
50
|
+
projectSemanticEvidenceV1,
|
|
51
|
+
SEMANTIC_RECENTLY_ENDED_WINDOW_MS,
|
|
52
|
+
} from "./evidence.ts";
|
|
53
|
+
export {
|
|
54
|
+
type RunSemanticOnceInput,
|
|
55
|
+
runSemanticOnce,
|
|
56
|
+
type SemanticOnceOutcome,
|
|
57
|
+
type SemanticOnceReport,
|
|
58
|
+
} from "./once.ts";
|
|
59
|
+
export {
|
|
60
|
+
buildSemanticPrompt,
|
|
61
|
+
extractSemanticJson,
|
|
62
|
+
SEMANTIC_MAX_REQUEST_BYTES,
|
|
63
|
+
type SemanticPromptEnvelope,
|
|
64
|
+
} from "./prompt.ts";
|
|
65
|
+
export {
|
|
66
|
+
activeSemanticCallHistory,
|
|
67
|
+
enqueueSemanticPending,
|
|
68
|
+
SEMANTIC_HARD_CALLS_PER_HOUR,
|
|
69
|
+
SEMANTIC_INVALID_RETRY_COOLDOWN_MS,
|
|
70
|
+
SEMANTIC_MIN_GENERATION_CALL_INTERVAL_MS,
|
|
71
|
+
selectSemanticPending,
|
|
72
|
+
semanticDocumentEligible,
|
|
73
|
+
semanticGenerationCallEligible,
|
|
74
|
+
semanticPriorityBand,
|
|
75
|
+
semanticRateCap,
|
|
76
|
+
} from "./scheduler.ts";
|
|
77
|
+
export {
|
|
78
|
+
acquireSemanticServiceLease,
|
|
79
|
+
type EnsureSemanticServiceDependencies,
|
|
80
|
+
type EnsureSemanticServiceResult,
|
|
81
|
+
type EnsureSemanticServiceState,
|
|
82
|
+
ensureSemanticServiceRunning,
|
|
83
|
+
type RunSemanticServiceDaemonInput,
|
|
84
|
+
readSemanticServiceStatus,
|
|
85
|
+
requestSemanticServiceStop,
|
|
86
|
+
runSemanticServiceDaemon,
|
|
87
|
+
SEMANTIC_SERVICE_DEFAULT_DEBOUNCE_MS,
|
|
88
|
+
SEMANTIC_SERVICE_DEFAULT_HEARTBEAT_MS,
|
|
89
|
+
SEMANTIC_SERVICE_DEFAULT_WAKE_MS,
|
|
90
|
+
SEMANTIC_SERVICE_STATUS_SCHEMA_VERSION,
|
|
91
|
+
type SemanticServiceErrorCode,
|
|
92
|
+
type SemanticServiceState,
|
|
93
|
+
type SemanticServiceStatus,
|
|
94
|
+
type SemanticServiceStatusRecord,
|
|
95
|
+
spawnSemanticService,
|
|
96
|
+
} from "./service.ts";
|
|
97
|
+
export {
|
|
98
|
+
inspectSemanticDocument,
|
|
99
|
+
invalidateSemanticDerivedState,
|
|
100
|
+
listSemanticAgentDocuments,
|
|
101
|
+
pruneSemanticStorage,
|
|
102
|
+
readSemanticAgentDocument,
|
|
103
|
+
readSemanticCache,
|
|
104
|
+
readSemanticManifest,
|
|
105
|
+
SEMANTIC_MANIFEST_SCHEMA_VERSION,
|
|
106
|
+
type SemanticCacheIdentity,
|
|
107
|
+
type SemanticCallReceipt,
|
|
108
|
+
type SemanticManifestV2,
|
|
109
|
+
type SemanticPendingItem,
|
|
110
|
+
type SemanticReaderResolution,
|
|
111
|
+
semanticCacheKey,
|
|
112
|
+
semanticConfigurationDigest,
|
|
113
|
+
semanticPaths,
|
|
114
|
+
writeSemanticAgentDocument,
|
|
115
|
+
writeSemanticCache,
|
|
116
|
+
writeSemanticManifest,
|
|
117
|
+
} from "./storage.ts";
|
|
118
|
+
export {
|
|
119
|
+
isSemanticPrivacySafe,
|
|
120
|
+
type SemanticValidationFailure,
|
|
121
|
+
type SemanticValidationResult,
|
|
122
|
+
type SemanticValidationSuccess,
|
|
123
|
+
semanticPrivacyIssue,
|
|
124
|
+
validateSemanticEvidencePrivacy,
|
|
125
|
+
validateSemanticModelReply,
|
|
126
|
+
validateSemanticReadModel,
|
|
127
|
+
} from "./validate.ts";
|