openplanr 1.13.2 → 1.14.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 (159) hide show
  1. package/README.md +46 -4
  2. package/dist/cli/commands/artifact.d.ts.map +1 -1
  3. package/dist/cli/commands/artifact.js +17 -6
  4. package/dist/cli/commands/artifact.js.map +1 -1
  5. package/dist/cli/commands/operate.d.ts +3 -0
  6. package/dist/cli/commands/operate.d.ts.map +1 -0
  7. package/dist/cli/commands/operate.js +568 -0
  8. package/dist/cli/commands/operate.js.map +1 -0
  9. package/dist/cli/index.js +42 -2
  10. package/dist/cli/index.js.map +1 -1
  11. package/dist/services/ai-service.d.ts +9 -2
  12. package/dist/services/ai-service.d.ts.map +1 -1
  13. package/dist/services/ai-service.js +14 -6
  14. package/dist/services/ai-service.js.map +1 -1
  15. package/dist/services/artifact-pipeline-service.d.ts +1 -0
  16. package/dist/services/artifact-pipeline-service.d.ts.map +1 -1
  17. package/dist/services/artifact-pipeline-service.js.map +1 -1
  18. package/dist/services/delta-apply-service.js +1 -1
  19. package/dist/services/delta-apply-service.js.map +1 -1
  20. package/dist/services/operate/advisors.d.ts +219 -0
  21. package/dist/services/operate/advisors.d.ts.map +1 -0
  22. package/dist/services/operate/advisors.js +745 -0
  23. package/dist/services/operate/advisors.js.map +1 -0
  24. package/dist/services/operate/artifact-route-generation.d.ts +111 -0
  25. package/dist/services/operate/artifact-route-generation.d.ts.map +1 -0
  26. package/dist/services/operate/artifact-route-generation.js +459 -0
  27. package/dist/services/operate/artifact-route-generation.js.map +1 -0
  28. package/dist/services/operate/artifacts.d.ts +26 -0
  29. package/dist/services/operate/artifacts.d.ts.map +1 -0
  30. package/dist/services/operate/artifacts.js +92 -0
  31. package/dist/services/operate/artifacts.js.map +1 -0
  32. package/dist/services/operate/canonical.d.ts +18 -0
  33. package/dist/services/operate/canonical.d.ts.map +1 -0
  34. package/dist/services/operate/canonical.js +157 -0
  35. package/dist/services/operate/canonical.js.map +1 -0
  36. package/dist/services/operate/config.d.ts +56 -0
  37. package/dist/services/operate/config.d.ts.map +1 -0
  38. package/dist/services/operate/config.js +644 -0
  39. package/dist/services/operate/config.js.map +1 -0
  40. package/dist/services/operate/consolidation.d.ts +18 -0
  41. package/dist/services/operate/consolidation.d.ts.map +1 -0
  42. package/dist/services/operate/consolidation.js +539 -0
  43. package/dist/services/operate/consolidation.js.map +1 -0
  44. package/dist/services/operate/doctor.d.ts +12 -0
  45. package/dist/services/operate/doctor.d.ts.map +1 -0
  46. package/dist/services/operate/doctor.js +307 -0
  47. package/dist/services/operate/doctor.js.map +1 -0
  48. package/dist/services/operate/engine.d.ts +53 -0
  49. package/dist/services/operate/engine.d.ts.map +1 -0
  50. package/dist/services/operate/engine.js +1097 -0
  51. package/dist/services/operate/engine.js.map +1 -0
  52. package/dist/services/operate/event-store.d.ts +57 -0
  53. package/dist/services/operate/event-store.d.ts.map +1 -0
  54. package/dist/services/operate/event-store.js +232 -0
  55. package/dist/services/operate/event-store.js.map +1 -0
  56. package/dist/services/operate/evidence-cache.d.ts +17 -0
  57. package/dist/services/operate/evidence-cache.d.ts.map +1 -0
  58. package/dist/services/operate/evidence-cache.js +96 -0
  59. package/dist/services/operate/evidence-cache.js.map +1 -0
  60. package/dist/services/operate/evidence-import.d.ts +40 -0
  61. package/dist/services/operate/evidence-import.d.ts.map +1 -0
  62. package/dist/services/operate/evidence-import.js +340 -0
  63. package/dist/services/operate/evidence-import.js.map +1 -0
  64. package/dist/services/operate/evidence-readiness.d.ts +8 -0
  65. package/dist/services/operate/evidence-readiness.d.ts.map +1 -0
  66. package/dist/services/operate/evidence-readiness.js +78 -0
  67. package/dist/services/operate/evidence-readiness.js.map +1 -0
  68. package/dist/services/operate/evidence.d.ts +71 -0
  69. package/dist/services/operate/evidence.d.ts.map +1 -0
  70. package/dist/services/operate/evidence.js +1022 -0
  71. package/dist/services/operate/evidence.js.map +1 -0
  72. package/dist/services/operate/ids.d.ts +7 -0
  73. package/dist/services/operate/ids.d.ts.map +1 -0
  74. package/dist/services/operate/ids.js +23 -0
  75. package/dist/services/operate/ids.js.map +1 -0
  76. package/dist/services/operate/index.d.ts +14 -0
  77. package/dist/services/operate/index.d.ts.map +1 -0
  78. package/dist/services/operate/index.js +881 -0
  79. package/dist/services/operate/index.js.map +1 -0
  80. package/dist/services/operate/journal.d.ts +34 -0
  81. package/dist/services/operate/journal.d.ts.map +1 -0
  82. package/dist/services/operate/journal.js +229 -0
  83. package/dist/services/operate/journal.js.map +1 -0
  84. package/dist/services/operate/legacy-import-service.d.ts +58 -0
  85. package/dist/services/operate/legacy-import-service.d.ts.map +1 -0
  86. package/dist/services/operate/legacy-import-service.js +922 -0
  87. package/dist/services/operate/legacy-import-service.js.map +1 -0
  88. package/dist/services/operate/lifecycle.d.ts +88 -0
  89. package/dist/services/operate/lifecycle.d.ts.map +1 -0
  90. package/dist/services/operate/lifecycle.js +556 -0
  91. package/dist/services/operate/lifecycle.js.map +1 -0
  92. package/dist/services/operate/lock-service.d.ts +37 -0
  93. package/dist/services/operate/lock-service.d.ts.map +1 -0
  94. package/dist/services/operate/lock-service.js +208 -0
  95. package/dist/services/operate/lock-service.js.map +1 -0
  96. package/dist/services/operate/maintenance.d.ts +38 -0
  97. package/dist/services/operate/maintenance.d.ts.map +1 -0
  98. package/dist/services/operate/maintenance.js +699 -0
  99. package/dist/services/operate/maintenance.js.map +1 -0
  100. package/dist/services/operate/outcomes.d.ts +48 -0
  101. package/dist/services/operate/outcomes.d.ts.map +1 -0
  102. package/dist/services/operate/outcomes.js +312 -0
  103. package/dist/services/operate/outcomes.js.map +1 -0
  104. package/dist/services/operate/pipeline-handoff.d.ts +138 -0
  105. package/dist/services/operate/pipeline-handoff.d.ts.map +1 -0
  106. package/dist/services/operate/pipeline-handoff.js +175 -0
  107. package/dist/services/operate/pipeline-handoff.js.map +1 -0
  108. package/dist/services/operate/projection-persistence.d.ts +55 -0
  109. package/dist/services/operate/projection-persistence.d.ts.map +1 -0
  110. package/dist/services/operate/projection-persistence.js +393 -0
  111. package/dist/services/operate/projection-persistence.js.map +1 -0
  112. package/dist/services/operate/projection.d.ts +4 -0
  113. package/dist/services/operate/projection.d.ts.map +1 -0
  114. package/dist/services/operate/projection.js +128 -0
  115. package/dist/services/operate/projection.js.map +1 -0
  116. package/dist/services/operate/protocol.d.ts +60 -0
  117. package/dist/services/operate/protocol.d.ts.map +1 -0
  118. package/dist/services/operate/protocol.js +62 -0
  119. package/dist/services/operate/protocol.js.map +1 -0
  120. package/dist/services/operate/read-only-providers.d.ts +38 -0
  121. package/dist/services/operate/read-only-providers.d.ts.map +1 -0
  122. package/dist/services/operate/read-only-providers.js +286 -0
  123. package/dist/services/operate/read-only-providers.js.map +1 -0
  124. package/dist/services/operate/redaction.d.ts +47 -0
  125. package/dist/services/operate/redaction.d.ts.map +1 -0
  126. package/dist/services/operate/redaction.js +279 -0
  127. package/dist/services/operate/redaction.js.map +1 -0
  128. package/dist/services/operate/reducer.d.ts +10 -0
  129. package/dist/services/operate/reducer.d.ts.map +1 -0
  130. package/dist/services/operate/reducer.js +11 -0
  131. package/dist/services/operate/reducer.js.map +1 -0
  132. package/dist/services/operate/routes.d.ts +49 -0
  133. package/dist/services/operate/routes.d.ts.map +1 -0
  134. package/dist/services/operate/routes.js +996 -0
  135. package/dist/services/operate/routes.js.map +1 -0
  136. package/dist/services/operate/shipment-observer.d.ts +14 -0
  137. package/dist/services/operate/shipment-observer.d.ts.map +1 -0
  138. package/dist/services/operate/shipment-observer.js +321 -0
  139. package/dist/services/operate/shipment-observer.js.map +1 -0
  140. package/dist/services/operate/stalled-item-service.d.ts +18 -0
  141. package/dist/services/operate/stalled-item-service.d.ts.map +1 -0
  142. package/dist/services/operate/stalled-item-service.js +121 -0
  143. package/dist/services/operate/stalled-item-service.js.map +1 -0
  144. package/dist/services/operate/subprocess-env.d.ts +4 -0
  145. package/dist/services/operate/subprocess-env.d.ts.map +1 -0
  146. package/dist/services/operate/subprocess-env.js +45 -0
  147. package/dist/services/operate/subprocess-env.js.map +1 -0
  148. package/dist/services/operate/types.d.ts +729 -0
  149. package/dist/services/operate/types.d.ts.map +1 -0
  150. package/dist/services/operate/types.js +13 -0
  151. package/dist/services/operate/types.js.map +1 -0
  152. package/dist/services/operate/workspace.d.ts +59 -0
  153. package/dist/services/operate/workspace.d.ts.map +1 -0
  154. package/dist/services/operate/workspace.js +316 -0
  155. package/dist/services/operate/workspace.js.map +1 -0
  156. package/dist/services/runtime-manager-service.d.ts.map +1 -1
  157. package/dist/services/runtime-manager-service.js +71 -2
  158. package/dist/services/runtime-manager-service.js.map +1 -1
  159. package/package.json +10 -4
@@ -0,0 +1,286 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import { parseStrictJson } from './evidence-import.js';
4
+ import { minimalSubprocessEnvironment } from './subprocess-env.js';
5
+ import { OperateError } from './types.js';
6
+ const execFileAsync = promisify(execFile);
7
+ const MAX_PROVIDER_OUTPUT = 5 * 1024 * 1024;
8
+ const DEFAULT_REMOTE_TIMEOUT_MS = 20_000;
9
+ const DEFAULT_REMOTE_MAX_BYTES = 5 * 1024 * 1024;
10
+ function minimalEnvironment(extra = {}) {
11
+ return minimalSubprocessEnvironment(extra);
12
+ }
13
+ const GIT_READ_COMMANDS = new Set([
14
+ 'diff',
15
+ 'log',
16
+ 'show',
17
+ 'status',
18
+ 'tag',
19
+ 'rev-parse',
20
+ 'ls-files',
21
+ 'branch',
22
+ ]);
23
+ export function assertGitReadOnlyArgs(args) {
24
+ const forbiddenRepositoryOverrides = [
25
+ '-C',
26
+ '-c',
27
+ '--git-dir',
28
+ '--work-tree',
29
+ '--namespace',
30
+ '--exec-path',
31
+ '--config-env',
32
+ ];
33
+ if (args.some((argument) => forbiddenRepositoryOverrides.some((option) => argument === option || argument.startsWith(`${option}=`)))) {
34
+ throw new OperateError('E_OPERATE_PROVIDER_READ_ONLY', 'Git repository and configuration overrides are forbidden for evidence.');
35
+ }
36
+ const command = args.find((argument) => !argument.startsWith('-'));
37
+ if (!command || !GIT_READ_COMMANDS.has(command)) {
38
+ throw new OperateError('E_OPERATE_PROVIDER_READ_ONLY', `Git operation is not allowlisted for evidence: ${command ?? '(missing)'}.`);
39
+ }
40
+ const forbidden = new Set([
41
+ 'commit',
42
+ 'checkout',
43
+ 'switch',
44
+ 'reset',
45
+ 'clean',
46
+ 'push',
47
+ 'pull',
48
+ 'fetch',
49
+ 'merge',
50
+ 'rebase',
51
+ 'cherry-pick',
52
+ 'apply',
53
+ 'am',
54
+ 'gc',
55
+ 'config',
56
+ 'remote',
57
+ ]);
58
+ if (args.some((argument) => forbidden.has(argument))) {
59
+ throw new OperateError('E_OPERATE_PROVIDER_READ_ONLY', 'Git mutation is forbidden.');
60
+ }
61
+ }
62
+ export async function executeGitReadOnly(projectRoot, args, options = {}) {
63
+ assertGitReadOnlyArgs(args);
64
+ const { stdout } = await execFileAsync('git', args, {
65
+ cwd: projectRoot,
66
+ env: minimalEnvironment(),
67
+ maxBuffer: MAX_PROVIDER_OUTPUT,
68
+ timeout: Math.max(1, Math.min(options.timeoutMs ?? 15_000, 15_000)),
69
+ });
70
+ return stdout;
71
+ }
72
+ const GH_READ_COMMANDS = {
73
+ issue: new Set(['list', 'view']),
74
+ pr: new Set(['list', 'view', 'checks']),
75
+ release: new Set(['list', 'view']),
76
+ run: new Set(['list', 'view']),
77
+ repo: new Set(['view']),
78
+ auth: new Set(['status', 'token']),
79
+ };
80
+ export function assertGitHubReadOnlyArgs(args) {
81
+ const [resource, action] = args;
82
+ if (!resource || !action || !GH_READ_COMMANDS[resource]?.has(action)) {
83
+ throw new OperateError('E_OPERATE_PROVIDER_READ_ONLY', `GitHub operation is not allowlisted for evidence: ${resource ?? ''} ${action ?? ''}`.trim());
84
+ }
85
+ if (args.includes('--web') || args.includes('--jq') || args.includes('--template')) {
86
+ throw new OperateError('E_OPERATE_PROVIDER_READ_ONLY', 'GitHub evidence cannot open browsers or execute output templates.');
87
+ }
88
+ }
89
+ export async function executeGitHubReadOnly(projectRoot, args, options = {}) {
90
+ assertGitHubReadOnlyArgs(args);
91
+ const host = process.env.GH_HOST ?? 'github.com';
92
+ const allowedHosts = options.allowedHosts ?? ['github.com'];
93
+ if (!allowedHosts.includes(host)) {
94
+ throw new OperateError('E_OPERATE_PROVIDER_READ_ONLY', `GitHub host ${host} is not allowlisted.`);
95
+ }
96
+ const { stdout } = await execFileAsync('gh', args, {
97
+ cwd: projectRoot,
98
+ env: minimalEnvironment({ GH_HOST: host, GH_PROMPT_DISABLED: '1' }),
99
+ maxBuffer: MAX_PROVIDER_OUTPUT,
100
+ timeout: Math.max(1, Math.min(options.timeoutMs ?? 20_000, 20_000)),
101
+ });
102
+ return stdout;
103
+ }
104
+ function normalizedAllowedHosts(hosts) {
105
+ return new Set(hosts.map((host) => host.trim().toLowerCase()).filter(Boolean));
106
+ }
107
+ export function assertReadOnlyRestRequest(endpoint, method, allowedHosts) {
108
+ const url = new URL(endpoint);
109
+ const normalizedMethod = method.toUpperCase();
110
+ if (normalizedMethod !== 'GET' && normalizedMethod !== 'HEAD') {
111
+ throw new OperateError('E_OPERATE_PROVIDER_READ_ONLY', `Remote evidence permits GET and HEAD only, not ${normalizedMethod}.`);
112
+ }
113
+ if (url.protocol !== 'https:' ||
114
+ url.username ||
115
+ url.password ||
116
+ (url.port && url.port !== '443') ||
117
+ !normalizedAllowedHosts(allowedHosts).has(url.hostname.toLowerCase())) {
118
+ throw new OperateError('E_OPERATE_PROVIDER_READ_ONLY', `Remote evidence host is not allowlisted: ${url.hostname || '(missing)'}.`);
119
+ }
120
+ return url;
121
+ }
122
+ function boundedPositiveInteger(value, fallback, maximum) {
123
+ if (value === undefined)
124
+ return fallback;
125
+ if (!Number.isSafeInteger(value) || value < 1) {
126
+ throw new OperateError('E_OPERATE_EVIDENCE_REJECTED', 'Remote evidence limits must be positive integers.');
127
+ }
128
+ return Math.min(value, maximum);
129
+ }
130
+ async function readBoundedResponseText(response, maxBytes) {
131
+ if (response.redirected || (response.status >= 300 && response.status < 400)) {
132
+ throw new OperateError('E_OPERATE_PROVIDER_READ_ONLY', 'Remote evidence redirects are forbidden.');
133
+ }
134
+ if (!response.ok) {
135
+ throw new OperateError('E_OPERATE_EVIDENCE_REJECTED', `Remote evidence request failed with HTTP ${response.status}.`);
136
+ }
137
+ const rawLength = response.headers.get('content-length');
138
+ if (rawLength !== null) {
139
+ if (!/^\d+$/.test(rawLength) || Number(rawLength) > maxBytes) {
140
+ throw new OperateError('E_OPERATE_EVIDENCE_REJECTED', 'Remote evidence Content-Length is invalid or exceeds the configured limit.');
141
+ }
142
+ }
143
+ if (!response.body)
144
+ return '';
145
+ const reader = response.body.getReader();
146
+ const chunks = [];
147
+ let bytes = 0;
148
+ try {
149
+ while (true) {
150
+ const next = await reader.read();
151
+ if (next.done)
152
+ break;
153
+ bytes += next.value.byteLength;
154
+ if (bytes > maxBytes) {
155
+ await reader
156
+ .cancel('OpenPlanr remote evidence byte limit exceeded.')
157
+ .catch(() => undefined);
158
+ throw new OperateError('E_OPERATE_EVIDENCE_REJECTED', 'Remote evidence streamed response exceeds the configured byte limit.');
159
+ }
160
+ chunks.push(next.value);
161
+ }
162
+ }
163
+ finally {
164
+ reader.releaseLock();
165
+ }
166
+ const merged = Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)), bytes);
167
+ try {
168
+ return new TextDecoder('utf-8', { fatal: true }).decode(merged);
169
+ }
170
+ catch {
171
+ throw new OperateError('E_OPERATE_EVIDENCE_REJECTED', 'Remote evidence is not valid UTF-8.');
172
+ }
173
+ }
174
+ async function fetchBoundedJson(endpoint, init, options) {
175
+ const timeoutMs = boundedPositiveInteger(options.timeoutMs, DEFAULT_REMOTE_TIMEOUT_MS, 60_000);
176
+ const maxBytes = boundedPositiveInteger(options.maxBytes, DEFAULT_REMOTE_MAX_BYTES, DEFAULT_REMOTE_MAX_BYTES);
177
+ const controller = new AbortController();
178
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
179
+ try {
180
+ const response = await (options.fetchImpl ?? fetch)(endpoint, {
181
+ ...init,
182
+ redirect: 'error',
183
+ signal: controller.signal,
184
+ });
185
+ if (response.redirected || (response.status >= 300 && response.status < 400)) {
186
+ throw new OperateError('E_OPERATE_PROVIDER_READ_ONLY', 'Remote evidence redirects are forbidden.');
187
+ }
188
+ const contentType = response.headers.get('content-type') ?? '';
189
+ if (response.status !== 204 &&
190
+ contentType &&
191
+ !/(?:application\/json|\+json)\b/i.test(contentType)) {
192
+ throw new OperateError('E_OPERATE_EVIDENCE_REJECTED', 'Remote evidence response is not JSON.');
193
+ }
194
+ const body = await readBoundedResponseText(response, maxBytes);
195
+ if (!body && response.status === 204)
196
+ return null;
197
+ try {
198
+ return parseStrictJson(body, {
199
+ maxBytes,
200
+ maxDepth: 64,
201
+ maxScalars: 100_000,
202
+ maxStringLength: maxBytes,
203
+ });
204
+ }
205
+ catch (error) {
206
+ if (error instanceof OperateError)
207
+ throw error;
208
+ throw new OperateError('E_OPERATE_EVIDENCE_REJECTED', 'Remote evidence response contains malformed JSON.');
209
+ }
210
+ }
211
+ catch (error) {
212
+ if (error.name === 'AbortError') {
213
+ throw new OperateError('E_OPERATE_EVIDENCE_REJECTED', `Remote evidence request exceeded the ${timeoutMs}ms timeout.`);
214
+ }
215
+ throw error;
216
+ }
217
+ finally {
218
+ clearTimeout(timer);
219
+ }
220
+ }
221
+ export async function executeRestReadOnlyJson(endpoint, options) {
222
+ const method = options.method ?? 'GET';
223
+ const url = assertReadOnlyRestRequest(endpoint, method, options.allowedHosts);
224
+ return fetchBoundedJson(url, {
225
+ method,
226
+ headers: options.headers,
227
+ }, options);
228
+ }
229
+ function stripGraphqlComments(query) {
230
+ return query.replace(/#[^\r\n]*/g, '').trim();
231
+ }
232
+ export function assertLinearReadOnlyQuery(endpoint, query) {
233
+ const url = new URL(endpoint);
234
+ if (url.protocol !== 'https:' ||
235
+ url.hostname !== 'api.linear.app' ||
236
+ url.pathname !== '/graphql' ||
237
+ url.username ||
238
+ url.password ||
239
+ (url.port && url.port !== '443') ||
240
+ url.search ||
241
+ url.hash) {
242
+ throw new OperateError('E_OPERATE_PROVIDER_READ_ONLY', 'Linear evidence endpoint must be https://api.linear.app/graphql.');
243
+ }
244
+ const normalized = stripGraphqlComments(query);
245
+ if (/\b(?:mutation|subscription)\b/i.test(normalized) ||
246
+ (!normalized.startsWith('query') && !normalized.startsWith('{'))) {
247
+ throw new OperateError('E_OPERATE_PROVIDER_READ_ONLY', 'Linear evidence permits GraphQL query operations only.');
248
+ }
249
+ }
250
+ export class ReadOnlyLinearTransport {
251
+ transport;
252
+ constructor(transport) {
253
+ this.transport = transport;
254
+ }
255
+ async query(query, variables) {
256
+ assertLinearReadOnlyQuery(this.transport.endpoint, query);
257
+ return this.transport.query(query, variables);
258
+ }
259
+ }
260
+ export async function executeLinearReadOnlyQuery(input) {
261
+ const endpoint = input.endpoint ?? 'https://api.linear.app/graphql';
262
+ assertLinearReadOnlyQuery(endpoint, input.query);
263
+ if (!input.token.trim()) {
264
+ throw new OperateError('E_OPERATE_EVIDENCE_REJECTED', 'Linear evidence credentials are unavailable.');
265
+ }
266
+ const requestBody = JSON.stringify({
267
+ query: input.query,
268
+ variables: input.variables ?? {},
269
+ });
270
+ if (Buffer.byteLength(requestBody) > 256 * 1024) {
271
+ throw new OperateError('E_OPERATE_EVIDENCE_REJECTED', 'Linear evidence query exceeds the request-size limit.');
272
+ }
273
+ const response = await fetchBoundedJson(new URL(endpoint), {
274
+ method: 'POST',
275
+ headers: {
276
+ authorization: input.token,
277
+ 'content-type': 'application/json',
278
+ },
279
+ body: requestBody,
280
+ }, input);
281
+ if (response.errors?.length || response.data === undefined) {
282
+ throw new OperateError('E_OPERATE_EVIDENCE_REJECTED', 'Linear evidence query returned a GraphQL error.');
283
+ }
284
+ return response.data;
285
+ }
286
+ //# sourceMappingURL=read-only-providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read-only-providers.js","sourceRoot":"","sources":["../../../src/services/operate/read-only-providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { type CollectedEvidenceItem, type OperatingEvidenceItem, type OperatingSensitivity } from './types.js';
2
+ export declare function compareSensitivity(left: OperatingSensitivity, right: OperatingSensitivity): number;
3
+ export declare function maximumSensitivity(values: readonly OperatingSensitivity[]): OperatingSensitivity;
4
+ export declare function assertSensitivityAllowed(sensitivity: OperatingSensitivity, ceiling: OperatingSensitivity): void;
5
+ export declare function normalizeUntrustedText(value: string): string;
6
+ export interface RedactionResult {
7
+ value: string;
8
+ redactions: string[];
9
+ inputDigest: `sha256:${string}`;
10
+ }
11
+ export interface EmbeddedInstructionInspection {
12
+ annotations: string[];
13
+ quarantined: boolean;
14
+ }
15
+ /**
16
+ * Classify instruction-shaped text before it is placed in an advisor pack.
17
+ *
18
+ * Evidence is allowed to discuss prompts and tools, so ordinary control-like
19
+ * prose is annotated and then inert-framed. Direct tool/credential
20
+ * exfiltration instructions are quarantined instead of being sent to a model.
21
+ */
22
+ export declare function inspectEmbeddedInstructions(input: string): EmbeddedInstructionInspection;
23
+ export interface AdvisorEvidenceText {
24
+ value: string;
25
+ annotations: string[];
26
+ quarantined: boolean;
27
+ reason: string | null;
28
+ }
29
+ /**
30
+ * Redact, inspect, and deterministically frame one evidence excerpt.
31
+ *
32
+ * The digest-derived boundary prevents evidence from manufacturing a matching
33
+ * closing marker. The framed value remains plain text inside the JSON advisor
34
+ * pack and is never promoted to a system/developer instruction.
35
+ */
36
+ export declare function prepareAdvisorEvidenceText(input: {
37
+ evidenceId: string;
38
+ digest: `sha256:${string}`;
39
+ value: string;
40
+ }): AdvisorEvidenceText;
41
+ export declare function redactSensitiveText(input: string, options?: {
42
+ redactPii?: boolean;
43
+ }): RedactionResult;
44
+ export declare function containsSecret(value: string): boolean;
45
+ export declare function sanitizeEvidenceItem(input: CollectedEvidenceItem): OperatingEvidenceItem;
46
+ export declare function sanitizeGeneratedPlainText(value: string): string;
47
+ //# sourceMappingURL=redaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../../../src/services/operate/redaction.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,qBAAqB,EAE1B,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAC1B,MAAM,YAAY,CAAC;AA+HpB,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,oBAAoB,GAC1B,MAAM,CAER;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,oBAAoB,EAAE,GAAG,oBAAoB,CAKhG;AAED,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,oBAAoB,EACjC,OAAO,EAAE,oBAAoB,GAC5B,IAAI,CAON;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,UAAU,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,MAAM,GAAG,6BAA6B,CAcxF;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,UAAU,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;CACf,GAAG,mBAAmB,CAqDtB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,eAAe,CAsBjB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAWrD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,qBAAqB,GAAG,qBAAqB,CAmCxF;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMhE"}
@@ -0,0 +1,279 @@
1
+ import { sha256Digest } from './canonical.js';
2
+ import { OperateError, } from './types.js';
3
+ const SENSITIVITY_RANK = {
4
+ public: 0,
5
+ internal: 1,
6
+ confidential: 2,
7
+ restricted: 3,
8
+ };
9
+ const BIDI_AND_INVISIBLE =
10
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: untrusted evidence must strip C0/C1 and bidi controls.
11
+ /[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f\u200b-\u200f\u202a-\u202e\u2060-\u2069\ufeff]/g;
12
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI stripping intentionally recognizes ESC and BEL.
13
+ const ANSI_ESCAPE = /\u001b(?:\[[0-?]*[ -/]*[@-~]|\][^\u0007]*(?:\u0007|\u001b\\))/g;
14
+ const EMBEDDED_INSTRUCTION_PATTERNS = [
15
+ {
16
+ label: 'instruction-override',
17
+ pattern: /\b(?:ignore|disregard|override|forget)\s+(?:all\s+)?(?:previous|prior|system|developer|user)\s+(?:instructions?|messages?|prompts?)\b/gi,
18
+ risk: 'annotate',
19
+ },
20
+ {
21
+ label: 'role-control-marker',
22
+ pattern: /(?:<\s*\/?\s*(?:system|assistant|developer|tool)\b|\[\s*INST\s*]|\b(?:system|developer)\s+(?:message|prompt)\s*:)/gi,
23
+ risk: 'annotate',
24
+ },
25
+ {
26
+ label: 'identity-override',
27
+ pattern: /\b(?:you are now|act as|pretend to be|switch roles? to)\b/gi,
28
+ risk: 'annotate',
29
+ },
30
+ {
31
+ label: 'output-control',
32
+ pattern: /\b(?:return|respond|reply|output)\s+(?:only|exactly|with)\b|\bdo not (?:mention|reveal|disclose)\b/gi,
33
+ risk: 'annotate',
34
+ },
35
+ {
36
+ label: 'secret-exfiltration',
37
+ pattern: /\b(?:read|print|dump|reveal|exfiltrate|upload|send)\b[\s\S]{0,96}\b(?:process\.env|environment variables?|credentials?|secrets?|tokens?|private keys?)\b/gi,
38
+ risk: 'quarantine',
39
+ },
40
+ {
41
+ label: 'tool-invocation-directive',
42
+ pattern: /\b(?:call|invoke|use|run)\s+(?:the\s+)?(?:shell|terminal|browser|network|file|filesystem)\s+(?:tool|command)\b/gi,
43
+ risk: 'annotate',
44
+ },
45
+ {
46
+ label: 'remote-execution-text',
47
+ pattern: /\b(?:curl|wget)\s+https?:\/\/|\b(?:eval|exec)\s*\(/gi,
48
+ risk: 'annotate',
49
+ },
50
+ {
51
+ label: 'obfuscated-execution-directive',
52
+ pattern: /\batob\s*\([\s\S]{0,256}\b(?:eval|exec)\b/gi,
53
+ risk: 'quarantine',
54
+ },
55
+ ];
56
+ const SECRET_PATTERNS = [
57
+ {
58
+ label: 'private-key',
59
+ pattern: /-----BEGIN(?: [A-Z0-9]+)? PRIVATE KEY-----[\s\S]*?-----END(?: [A-Z0-9]+)? PRIVATE KEY-----/g,
60
+ replacement: '[REDACTED_PRIVATE_KEY]',
61
+ },
62
+ {
63
+ label: 'authorization',
64
+ pattern: /\b(?:authorization|proxy-authorization)\s*:\s*(?:bearer|basic)\s+\S+/gi,
65
+ replacement: 'authorization: [REDACTED]',
66
+ },
67
+ {
68
+ label: 'known-token',
69
+ pattern: /\b(?:gh[pousr]_[A-Za-z0-9_]{20,}|github_pat_[A-Za-z0-9_]{20,}|lin_api_[A-Za-z0-9_-]{20,}|sk-(?:ant-|proj-)?[A-Za-z0-9_-]{20,}|[sr]k_live_[A-Za-z0-9]{16,}|xox[baprs]-[A-Za-z0-9-]{20,}|npm_[A-Za-z0-9]{20,}|AKIA[0-9A-Z]{16}|AIza[0-9A-Za-z_-]{30,})\b/g,
70
+ replacement: '[REDACTED_TOKEN]',
71
+ },
72
+ {
73
+ label: 'jwt',
74
+ pattern: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,
75
+ replacement: '[REDACTED_JWT]',
76
+ },
77
+ {
78
+ label: 'secret-assignment',
79
+ pattern: /^([ \t]*(?:export[ \t]+)?[A-Za-z0-9_]*(?:SECRET|TOKEN|PASSWORD|PASSWD|API_?KEY|PRIVATE_?KEY)[A-Za-z0-9_]*[ \t]*[=:][ \t]*)(.+)$/gim,
80
+ replacement: '$1[REDACTED]',
81
+ },
82
+ {
83
+ label: 'structured-secret',
84
+ pattern: /((?:"|')?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|client[_-]?secret|private[_-]?key|password|passwd|secret|token)(?:"|')?[ \t]*[:=][ \t]*)(?:"[^"\r\n]*"|'[^'\r\n]*'|[^\s,}\]\r\n#]+)/gi,
85
+ replacement: '$1"[REDACTED]"',
86
+ },
87
+ {
88
+ label: 'credential-url',
89
+ pattern: /\b(https?:\/\/)[^/\s:@]+:[^@\s/]+@/gi,
90
+ replacement: '$1[REDACTED]@',
91
+ },
92
+ ];
93
+ const PII_PATTERNS = [
94
+ {
95
+ label: 'email',
96
+ pattern: /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi,
97
+ replacement: '[REDACTED_EMAIL]',
98
+ },
99
+ {
100
+ label: 'user-home',
101
+ pattern: /(?:\/Users\/|\/home\/)[^/\s"'`]+/g,
102
+ replacement: '/home/[REDACTED_USER]',
103
+ },
104
+ {
105
+ label: 'windows-home',
106
+ pattern: /\b[A-Z]:\\Users\\[^\\\s"'`]+/gi,
107
+ replacement: 'C:\\Users\\[REDACTED_USER]',
108
+ },
109
+ ];
110
+ export function compareSensitivity(left, right) {
111
+ return SENSITIVITY_RANK[left] - SENSITIVITY_RANK[right];
112
+ }
113
+ export function maximumSensitivity(values) {
114
+ return values.reduce((maximum, value) => (compareSensitivity(value, maximum) > 0 ? value : maximum), 'public');
115
+ }
116
+ export function assertSensitivityAllowed(sensitivity, ceiling) {
117
+ if (compareSensitivity(sensitivity, ceiling) > 0) {
118
+ throw new OperateError('E_OPERATE_EVIDENCE_REJECTED', `Evidence sensitivity ${sensitivity} exceeds the configured ${ceiling} ceiling.`);
119
+ }
120
+ }
121
+ export function normalizeUntrustedText(value) {
122
+ return value.normalize('NFC').replace(ANSI_ESCAPE, '').replace(BIDI_AND_INVISIBLE, '');
123
+ }
124
+ /**
125
+ * Classify instruction-shaped text before it is placed in an advisor pack.
126
+ *
127
+ * Evidence is allowed to discuss prompts and tools, so ordinary control-like
128
+ * prose is annotated and then inert-framed. Direct tool/credential
129
+ * exfiltration instructions are quarantined instead of being sent to a model.
130
+ */
131
+ export function inspectEmbeddedInstructions(input) {
132
+ const value = normalizeUntrustedText(input);
133
+ const annotations = [];
134
+ let quarantined = false;
135
+ for (const candidate of EMBEDDED_INSTRUCTION_PATTERNS) {
136
+ candidate.pattern.lastIndex = 0;
137
+ if (!candidate.pattern.test(value))
138
+ continue;
139
+ annotations.push(candidate.label);
140
+ quarantined ||= candidate.risk === 'quarantine';
141
+ }
142
+ return {
143
+ annotations: [...new Set(annotations)].sort(),
144
+ quarantined,
145
+ };
146
+ }
147
+ /**
148
+ * Redact, inspect, and deterministically frame one evidence excerpt.
149
+ *
150
+ * The digest-derived boundary prevents evidence from manufacturing a matching
151
+ * closing marker. The framed value remains plain text inside the JSON advisor
152
+ * pack and is never promoted to a system/developer instruction.
153
+ */
154
+ export function prepareAdvisorEvidenceText(input) {
155
+ if (Buffer.byteLength(input.value, 'utf8') > 16 * 1024) {
156
+ return {
157
+ value: '',
158
+ annotations: ['oversized-evidence'],
159
+ quarantined: true,
160
+ reason: 'Evidence excerpt exceeds the bounded advisor-pack size.',
161
+ };
162
+ }
163
+ let redacted;
164
+ try {
165
+ redacted = redactSensitiveText(input.value);
166
+ }
167
+ catch {
168
+ return {
169
+ value: '',
170
+ annotations: ['unredactable-sensitive-content'],
171
+ quarantined: true,
172
+ reason: 'Evidence could not be safely redacted for advisor use.',
173
+ };
174
+ }
175
+ const inspection = inspectEmbeddedInstructions(redacted.value);
176
+ const annotations = [
177
+ ...inspection.annotations,
178
+ ...(redacted.redactions.length > 0 ? ['sensitive-content-redacted'] : []),
179
+ ].sort();
180
+ if (inspection.quarantined) {
181
+ return {
182
+ value: '',
183
+ annotations,
184
+ quarantined: true,
185
+ reason: 'Evidence contains a direct tool, execution, or secret-exfiltration instruction.',
186
+ };
187
+ }
188
+ const token = sha256Digest(Buffer.from(`${input.evidenceId}\0${input.digest}\0${redacted.inputDigest}`)).slice('sha256:'.length, 'sha256:'.length + 20);
189
+ const opening = `<<<OPENPLANR_UNTRUSTED_EVIDENCE:${token}>>>`;
190
+ const closing = `<<<END_OPENPLANR_UNTRUSTED_EVIDENCE:${token}>>>`;
191
+ const escaped = redacted.value
192
+ .replaceAll(opening, '[ESCAPED_EVIDENCE_BOUNDARY]')
193
+ .replaceAll(closing, '[ESCAPED_EVIDENCE_BOUNDARY]');
194
+ return {
195
+ value: [
196
+ opening,
197
+ `evidence_id=${input.evidenceId}`,
198
+ `annotations=${annotations.length > 0 ? annotations.join(',') : 'none'}`,
199
+ escaped,
200
+ closing,
201
+ ].join('\n'),
202
+ annotations,
203
+ quarantined: false,
204
+ reason: null,
205
+ };
206
+ }
207
+ export function redactSensitiveText(input, options = {}) {
208
+ const inputDigest = sha256Digest(Buffer.from(input));
209
+ let value = normalizeUntrustedText(input);
210
+ const redactions = [];
211
+ for (const candidate of [
212
+ ...SECRET_PATTERNS,
213
+ ...(options.redactPii === false ? [] : PII_PATTERNS),
214
+ ]) {
215
+ candidate.pattern.lastIndex = 0;
216
+ if (candidate.pattern.test(value)) {
217
+ redactions.push(candidate.label);
218
+ candidate.pattern.lastIndex = 0;
219
+ value = value.replace(candidate.pattern, candidate.replacement);
220
+ }
221
+ }
222
+ if (containsSecret(value)) {
223
+ throw new OperateError('E_OPERATE_SECRET_DETECTED', 'Evidence still contains a secret-like value after redaction.');
224
+ }
225
+ return { value, redactions: [...new Set(redactions)].sort(), inputDigest };
226
+ }
227
+ export function containsSecret(value) {
228
+ const candidate = value
229
+ .replace(/(?:"|')?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|auth[_-]?token|client[_-]?secret|private[_-]?key|password|passwd|secret|token)(?:"|')?[ \t]*[:=][ \t]*(?:"|')?\[REDACTED(?:_[A-Z_]+)?\](?:"|')?/gi, '')
230
+ .replace(/\[REDACTED(?:_[A-Z_]+)?\]/g, '');
231
+ return SECRET_PATTERNS.some(({ pattern }) => {
232
+ pattern.lastIndex = 0;
233
+ return pattern.test(candidate);
234
+ });
235
+ }
236
+ export function sanitizeEvidenceItem(input) {
237
+ const redacted = redactSensitiveText(input.content);
238
+ const repository = input.repository
239
+ ? {
240
+ componentId: input.repository.componentId,
241
+ canonicalRemote: input.repository.canonicalRemote,
242
+ revision: input.repository.revision,
243
+ configuredBranch: input.repository.configuredBranch,
244
+ dirtyFingerprint: input.repository.dirtyFingerprint,
245
+ }
246
+ : undefined;
247
+ return {
248
+ id: input.id,
249
+ source: input.source,
250
+ location: input.location,
251
+ digest: sha256Digest(redacted.value),
252
+ collectedAt: input.collectedAt,
253
+ observedFrom: input.observedFrom ?? null,
254
+ observedTo: input.observedTo ?? null,
255
+ freshness: input.freshness,
256
+ sensitivity: input.sensitivity,
257
+ claimTypes: [...new Set(input.claimTypes)].sort(),
258
+ ...(repository ? { repository } : {}),
259
+ ...(input.metric
260
+ ? {
261
+ metric: {
262
+ identity: sanitizeGeneratedPlainText(input.metric.identity),
263
+ query: sanitizeGeneratedPlainText(input.metric.query),
264
+ observedFrom: input.metric.observedFrom,
265
+ observedTo: input.metric.observedTo,
266
+ },
267
+ }
268
+ : {}),
269
+ summary: redacted.value.slice(0, 4_096),
270
+ };
271
+ }
272
+ export function sanitizeGeneratedPlainText(value) {
273
+ const redacted = redactSensitiveText(value);
274
+ return redacted.value
275
+ .replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi, '[REMOVED_SCRIPT]')
276
+ .replace(/\b(?:javascript|vbscript):/gi, 'blocked:')
277
+ .replace(/!\[[^\]]*]\((?:https?:|data:)[^)]+\)/gi, '[REMOTE_IMAGE_REMOVED]');
278
+ }
279
+ //# sourceMappingURL=redaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redaction.js","sourceRoot":"","sources":["../../../src/services/operate/redaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { OperatingCheckpoint, OperatingEvent, OperatingState } from './types.js';
2
+ /** Canonical projection is owned by planr-pipeline/protocol, never duplicated here. */
3
+ export declare function reduceOperatingEvents(events: OperatingEvent[], options?: {
4
+ checkpoint?: OperatingCheckpoint | null;
5
+ }): Promise<OperatingState>;
6
+ export declare function verifyOperatingEvents(events: OperatingEvent[]): Promise<{
7
+ sequence: number;
8
+ hash: `sha256:${string}` | null;
9
+ }>;
10
+ //# sourceMappingURL=reducer.d.ts.map