openplanr 1.16.2 → 1.17.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.
Files changed (99) hide show
  1. package/dist/cli/commands/operate.d.ts.map +1 -1
  2. package/dist/cli/commands/operate.js +185 -6
  3. package/dist/cli/commands/operate.js.map +1 -1
  4. package/dist/services/operate/advisors.d.ts +46 -1
  5. package/dist/services/operate/advisors.d.ts.map +1 -1
  6. package/dist/services/operate/advisors.js +124 -13
  7. package/dist/services/operate/advisors.js.map +1 -1
  8. package/dist/services/operate/artifacts.d.ts +27 -1
  9. package/dist/services/operate/artifacts.d.ts.map +1 -1
  10. package/dist/services/operate/artifacts.js +103 -1
  11. package/dist/services/operate/artifacts.js.map +1 -1
  12. package/dist/services/operate/cadence.d.ts +50 -0
  13. package/dist/services/operate/cadence.d.ts.map +1 -0
  14. package/dist/services/operate/cadence.js +56 -0
  15. package/dist/services/operate/cadence.js.map +1 -0
  16. package/dist/services/operate/citation-resolution.d.ts +101 -0
  17. package/dist/services/operate/citation-resolution.d.ts.map +1 -0
  18. package/dist/services/operate/citation-resolution.js +308 -0
  19. package/dist/services/operate/citation-resolution.js.map +1 -0
  20. package/dist/services/operate/config.d.ts +67 -1
  21. package/dist/services/operate/config.d.ts.map +1 -1
  22. package/dist/services/operate/config.js +158 -9
  23. package/dist/services/operate/config.js.map +1 -1
  24. package/dist/services/operate/decision-brief.d.ts +148 -0
  25. package/dist/services/operate/decision-brief.d.ts.map +1 -0
  26. package/dist/services/operate/decision-brief.js +194 -0
  27. package/dist/services/operate/decision-brief.js.map +1 -0
  28. package/dist/services/operate/doctor.d.ts.map +1 -1
  29. package/dist/services/operate/doctor.js +151 -3
  30. package/dist/services/operate/doctor.js.map +1 -1
  31. package/dist/services/operate/engine.d.ts +66 -2
  32. package/dist/services/operate/engine.d.ts.map +1 -1
  33. package/dist/services/operate/engine.js +219 -7
  34. package/dist/services/operate/engine.js.map +1 -1
  35. package/dist/services/operate/event-store.d.ts +35 -1
  36. package/dist/services/operate/event-store.d.ts.map +1 -1
  37. package/dist/services/operate/event-store.js +142 -29
  38. package/dist/services/operate/event-store.js.map +1 -1
  39. package/dist/services/operate/evidence-cache.d.ts +25 -1
  40. package/dist/services/operate/evidence-cache.d.ts.map +1 -1
  41. package/dist/services/operate/evidence-cache.js +62 -1
  42. package/dist/services/operate/evidence-cache.js.map +1 -1
  43. package/dist/services/operate/evidence.d.ts +20 -1
  44. package/dist/services/operate/evidence.d.ts.map +1 -1
  45. package/dist/services/operate/evidence.js +119 -0
  46. package/dist/services/operate/evidence.js.map +1 -1
  47. package/dist/services/operate/index.d.ts.map +1 -1
  48. package/dist/services/operate/index.js +72 -5
  49. package/dist/services/operate/index.js.map +1 -1
  50. package/dist/services/operate/interaction/action-service.d.ts +17 -0
  51. package/dist/services/operate/interaction/action-service.d.ts.map +1 -1
  52. package/dist/services/operate/interaction/action-service.js +19 -0
  53. package/dist/services/operate/interaction/action-service.js.map +1 -1
  54. package/dist/services/operate/journal.d.ts.map +1 -1
  55. package/dist/services/operate/journal.js +11 -5
  56. package/dist/services/operate/journal.js.map +1 -1
  57. package/dist/services/operate/maintenance.d.ts.map +1 -1
  58. package/dist/services/operate/maintenance.js +9 -2
  59. package/dist/services/operate/maintenance.js.map +1 -1
  60. package/dist/services/operate/migration.d.ts +68 -0
  61. package/dist/services/operate/migration.d.ts.map +1 -0
  62. package/dist/services/operate/migration.js +235 -0
  63. package/dist/services/operate/migration.js.map +1 -0
  64. package/dist/services/operate/mission-dispatch.d.ts +193 -0
  65. package/dist/services/operate/mission-dispatch.d.ts.map +1 -0
  66. package/dist/services/operate/mission-dispatch.js +444 -0
  67. package/dist/services/operate/mission-dispatch.js.map +1 -0
  68. package/dist/services/operate/projection-persistence.d.ts +6 -0
  69. package/dist/services/operate/projection-persistence.d.ts.map +1 -1
  70. package/dist/services/operate/projection-persistence.js +87 -11
  71. package/dist/services/operate/projection-persistence.js.map +1 -1
  72. package/dist/services/operate/projection.d.ts +26 -1
  73. package/dist/services/operate/projection.d.ts.map +1 -1
  74. package/dist/services/operate/projection.js +62 -0
  75. package/dist/services/operate/projection.js.map +1 -1
  76. package/dist/services/operate/protocol.d.ts +46 -2
  77. package/dist/services/operate/protocol.d.ts.map +1 -1
  78. package/dist/services/operate/protocol.js +57 -5
  79. package/dist/services/operate/protocol.js.map +1 -1
  80. package/dist/services/operate/read-only-providers.d.ts +37 -0
  81. package/dist/services/operate/read-only-providers.d.ts.map +1 -1
  82. package/dist/services/operate/read-only-providers.js +130 -0
  83. package/dist/services/operate/read-only-providers.js.map +1 -1
  84. package/dist/services/operate/reports.d.ts +13 -0
  85. package/dist/services/operate/reports.d.ts.map +1 -1
  86. package/dist/services/operate/reports.js +217 -1
  87. package/dist/services/operate/reports.js.map +1 -1
  88. package/dist/services/operate/routes.d.ts.map +1 -1
  89. package/dist/services/operate/routes.js +79 -5
  90. package/dist/services/operate/routes.js.map +1 -1
  91. package/dist/services/operate/types.d.ts +120 -4
  92. package/dist/services/operate/types.d.ts.map +1 -1
  93. package/dist/services/operate/types.js +13 -0
  94. package/dist/services/operate/types.js.map +1 -1
  95. package/dist/services/operate/workspace.d.ts +7 -0
  96. package/dist/services/operate/workspace.d.ts.map +1 -1
  97. package/dist/services/operate/workspace.js +14 -5
  98. package/dist/services/operate/workspace.js.map +1 -1
  99. package/package.json +2 -2
@@ -1,11 +1,61 @@
1
1
  import { randomUUID } from 'node:crypto';
2
- import { appendFile, mkdir, open, readFile, rename } from 'node:fs/promises';
2
+ import { access, appendFile, mkdir, open, readdir, readFile, rename } from 'node:fs/promises';
3
3
  import path from 'node:path';
4
4
  import { canonicalDigest, canonicalize } from './canonical.js';
5
5
  import { assertOperatingArtifact, loadOperatingProtocol } from './protocol.js';
6
6
  import { projectOperatingStalledItems } from './stalled-item-service.js';
7
- import { OPERATE_PROTOCOL_VERSION, OPERATE_SCHEMA_VERSION, OperateError, } from './types.js';
7
+ import { OPERATE_MISSION_PROTOCOL_VERSION, OPERATE_PROTOCOL_VERSION, OPERATE_SCHEMA_VERSION, OperateError, } from './types.js';
8
8
  import { ensureOperatingDirectories, resolveOperatingPaths } from './workspace.js';
9
+ /**
10
+ * The protocol version an `operating-record` envelope carries. It is a pure
11
+ * function of the record content: a route record whose embedded route plan is a
12
+ * v1.3 (`create-quick-task`) plan is stamped v1.3 so it validates against the
13
+ * additive v1.3 operating-record schema (the only record schema whose route
14
+ * content accepts a v1.3 route plan). Every other record — including a v1.2
15
+ * route record — stays frozen at v1.2, so every existing write and the
16
+ * `records.jsonl` read-back are byte-identical. Because it is derived, the write
17
+ * path (`putRecord`) and the read-back (`logEntryToOperatingRecord`) agree.
18
+ */
19
+ function recordEnvelopeProtocolVersion(recordType, content) {
20
+ return recordType === 'route' && content.protocolVersion === OPERATE_MISSION_PROTOCOL_VERSION
21
+ ? OPERATE_MISSION_PROTOCOL_VERSION
22
+ : OPERATE_PROTOCOL_VERSION;
23
+ }
24
+ /** Map a v1.2 `operating-record` envelope to its v1.3 records-log entry. */
25
+ export function operatingRecordToLogEntry(record) {
26
+ return {
27
+ kind: 'operating-records-log-entry',
28
+ schemaVersion: record.schemaVersion,
29
+ protocolVersion: '1.3.0',
30
+ digest: record.digest,
31
+ recordType: record.recordType,
32
+ createdAt: record.createdAt,
33
+ correlationId: record.correlationId,
34
+ contentDigest: record.contentDigest,
35
+ content: record.content,
36
+ };
37
+ }
38
+ /** Exact inverse of {@link operatingRecordToLogEntry}. */
39
+ export function logEntryToOperatingRecord(entry) {
40
+ return {
41
+ kind: 'operating-record',
42
+ schemaVersion: entry.schemaVersion,
43
+ protocolVersion: recordEnvelopeProtocolVersion(entry.recordType, entry.content),
44
+ digest: entry.digest,
45
+ recordType: entry.recordType,
46
+ createdAt: entry.createdAt,
47
+ correlationId: entry.correlationId,
48
+ contentDigest: entry.contentDigest,
49
+ content: entry.content,
50
+ };
51
+ }
52
+ /** One canonical `.state/records.jsonl` line (no trailing newline) for a record. */
53
+ export function operatingRecordsLogLine(record) {
54
+ return canonicalize(operatingRecordToLogEntry(record));
55
+ }
56
+ async function fileExists(target) {
57
+ return access(target).then(() => true, () => false);
58
+ }
9
59
  async function durableAppend(target, line) {
10
60
  const handle = await open(target, 'a', 0o600);
11
61
  try {
@@ -29,9 +79,42 @@ async function atomicCanonicalWrite(target, value) {
29
79
  }
30
80
  await rename(temporary, target);
31
81
  }
32
- function recordPath(root, digest) {
82
+ // SPEC-002 (v1.2) directory-per-digest-prefix record file, kept only so readers
83
+ // can still resolve records on a project that has not yet migrated to the v1.3
84
+ // `.state/records.jsonl` append log. Live writes always target v1.3.
85
+ function legacyRecordPath(recordsDir, digest) {
33
86
  const hex = digest.slice('sha256:'.length);
34
- return path.join(root, hex.slice(0, 2), `${hex.slice(2)}.json`);
87
+ return path.join(recordsDir, hex.slice(0, 2), `${hex.slice(2)}.json`);
88
+ }
89
+ function legacyRecordsDir(operateRoot) {
90
+ return path.join(operateRoot, 'records', 'sha256');
91
+ }
92
+ function legacyEventsPath(operateRoot) {
93
+ return path.join(operateRoot, 'events.jsonl');
94
+ }
95
+ function legacyCheckpointPath(operateRoot) {
96
+ return path.join(operateRoot, 'checkpoints', 'current.json');
97
+ }
98
+ async function readRecordsLog(recordsFile) {
99
+ const raw = await readFile(recordsFile, 'utf8').catch((error) => {
100
+ if (error.code === 'ENOENT')
101
+ return '';
102
+ throw error;
103
+ });
104
+ const records = [];
105
+ for (const [index, line] of raw.split('\n').entries()) {
106
+ if (!line.trim())
107
+ continue;
108
+ let entry;
109
+ try {
110
+ entry = JSON.parse(line);
111
+ }
112
+ catch {
113
+ throw new OperateError('E_OPERATE_STATE_INVALID', `Operating records.jsonl line ${index + 1} is not valid JSON.`);
114
+ }
115
+ records.push(logEntryToOperatingRecord(entry));
116
+ }
117
+ return records;
35
118
  }
36
119
  export class OperatingEventStore {
37
120
  projectRoot;
@@ -48,8 +131,23 @@ export class OperatingEventStore {
48
131
  });
49
132
  await appendFile(this.paths.events, '', { encoding: 'utf8', mode: 0o600 });
50
133
  }
134
+ // Readers resolve the effective on-disk location so a project that has not yet
135
+ // migrated to the v1.3 `.state/` layout stays readable. Writers always target
136
+ // v1.3, because every mutating action migrates the layout before it proceeds.
137
+ async effectiveEventsPath() {
138
+ if (await fileExists(this.paths.events))
139
+ return this.paths.events;
140
+ const legacy = legacyEventsPath(this.paths.root);
141
+ return (await fileExists(legacy)) ? legacy : this.paths.events;
142
+ }
143
+ async effectiveCheckpointPath() {
144
+ if (await fileExists(this.paths.checkpoint))
145
+ return this.paths.checkpoint;
146
+ const legacy = legacyCheckpointPath(this.paths.root);
147
+ return (await fileExists(legacy)) ? legacy : this.paths.checkpoint;
148
+ }
51
149
  async replay() {
52
- const raw = await readFile(this.paths.events, 'utf8').catch((error) => {
150
+ const raw = await readFile(await this.effectiveEventsPath(), 'utf8').catch((error) => {
53
151
  if (error.code === 'ENOENT')
54
152
  return '';
55
153
  throw error;
@@ -93,7 +191,7 @@ export class OperatingEventStore {
93
191
  const record = {
94
192
  kind: 'operating-record',
95
193
  schemaVersion: OPERATE_SCHEMA_VERSION,
96
- protocolVersion: OPERATE_PROTOCOL_VERSION,
194
+ protocolVersion: recordEnvelopeProtocolVersion(recordType, content),
97
195
  digest,
98
196
  recordType,
99
197
  createdAt,
@@ -102,30 +200,37 @@ export class OperatingEventStore {
102
200
  content: structuredClone(content),
103
201
  };
104
202
  await assertOperatingArtifact('operating-record', record);
105
- const target = recordPath(this.paths.records, digest);
106
- await mkdir(path.dirname(target), { recursive: true, mode: 0o700 });
107
- try {
108
- const handle = await open(target, 'wx', 0o600);
109
- try {
110
- await handle.writeFile(canonicalize(record), 'utf8');
111
- await handle.sync();
112
- }
113
- finally {
114
- await handle.close();
115
- }
116
- }
117
- catch (error) {
118
- if (error.code !== 'EEXIST')
119
- throw error;
120
- const existing = await readFile(target, 'utf8');
121
- if (canonicalDigest(JSON.parse(existing)) !== canonicalDigest(record)) {
122
- throw new OperateError('E_OPERATE_STATE_INVALID', `Content-addressed operating record ${digest} does not match its path.`);
203
+ // Persist as a single canonical `operating-records-log-entry@1.3.0` line in
204
+ // the append-only `.state/records.jsonl`. The append is content-addressed:
205
+ // an identical prior entry is a no-op; a colliding digest with different
206
+ // bytes is rejected exactly as the per-file layout rejected it.
207
+ const logEntry = operatingRecordToLogEntry(record);
208
+ await assertOperatingArtifact('operating-records-log-entry', logEntry);
209
+ const line = canonicalize(logEntry);
210
+ for (const existing of await readRecordsLog(this.paths.records)) {
211
+ if (existing.digest !== digest)
212
+ continue;
213
+ if (canonicalDigest(existing) !== canonicalDigest(record)) {
214
+ throw new OperateError('E_OPERATE_STATE_INVALID', `Content-addressed operating record ${digest} does not match its stored line.`);
123
215
  }
216
+ return record;
124
217
  }
218
+ await durableAppend(this.paths.records, `${line}\n`);
125
219
  return record;
126
220
  }
127
221
  async readRecord(digest) {
128
- const record = JSON.parse(await readFile(recordPath(this.paths.records, digest), 'utf8'));
222
+ let record = (await readRecordsLog(this.paths.records)).find((entry) => entry.digest === digest);
223
+ if (!record) {
224
+ // A project that has not yet migrated still stores this record as a
225
+ // per-digest-prefix file under the SPEC-002 layout.
226
+ const legacy = legacyRecordPath(legacyRecordsDir(this.paths.root), digest);
227
+ if (await fileExists(legacy)) {
228
+ record = JSON.parse(await readFile(legacy, 'utf8'));
229
+ }
230
+ }
231
+ if (!record) {
232
+ throw new OperateError('E_OPERATE_STATE_INVALID', `Content-addressed operating record ${digest} is not present in records.jsonl.`);
233
+ }
129
234
  await assertOperatingArtifact('operating-record', record);
130
235
  if (record.digest !== digest ||
131
236
  record.contentDigest !== canonicalDigest(record.content) ||
@@ -164,6 +269,9 @@ export class OperatingEventStore {
164
269
  correlationId,
165
270
  evidenceRefs: [...new Set(input.evidenceRefs ?? [])].sort(),
166
271
  payload: structuredClone(input.payload ?? {}),
272
+ // Omitted for every v1.2 caller so the pipeline's `createOperatingEvent`
273
+ // default keeps the frozen v1.2 stamp and byte-identical event hash.
274
+ ...(input.protocolVersion ? { protocolVersion: input.protocolVersion } : {}),
167
275
  }, {
168
276
  previousEvent: replay.events.at(-1) ?? null,
169
277
  sequence: replay.eventHead.sequence + 1,
@@ -200,7 +308,7 @@ export class OperatingEventStore {
200
308
  async readCheckpoint(options = {}) {
201
309
  let checkpoint;
202
310
  try {
203
- checkpoint = JSON.parse(await readFile(this.paths.checkpoint, 'utf8'));
311
+ checkpoint = JSON.parse(await readFile(await this.effectiveCheckpointPath(), 'utf8'));
204
312
  }
205
313
  catch (error) {
206
314
  if (error.code === 'ENOENT')
@@ -215,11 +323,16 @@ export class OperatingEventStore {
215
323
  }
216
324
  }
217
325
  async listRecordDigests() {
218
- const { readdir } = await import('node:fs/promises');
219
- const prefixes = await readdir(this.paths.records).catch(() => []);
326
+ const fromLog = (await readRecordsLog(this.paths.records)).map((record) => record.digest);
327
+ if (fromLog.length > 0 || (await fileExists(this.paths.records))) {
328
+ return [...new Set(fromLog)].sort();
329
+ }
330
+ // SPEC-002 fallback: enumerate the per-digest-prefix directory tree.
331
+ const recordsDir = legacyRecordsDir(this.paths.root);
332
+ const prefixes = await readdir(recordsDir).catch(() => []);
220
333
  const digests = [];
221
334
  for (const prefix of prefixes) {
222
- const names = await readdir(path.join(this.paths.records, prefix)).catch(() => []);
335
+ const names = await readdir(path.join(recordsDir, prefix)).catch(() => []);
223
336
  for (const name of names) {
224
337
  if (/^[a-f0-9]{62}\.json$/.test(name) && /^[a-f0-9]{2}$/.test(prefix)) {
225
338
  digests.push(`sha256:${prefix}${name.slice(0, -5)}`);
@@ -1 +1 @@
1
- {"version":3,"file":"event-store.js","sourceRoot":"","sources":["../../../src/services/operate/event-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"event-store.js","sourceRoot":"","sources":["../../../src/services/operate/event-store.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,33 @@
1
- import type { OperatingEvidence, OperatingSensitivity } from './types.js';
1
+ import { type OperatingEvidence, type OperatingSensitivity } from './types.js';
2
+ export interface CitationSnapshotInput {
3
+ evidenceId: string;
4
+ citationKey?: string | null;
5
+ snapshotDigest: `sha256:${string}`;
6
+ sourceLocation: string;
7
+ sensitivity: OperatingSensitivity;
8
+ /** Already redacted through the standard evidence redaction path before it is handed in. */
9
+ content: string;
10
+ }
2
11
  export declare class OperatingEvidenceCache {
3
12
  private readonly cacheRoot;
4
13
  private readonly sensitivityCeiling;
5
14
  constructor(cacheRoot: string, sensitivityCeiling: OperatingSensitivity);
6
15
  put(cacheKey: string, evidence: OperatingEvidence, ttlMs: number, now?: Date): Promise<string>;
16
+ private citationSnapshotTarget;
17
+ /**
18
+ * Persist a resolved-citation snapshot as machine-local evidence, addressed by
19
+ * its resolver-minted `evidenceId`. Enforces the same sensitivity ceiling as
20
+ * collected evidence and refuses to persist any content that still matches a
21
+ * secret pattern — the snapshot is redacted upstream, and this is the
22
+ * fail-closed guard that keeps a raw secret off disk. Returns the `evidenceId`.
23
+ */
24
+ putCitationSnapshot(input: CitationSnapshotInput, ttlMs: number, now?: Date): Promise<string>;
25
+ /** Read back a resolved-citation snapshot by its `evidenceId`, honouring TTL and the sensitivity ceiling. */
26
+ getCitationSnapshot(evidenceId: string, now?: Date): Promise<{
27
+ content: string;
28
+ sensitivity: OperatingSensitivity;
29
+ sourceLocation: string;
30
+ } | undefined>;
7
31
  get(digest: string, now?: Date): Promise<OperatingEvidence | undefined>;
8
32
  status(now?: Date): Promise<{
9
33
  entries: number;
@@ -1 +1 @@
1
- {"version":3,"file":"evidence-cache.d.ts","sourceRoot":"","sources":["../../../src/services/operate/evidence-cache.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAY1E,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBADlB,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,oBAAoB;IAGrD,GAAG,CACP,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,MAAM,EACb,GAAG,OAAa,GACf,OAAO,CAAC,MAAM,CAAC;IAqBZ,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAa,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAuB7E,MAAM,CAAC,GAAG,OAAa,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAmBtF,YAAY,CAAC,GAAG,OAAa,EAAE,OAAO,GAAE;QAAE,GAAG,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAkBzF"}
1
+ {"version":3,"file":"evidence-cache.d.ts","sourceRoot":"","sources":["../../../src/services/operate/evidence-cache.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,KAAK,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,YAAY,CAAC;AA+B7F,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,cAAc,EAAE,UAAU,MAAM,EAAE,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,oBAAoB,CAAC;IAClC,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;gBADlB,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,oBAAoB;IAGrD,GAAG,CACP,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,MAAM,EACb,GAAG,OAAa,GACf,OAAO,CAAC,MAAM,CAAC;IAqBlB,OAAO,CAAC,sBAAsB;IAO9B;;;;;;OAMG;IACG,mBAAmB,CACvB,KAAK,EAAE,qBAAqB,EAC5B,KAAK,EAAE,MAAM,EACb,GAAG,OAAa,GACf,OAAO,CAAC,MAAM,CAAC;IA2BlB,6GAA6G;IACvG,mBAAmB,CACvB,UAAU,EAAE,MAAM,EAClB,GAAG,OAAa,GACf,OAAO,CACR;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,oBAAoB,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAC3F;IA2BK,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAa,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAuB7E,MAAM,CAAC,GAAG,OAAa,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAmBtF,YAAY,CAAC,GAAG,OAAa,EAAE,OAAO,GAAE;QAAE,GAAG,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAkBzF"}
@@ -1,7 +1,8 @@
1
1
  import { mkdir, readdir, readFile, rename, unlink, writeFile } from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { canonicalDigest, canonicalize } from './canonical.js';
4
- import { assertSensitivityAllowed, maximumSensitivity } from './redaction.js';
4
+ import { assertSensitivityAllowed, containsSecret, maximumSensitivity } from './redaction.js';
5
+ import { OperateError } from './types.js';
5
6
  export class OperatingEvidenceCache {
6
7
  cacheRoot;
7
8
  sensitivityCeiling;
@@ -29,6 +30,66 @@ export class OperatingEvidenceCache {
29
30
  await rename(temporary, target);
30
31
  return digest;
31
32
  }
33
+ citationSnapshotTarget(evidenceId) {
34
+ return path.join(this.cacheRoot, `citation-${canonicalDigest(evidenceId).slice('sha256:'.length)}.json`);
35
+ }
36
+ /**
37
+ * Persist a resolved-citation snapshot as machine-local evidence, addressed by
38
+ * its resolver-minted `evidenceId`. Enforces the same sensitivity ceiling as
39
+ * collected evidence and refuses to persist any content that still matches a
40
+ * secret pattern — the snapshot is redacted upstream, and this is the
41
+ * fail-closed guard that keeps a raw secret off disk. Returns the `evidenceId`.
42
+ */
43
+ async putCitationSnapshot(input, ttlMs, now = new Date()) {
44
+ assertSensitivityAllowed(input.sensitivity, this.sensitivityCeiling);
45
+ if (containsSecret(input.content)) {
46
+ throw new OperateError('E_OPERATE_SECRET_DETECTED', 'A citation snapshot must be redacted before it is persisted to machine-local evidence.');
47
+ }
48
+ const record = {
49
+ implementation: 'openplanr-operate-citation-snapshot',
50
+ evidenceId: input.evidenceId,
51
+ citationKey: input.citationKey ?? null,
52
+ snapshotDigest: input.snapshotDigest,
53
+ sourceLocation: input.sourceLocation,
54
+ createdAt: now.toISOString(),
55
+ expiresAt: new Date(now.getTime() + ttlMs).toISOString(),
56
+ sensitivity: input.sensitivity,
57
+ content: input.content,
58
+ };
59
+ await mkdir(this.cacheRoot, { recursive: true, mode: 0o700 });
60
+ const target = this.citationSnapshotTarget(input.evidenceId);
61
+ const temporary = `${target}.${process.pid}.tmp`;
62
+ await writeFile(temporary, `${canonicalize(record)}\n`, { mode: 0o600 });
63
+ await rename(temporary, target);
64
+ return input.evidenceId;
65
+ }
66
+ /** Read back a resolved-citation snapshot by its `evidenceId`, honouring TTL and the sensitivity ceiling. */
67
+ async getCitationSnapshot(evidenceId, now = new Date()) {
68
+ const target = this.citationSnapshotTarget(evidenceId);
69
+ let record;
70
+ try {
71
+ record = JSON.parse(await readFile(target, 'utf8'));
72
+ }
73
+ catch (error) {
74
+ if (error.code === 'ENOENT')
75
+ return undefined;
76
+ throw error;
77
+ }
78
+ if (record.implementation !== 'openplanr-operate-citation-snapshot' ||
79
+ record.evidenceId !== evidenceId) {
80
+ return undefined;
81
+ }
82
+ if (Date.parse(record.expiresAt) <= now.getTime()) {
83
+ await unlink(target).catch(() => undefined);
84
+ return undefined;
85
+ }
86
+ assertSensitivityAllowed(record.sensitivity, this.sensitivityCeiling);
87
+ return {
88
+ content: record.content,
89
+ sensitivity: record.sensitivity,
90
+ sourceLocation: record.sourceLocation,
91
+ };
92
+ }
32
93
  async get(digest, now = new Date()) {
33
94
  const target = path.join(this.cacheRoot, `${digest}.json`);
34
95
  let record;
@@ -1 +1 @@
1
- {"version":3,"file":"evidence-cache.js","sourceRoot":"","sources":["../../../src/services/operate/evidence-cache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evidence-cache.js","sourceRoot":"","sources":["../../../src/services/operate/evidence-cache.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { type ReadOnlyFetch } from './read-only-providers.js';
2
- import { type CollectedEvidenceItem, type EvidenceBudget, type OperatingDataGap, type OperatingEvidence, type OperatingEvidenceItem, type OperatingSensitivity, type OperatingWorkspaceManifest } from './types.js';
2
+ import { type CollectedEvidenceItem, type EvidenceBudget, type OperatingDataGap, type OperatingEvidence, type OperatingEvidenceIndexItem, type OperatingEvidenceItem, type OperatingSensitivity, type OperatingWorkspaceManifest } from './types.js';
3
3
  export interface EvidenceCollectionInput {
4
4
  projectRoot: string;
5
5
  cycleId: string;
@@ -68,4 +68,23 @@ export declare function evidenceProjectionSources(evidence: OperatingEvidence):
68
68
  status: string;
69
69
  itemCount: number;
70
70
  }>;
71
+ /**
72
+ * Build Protocol v1.3 evidence index items (`operating-evidence-index-item@1.3.0`)
73
+ * from a collected evidence snapshot for mission-mode dispatch. Each item is a
74
+ * pointer only — path OR revision, content hash, source, classification,
75
+ * freshness, sensitivity, and detected signals — and carries NO file body. Git
76
+ * evidence is referenced by its pinned revision; repository/planr/file-import
77
+ * evidence by its repository-relative path. Items that cannot be represented as
78
+ * a schema-valid path or revision pointer (github/linear records, dot-prefixed
79
+ * planr paths) are omitted from the index rather than emitted malformed.
80
+ */
81
+ export declare function buildOperatingEvidenceIndex(evidence: OperatingEvidence, options?: {
82
+ sensitivityCeiling?: OperatingSensitivity;
83
+ }): OperatingEvidenceIndexItem[];
84
+ /**
85
+ * The read roots a mission agent may traverse, derived from the top-level
86
+ * directory segment of every path-referenced index item. Schema-valid and
87
+ * deduplicated; empty when the index carries only revision pointers.
88
+ */
89
+ export declare function deriveOperatingDeclaredRoots(index: readonly OperatingEvidenceIndexItem[]): string[];
71
90
  //# sourceMappingURL=evidence.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../../src/services/operate/evidence.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../../../src/services/operate/evidence.ts"],"names":[],"mappings":"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"}
@@ -1063,4 +1063,123 @@ export function evidenceProjectionSources(evidence) {
1063
1063
  itemCount: source.itemCount,
1064
1064
  }));
1065
1065
  }
1066
+ // The Protocol v1.3 index-item schema pins these patterns; every index item we
1067
+ // emit must satisfy them or the pipeline's mission-packet validator fails
1068
+ // closed. Building here — rather than trusting the caller — keeps a malformed
1069
+ // path or revision out of a dispatched packet.
1070
+ const INDEX_PATH_PATTERN = /^(?!.*\.\.)[A-Za-z0-9][A-Za-z0-9._/-]*$/;
1071
+ const INDEX_REVISION_PATTERN = /^[a-f0-9]{7,64}$/;
1072
+ const INDEX_SOURCE_CLASSIFICATION = {
1073
+ repository: 'source-code',
1074
+ planr: 'planning-artifact',
1075
+ git: 'change-history',
1076
+ 'file-import': 'imported-record',
1077
+ github: 'integration-record',
1078
+ linear: 'integration-record',
1079
+ };
1080
+ /**
1081
+ * Derive a stable, schema-conformant index-item id (`EVX-…`) from the source
1082
+ * evidence id. The evidence ids are unique, so the derived ids are too.
1083
+ */
1084
+ function evidenceIndexItemId(evidenceId) {
1085
+ return `EVX-${canonicalDigest(evidenceId).slice('sha256:'.length, 27)}`;
1086
+ }
1087
+ /**
1088
+ * Strip the leading component id from an evidence `location`
1089
+ * (`<componentId>/<relativePath>`) to recover the repository-relative path, or
1090
+ * return null when the result cannot be a schema-valid index path (for example
1091
+ * dot-prefixed `.planr/…` paths, which the pattern forbids).
1092
+ */
1093
+ function evidenceIndexPath(location) {
1094
+ const relative = location.split('/').slice(1).join('/');
1095
+ return relative && INDEX_PATH_PATTERN.test(relative) ? relative : null;
1096
+ }
1097
+ function evidenceIndexSignals(item) {
1098
+ const signals = new Set();
1099
+ for (const claim of item.claimTypes) {
1100
+ const trimmed = claim.trim();
1101
+ if (trimmed)
1102
+ signals.add(trimmed.slice(0, 256));
1103
+ }
1104
+ if (item.freshness === 'stale')
1105
+ signals.add('stale-evidence');
1106
+ if (item.repository?.dirtyFingerprint)
1107
+ signals.add('uncommitted-working-tree');
1108
+ return [...signals].sort();
1109
+ }
1110
+ /**
1111
+ * Build Protocol v1.3 evidence index items (`operating-evidence-index-item@1.3.0`)
1112
+ * from a collected evidence snapshot for mission-mode dispatch. Each item is a
1113
+ * pointer only — path OR revision, content hash, source, classification,
1114
+ * freshness, sensitivity, and detected signals — and carries NO file body. Git
1115
+ * evidence is referenced by its pinned revision; repository/planr/file-import
1116
+ * evidence by its repository-relative path. Items that cannot be represented as
1117
+ * a schema-valid path or revision pointer (github/linear records, dot-prefixed
1118
+ * planr paths) are omitted from the index rather than emitted malformed.
1119
+ */
1120
+ export function buildOperatingEvidenceIndex(evidence, options = {}) {
1121
+ const seen = new Set();
1122
+ const items = [];
1123
+ for (const item of evidence.items) {
1124
+ if (options.sensitivityCeiling &&
1125
+ compareSensitivity(item.sensitivity, options.sensitivityCeiling) > 0) {
1126
+ continue;
1127
+ }
1128
+ const source = item.source;
1129
+ const classification = INDEX_SOURCE_CLASSIFICATION[source];
1130
+ if (!classification)
1131
+ continue;
1132
+ const base = {
1133
+ id: evidenceIndexItemId(item.id),
1134
+ contentHash: item.digest,
1135
+ source,
1136
+ classification,
1137
+ freshness: item.freshness,
1138
+ sensitivity: item.sensitivity,
1139
+ signals: evidenceIndexSignals(item),
1140
+ };
1141
+ if (seen.has(base.id))
1142
+ continue;
1143
+ if (source === 'git') {
1144
+ const revision = item.repository?.revision;
1145
+ if (revision && INDEX_REVISION_PATTERN.test(revision)) {
1146
+ seen.add(base.id);
1147
+ items.push({ ...base, revision });
1148
+ }
1149
+ continue;
1150
+ }
1151
+ if (source === 'repository' || source === 'planr' || source === 'file-import') {
1152
+ const relativePath = evidenceIndexPath(item.location);
1153
+ if (relativePath) {
1154
+ seen.add(base.id);
1155
+ items.push({ ...base, path: relativePath });
1156
+ }
1157
+ }
1158
+ }
1159
+ return items.sort((left, right) => {
1160
+ if (left.source !== right.source)
1161
+ return left.source < right.source ? -1 : 1;
1162
+ const leftRef = left.path ?? left.revision ?? '';
1163
+ const rightRef = right.path ?? right.revision ?? '';
1164
+ if (leftRef !== rightRef)
1165
+ return leftRef < rightRef ? -1 : 1;
1166
+ return left.id < right.id ? -1 : left.id > right.id ? 1 : 0;
1167
+ });
1168
+ }
1169
+ /**
1170
+ * The read roots a mission agent may traverse, derived from the top-level
1171
+ * directory segment of every path-referenced index item. Schema-valid and
1172
+ * deduplicated; empty when the index carries only revision pointers.
1173
+ */
1174
+ export function deriveOperatingDeclaredRoots(index) {
1175
+ const roots = new Set();
1176
+ for (const item of index) {
1177
+ if (!item.path)
1178
+ continue;
1179
+ const top = item.path.split('/')[0];
1180
+ if (top && INDEX_PATH_PATTERN.test(top))
1181
+ roots.add(top);
1182
+ }
1183
+ return [...roots].sort();
1184
+ }
1066
1185
  //# sourceMappingURL=evidence.js.map