@dsh-enhanced/assistant-skills 0.1.30

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 (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +211 -0
  3. package/cordis.patch.yml +3 -0
  4. package/lib/capture-expansion.d.ts +18 -0
  5. package/lib/capture-expansion.d.ts.map +1 -0
  6. package/lib/capture-expansion.js +187 -0
  7. package/lib/capture-expansion.js.map +1 -0
  8. package/lib/comparison.d.ts +69 -0
  9. package/lib/comparison.d.ts.map +1 -0
  10. package/lib/comparison.js +173 -0
  11. package/lib/comparison.js.map +1 -0
  12. package/lib/definition.d.ts +163 -0
  13. package/lib/definition.d.ts.map +1 -0
  14. package/lib/definition.js +450 -0
  15. package/lib/definition.js.map +1 -0
  16. package/lib/external-holdout.d.ts +34 -0
  17. package/lib/external-holdout.d.ts.map +1 -0
  18. package/lib/external-holdout.js +212 -0
  19. package/lib/external-holdout.js.map +1 -0
  20. package/lib/holdout-authority.d.ts +123 -0
  21. package/lib/holdout-authority.d.ts.map +1 -0
  22. package/lib/holdout-authority.js +263 -0
  23. package/lib/holdout-authority.js.map +1 -0
  24. package/lib/holdout-cli.d.ts +4 -0
  25. package/lib/holdout-cli.d.ts.map +1 -0
  26. package/lib/holdout-cli.js +221 -0
  27. package/lib/holdout-cli.js.map +1 -0
  28. package/lib/holdout-qualification.d.ts +83 -0
  29. package/lib/holdout-qualification.d.ts.map +1 -0
  30. package/lib/holdout-qualification.js +306 -0
  31. package/lib/holdout-qualification.js.map +1 -0
  32. package/lib/index.d.ts +22 -0
  33. package/lib/index.d.ts.map +1 -0
  34. package/lib/index.js +9 -0
  35. package/lib/index.js.map +1 -0
  36. package/lib/prospective-holdout.d.ts +35 -0
  37. package/lib/prospective-holdout.d.ts.map +1 -0
  38. package/lib/prospective-holdout.js +254 -0
  39. package/lib/prospective-holdout.js.map +1 -0
  40. package/lib/repair-admission.d.ts +11 -0
  41. package/lib/repair-admission.d.ts.map +1 -0
  42. package/lib/repair-admission.js +25 -0
  43. package/lib/repair-admission.js.map +1 -0
  44. package/lib/repair-agent.d.ts +44 -0
  45. package/lib/repair-agent.d.ts.map +1 -0
  46. package/lib/repair-agent.js +241 -0
  47. package/lib/repair-agent.js.map +1 -0
  48. package/lib/repair-feedback.d.ts +70 -0
  49. package/lib/repair-feedback.d.ts.map +1 -0
  50. package/lib/repair-feedback.js +79 -0
  51. package/lib/repair-feedback.js.map +1 -0
  52. package/lib/repair-profile.d.ts +27 -0
  53. package/lib/repair-profile.d.ts.map +1 -0
  54. package/lib/repair-profile.js +51 -0
  55. package/lib/repair-profile.js.map +1 -0
  56. package/lib/repair-runtime.d.ts +35 -0
  57. package/lib/repair-runtime.d.ts.map +1 -0
  58. package/lib/repair-runtime.js +181 -0
  59. package/lib/repair-runtime.js.map +1 -0
  60. package/lib/replay.d.ts +38 -0
  61. package/lib/replay.d.ts.map +1 -0
  62. package/lib/replay.js +240 -0
  63. package/lib/replay.js.map +1 -0
  64. package/lib/sealed-holdout.d.ts +20 -0
  65. package/lib/sealed-holdout.d.ts.map +1 -0
  66. package/lib/sealed-holdout.js +12 -0
  67. package/lib/sealed-holdout.js.map +1 -0
  68. package/lib/service.d.ts +968 -0
  69. package/lib/service.d.ts.map +1 -0
  70. package/lib/service.js +1929 -0
  71. package/lib/service.js.map +1 -0
  72. package/lib/store.d.ts +366 -0
  73. package/lib/store.d.ts.map +1 -0
  74. package/lib/store.js +1517 -0
  75. package/lib/store.js.map +1 -0
  76. package/lib/version.d.ts +2 -0
  77. package/lib/version.d.ts.map +1 -0
  78. package/lib/version.js +2 -0
  79. package/lib/version.js.map +1 -0
  80. package/lib/watch-proof.d.ts +30 -0
  81. package/lib/watch-proof.d.ts.map +1 -0
  82. package/lib/watch-proof.js +209 -0
  83. package/lib/watch-proof.js.map +1 -0
  84. package/package.json +141 -0
@@ -0,0 +1,181 @@
1
+ import { SkillStore } from './store.js';
2
+ const uncertain = new Set(['creating-repair', 'capturing', 'comparing']);
3
+ const terminal = new Set(['complete', 'rejected', 'revoked', 'expired', 'unknown']);
4
+ const checkpoint = (record, extra) => ({ ...record.checkpoint, ...extra });
5
+ const validRepair = (value) => !!value && typeof value === 'object'
6
+ && typeof value.sessionId === 'string' && typeof value.goalId === 'string'
7
+ && value.sessionId.length > 0 && value.goalId.length > 0;
8
+ function validId(value, key) {
9
+ const id = value && typeof value === 'object' ? value[key] : undefined;
10
+ return typeof id === 'string' && id.length > 0;
11
+ }
12
+ function validNext(value) {
13
+ const input = value;
14
+ return !!input && typeof input === 'object' && typeof input.profileId === 'string' && input.profileId.length > 0 && typeof input.predecessorDeploymentId === 'string' && input.predecessorDeploymentId.length > 0
15
+ && !!input.source && typeof input.source.goalId === 'string' && input.source.goalId.length > 0 && typeof input.source.sessionId === 'string' && input.source.sessionId.length > 0
16
+ && typeof input.source.nativeGoalId === 'string' && input.source.nativeGoalId.length > 0 && typeof input.source.definitionDigest === 'string' && /^[a-f0-9]{64}$/u.test(input.source.definitionDigest);
17
+ }
18
+ /**
19
+ * Host-owned finite continuation driver. A successor iteration requires a
20
+ * validated new source and the frozen profile sequence before Store advances it.
21
+ */
22
+ export class RepairContinuationRuntime {
23
+ store;
24
+ ports;
25
+ #lifecycle = new AbortController();
26
+ #inflight = new Map();
27
+ #disposed = false;
28
+ #tickAll;
29
+ #disposing;
30
+ constructor(store, ports) {
31
+ this.store = store;
32
+ this.ports = ports;
33
+ }
34
+ recover(scope, id) {
35
+ const record = this.store.getRepairContinuation(scope, id);
36
+ // Recovery never races a local dispatcher and never mutates after disposal.
37
+ if (this.#disposed || this.#inflight.has(id))
38
+ return record;
39
+ if (!record || !uncertain.has(record.state))
40
+ return record;
41
+ return this.store.transitionRepairContinuation(scope, record.id, record.revision, 'unknown', checkpoint(record, { recovery: 'uncertain-dispatch' }));
42
+ }
43
+ tick(scope, id) {
44
+ if (this.#disposed)
45
+ return Promise.reject(new Error('assistant-skills: repair runtime disposed'));
46
+ const existing = this.#inflight.get(id);
47
+ if (existing)
48
+ return existing;
49
+ const task = this.#tick(scope, id).finally(() => this.#inflight.delete(id));
50
+ this.#inflight.set(id, task);
51
+ return task;
52
+ }
53
+ tickAll() {
54
+ if (this.#disposed)
55
+ throw new Error('assistant-skills: repair runtime disposed');
56
+ return this.#tickAll ??= this.#tickAllRun().finally(() => { this.#tickAll = undefined; });
57
+ }
58
+ async #tickAllRun() {
59
+ const records = this.store.listRepairContinuations().filter(record => !terminal.has(record.state));
60
+ const results = [];
61
+ const errors = [];
62
+ // Store authorization limits iterations to four; process only four owned
63
+ // tasks at once so a Host restart cannot fan out unbounded work.
64
+ for (let start = 0; start < records.length; start += 4) {
65
+ const settled = await Promise.allSettled(records.slice(start, start + 4).map(record => this.tick(record.scope, record.id)));
66
+ for (const result of settled) {
67
+ if (result.status === 'fulfilled')
68
+ results.push(result.value);
69
+ else
70
+ errors.push(result.reason);
71
+ }
72
+ }
73
+ if (errors.length)
74
+ throw new AggregateError(errors, 'assistant-skills: repair continuation tick failed');
75
+ return results;
76
+ }
77
+ dispose() {
78
+ if (this.#disposing)
79
+ return this.#disposing;
80
+ this.#disposed = true;
81
+ this.#lifecycle.abort();
82
+ return this.#disposing = Promise.allSettled(this.#inflight.values()).then(() => undefined);
83
+ }
84
+ #current(record, signal) {
85
+ signal.throwIfAborted();
86
+ this.#lifecycle.signal.throwIfAborted();
87
+ if (record.authorization.expiresAt <= Date.now())
88
+ throw new Error('assistant-skills: repair continuation expired');
89
+ this.ports.assertCurrent(record);
90
+ }
91
+ #transition(record, state, extra) {
92
+ return this.store.transitionRepairContinuation(record.scope, record.id, record.revision, state, checkpoint(record, extra));
93
+ }
94
+ #ended(record, state, reason) {
95
+ return this.#transition(record, state, { failure: reason });
96
+ }
97
+ async #dispatch(record, signal, action) {
98
+ this.#current(record, signal);
99
+ const value = await action();
100
+ this.#current(record, signal);
101
+ return value;
102
+ }
103
+ async #tick(scope, id) {
104
+ let record = this.store.getRepairContinuation(scope, id);
105
+ if (!record)
106
+ throw new Error('assistant-skills: repair continuation missing');
107
+ if (terminal.has(record.state))
108
+ return record;
109
+ const signal = AbortSignal.any([this.#lifecycle.signal]);
110
+ try {
111
+ this.#current(record, signal);
112
+ switch (record.state) {
113
+ case 'armed': {
114
+ if (record.iteration > 1 && record.checkpoint.trigger !== undefined)
115
+ return this.#transition(record, 'source-confirmed', {});
116
+ const evidence = await this.#dispatch(record, signal, () => this.ports.inspectTrigger(record, signal));
117
+ if (evidence === undefined)
118
+ return record;
119
+ return this.#transition(record, 'source-confirmed', { trigger: evidence });
120
+ }
121
+ case 'source-confirmed': {
122
+ record = this.#transition(record, 'creating-repair', {}); // checkpoint before external creation
123
+ const repair = await this.#dispatch(record, signal, () => this.ports.createRepair(record, record.checkpoint.trigger, signal));
124
+ if (!validRepair(repair))
125
+ throw new Error('assistant-skills: repair creation response invalid');
126
+ return this.#transition(record, 'repairing', { repair });
127
+ }
128
+ case 'repairing': {
129
+ const status = await this.#dispatch(record, signal, () => this.ports.inspectRepair(record, signal));
130
+ if (status === 'running')
131
+ return record;
132
+ return status === 'achieved' ? this.#transition(record, 'repair-achieved', {}) : this.#ended(record, 'rejected', 'repair-rejected');
133
+ }
134
+ case 'repair-achieved': {
135
+ record = this.#transition(record, 'capturing', {}); // checkpoint before candidate capture
136
+ const captured = await this.#dispatch(record, signal, () => this.ports.capture(record, signal));
137
+ if (!validId(captured, 'candidateId'))
138
+ throw new Error('assistant-skills: repair capture response invalid');
139
+ return this.#transition(record, 'candidate-staged', { candidateId: captured.candidateId });
140
+ }
141
+ case 'candidate-staged': {
142
+ record = this.#transition(record, 'comparing', {}); // checkpoint before canary dispatch
143
+ const compared = await this.#dispatch(record, signal, () => this.ports.compare(record, signal));
144
+ if (!validId(compared, 'deploymentId'))
145
+ throw new Error('assistant-skills: repair comparison response invalid');
146
+ return this.#transition(record, 'watching', { deploymentId: compared.deploymentId });
147
+ }
148
+ case 'watching': {
149
+ const status = await this.#dispatch(record, signal, () => this.ports.inspectDeployment(record, signal));
150
+ if (status === 'watching')
151
+ return record;
152
+ if (status === 'complete' && record.iteration >= record.authorization.maxIterations)
153
+ return this.#transition(record, 'complete', {});
154
+ if (status === 'rejected' && record.iteration >= record.authorization.maxIterations)
155
+ return this.#ended(record, 'rejected', 'deployment-rejected');
156
+ if (this.ports.inspectNextIteration === undefined || this.ports.assertNextIteration === undefined)
157
+ return this.#ended(record, 'rejected', 'next-source-unavailable');
158
+ const next = await this.#dispatch(record, signal, () => this.ports.inspectNextIteration(record, signal));
159
+ if (!validNext(next))
160
+ return status === 'complete' ? record : this.#ended(record, 'rejected', 'next-source-unavailable');
161
+ this.ports.assertNextIteration(record, next);
162
+ return this.store.nextRepairIteration(record.scope, record.id, record.revision, next);
163
+ }
164
+ default: return record;
165
+ }
166
+ }
167
+ catch (error) {
168
+ // A revoke/expiry/revision replacement during an await owns the record.
169
+ // Never overwrite it or advance a late candidate/deployment result.
170
+ const current = this.store.getRepairContinuation(scope, id);
171
+ if (!current || terminal.has(current.state) || current.revision !== record.revision)
172
+ throw error;
173
+ const expired = current.authorization.expiresAt <= Date.now();
174
+ // Work that was checkpointed as dispatched is uncertain; failures before
175
+ // a dispatch are a rejection of the finite authority.
176
+ this.#ended(current, expired ? 'expired' : uncertain.has(current.state) ? 'unknown' : 'rejected', expired ? 'expired' : uncertain.has(current.state) ? 'dispatch-uncertain' : 'authority-or-port-failed');
177
+ throw error;
178
+ }
179
+ }
180
+ }
181
+ //# sourceMappingURL=repair-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-runtime.js","sourceRoot":"","sources":["../src/repair-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type SkillDefinition } from './definition.js';
2
+ export interface ReplayInput {
3
+ definition: SkillDefinition;
4
+ inputs: Readonly<Record<string, unknown>>;
5
+ files: readonly {
6
+ path: string;
7
+ content: string;
8
+ }[];
9
+ artifactPath: string;
10
+ stateRoot: string;
11
+ maxToolCalls: number;
12
+ maxBytes: number;
13
+ signal: AbortSignal;
14
+ authorize: () => void;
15
+ }
16
+ export type ReplayStep = {
17
+ id: string;
18
+ toolName: 'read' | 'write' | 'edit';
19
+ outcome: 'executed';
20
+ resultDigest: string;
21
+ } | {
22
+ id: string;
23
+ toolName: 'glob' | 'grep' | 'get_goal';
24
+ outcome: 'omitted-observation';
25
+ observation: 'provenance-only';
26
+ };
27
+ export interface ReplayResult {
28
+ artifact: string;
29
+ toolCalls: number;
30
+ executedToolCalls: number;
31
+ omittedObservations: number;
32
+ steps: readonly ReplayStep[];
33
+ quiescent: true;
34
+ }
35
+ /** Validate the fixed captured trace without granting its observations executable authority. */
36
+ export declare function validateReplayTrace(definition: SkillDefinition, maxToolCalls: number, maxBytes: number): readonly ReplayStep[];
37
+ export declare function replaySkill(input: ReplayInput): Promise<ReplayResult>;
38
+ //# sourceMappingURL=replay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AASA,OAAO,EAAqC,KAAK,eAAe,EAAkB,MAAM,iBAAiB,CAAA;AAEzG,MAAM,WAAW,WAAW;IAAG,UAAU,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,KAAK,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,MAAM,IAAI,CAAA;CAAE;AACzR,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GAC9F;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;IAAC,OAAO,EAAE,qBAAqB,CAAC;IAAC,WAAW,EAAE,iBAAiB,CAAA;CAAE,CAAA;AAC1H,MAAM,WAAW,YAAY;IAAG,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IAAC,SAAS,EAAE,IAAI,CAAA;CAAE;AAmE5K,gGAAgG;AAChG,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,UAAU,EAAE,CAkB9H;AAMD,wBAAsB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAqC3E"}
package/lib/replay.js ADDED
@@ -0,0 +1,240 @@
1
+ import { Context } from '@deepseek-ai/cordis';
2
+ import LocalFileSystem from '@deepseek-ai/dsh-fs-local';
3
+ import ToolRuntime from '@deepseek-ai/dsh-tools';
4
+ import { ToolCallId } from '@deepseek-ai/dsh-llm/brand';
5
+ import SystemPrompt from '@deepseek-ai/dsh-system-prompt';
6
+ import * as FileTools from '@deepseek-ai/dsh-tool-fs';
7
+ import { lstat, mkdir, mkdtemp, realpath, readdir, readFile, rm, writeFile } from 'node:fs/promises';
8
+ import { isAbsolute, join, relative, resolve, sep } from 'node:path';
9
+ import { acceptanceDigest } from '@dsh-enhanced/task-acceptance-contract';
10
+ import { fileObservationSteps, instantiate } from './definition.js';
11
+ const fail = (message) => { throw new Error(`assistant-skills: replay ${message}`); };
12
+ const bytes = (value) => Buffer.byteLength(value, 'utf8');
13
+ function record(value) {
14
+ return value !== null && typeof value === 'object' && !Array.isArray(value) && Object.getPrototypeOf(value) === Object.prototype
15
+ && Object.getOwnPropertySymbols(value).length === 0 && Object.keys(value).every(key => {
16
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
17
+ return descriptor !== undefined && 'value' in descriptor;
18
+ });
19
+ }
20
+ function text(value, maximum = 256) { return typeof value === 'string' && value.length > 0 && value.length <= maximum && !/[\\\p{Cc}]/u.test(value); }
21
+ function stepId(value) { return text(value); }
22
+ function pathIn(path, workspace, root) {
23
+ if (typeof path !== 'string' || !path || path.includes('\0') || path.includes('\\'))
24
+ fail('invalid path');
25
+ const raw = path;
26
+ let value;
27
+ if (isAbsolute(raw)) {
28
+ const part = relative(workspace, raw);
29
+ if (part === '' || part.startsWith(`..${sep}`) || part === '..' || isAbsolute(part))
30
+ fail('external path');
31
+ value = part;
32
+ }
33
+ else
34
+ value = raw;
35
+ if (value.split('/').some(part => !part || part === '.' || part === '..'))
36
+ fail('invalid path');
37
+ const output = resolve(root, value);
38
+ if (!output.startsWith(`${root}${sep}`))
39
+ fail('external path');
40
+ return output;
41
+ }
42
+ function sourcePath(path, workspace) {
43
+ if (!text(path, 4096))
44
+ fail('invalid observation path');
45
+ const raw = path;
46
+ if (raw.split('/').some(part => part === '.' || part === '..' || !isAbsolute(raw) && part === ''))
47
+ fail('invalid observation path');
48
+ const resolved = resolve(workspace, raw);
49
+ const part = relative(workspace, resolved);
50
+ if (part.startsWith(`..${sep}`) || part === '..' || isAbsolute(part))
51
+ fail('external observation path');
52
+ }
53
+ function relativePattern(value, field) {
54
+ if (!text(value, 4096) || isAbsolute(value) || value.split('/').some(part => part === '' || part === '.' || part === '..'))
55
+ fail(`invalid ${field}`);
56
+ }
57
+ function checkedObservation(step, workspace) {
58
+ if (step.toolName === 'get_goal') {
59
+ if (!record(step.arguments) || Object.keys(step.arguments).length !== 0)
60
+ fail('invalid get_goal observation');
61
+ return { id: step.id, toolName: 'get_goal', outcome: 'omitted-observation', observation: 'provenance-only' };
62
+ }
63
+ if (step.toolName !== 'glob' && step.toolName !== 'grep')
64
+ return undefined;
65
+ if (!record(step.arguments))
66
+ fail('invalid observation arguments');
67
+ const args = step.arguments;
68
+ const allowed = step.toolName === 'glob' ? ['path', 'pattern'] : ['path', 'pattern', 'include'];
69
+ if (Object.keys(args).some(key => !allowed.includes(key)) || !Object.hasOwn(args, 'pattern') || !text(args.pattern, 4096))
70
+ fail('invalid observation arguments');
71
+ if (Object.hasOwn(args, 'path'))
72
+ sourcePath(args.path, workspace);
73
+ if (step.toolName === 'glob')
74
+ relativePattern(args.pattern, 'glob pattern');
75
+ if (step.toolName === 'grep' && Object.hasOwn(args, 'include'))
76
+ relativePattern(args.include, 'grep include');
77
+ return { id: step.id, toolName: step.toolName, outcome: 'omitted-observation', observation: 'provenance-only' };
78
+ }
79
+ function checkedStep(step, workspace, root) {
80
+ if (!['read', 'write', 'edit'].includes(step.toolName) || !record(step.arguments))
81
+ fail('invalid tool');
82
+ const args = step.arguments;
83
+ const allowed = step.toolName === 'read' ? ['file_path', 'offset', 'limit'] : step.toolName === 'write' ? ['file_path', 'content'] : ['file_path', 'old_string', 'new_string', 'replace_all'];
84
+ if (Object.keys(args).some(key => !allowed.includes(key)) || typeof args.file_path !== 'string')
85
+ fail('invalid tool arguments');
86
+ if (step.toolName === 'write' && typeof args.content !== 'string' || step.toolName === 'edit' && (typeof args.old_string !== 'string' || typeof args.new_string !== 'string' || typeof args.replace_all !== 'undefined' && typeof args.replace_all !== 'boolean'))
87
+ fail('invalid tool arguments');
88
+ if (step.toolName === 'read' && (args.offset !== undefined && (typeof args.offset !== 'number' || !Number.isSafeInteger(args.offset) || args.offset < 1) || args.limit !== undefined && (typeof args.limit !== 'number' || !Number.isSafeInteger(args.limit) || args.limit < 1)))
89
+ fail('invalid tool arguments');
90
+ return { ...args, file_path: pathIn(args.file_path, workspace, root) };
91
+ }
92
+ function dispatchSteps(definition) {
93
+ const observations = new Map(fileObservationSteps(definition).map(value => [value.beforeStepId, value]));
94
+ return definition.steps.flatMap(step => {
95
+ const observation = observations.get(step.id);
96
+ return observation ? [
97
+ { id: observation.id, toolName: 'read', arguments: { file_path: observation.filePath, limit: 1 }, dependsOn: [], observationAllowsAbsent: observation.allowAbsent },
98
+ step,
99
+ ] : [step];
100
+ });
101
+ }
102
+ /** Validate the fixed captured trace without granting its observations executable authority. */
103
+ export function validateReplayTrace(definition, maxToolCalls, maxBytes) {
104
+ if (!Number.isSafeInteger(maxToolCalls) || maxToolCalls < 0 || !Number.isSafeInteger(maxBytes) || maxBytes < 0 || !definition || !Array.isArray(definition.steps)
105
+ || definition.steps.length > 32 || definition.steps.length > maxToolCalls || typeof definition.source?.scope?.workspace !== 'string' || !isAbsolute(definition.source.scope.workspace))
106
+ fail('invalid trace');
107
+ const expanded = dispatchSteps(definition);
108
+ if (expanded.length > 32 || expanded.length > maxToolCalls)
109
+ fail('tool-call limit');
110
+ const ids = new Set();
111
+ let parameterBytes = 0;
112
+ return expanded.map(step => {
113
+ if (!record(step) || !stepId(step.id) || !text(step.toolName) || !record(step.arguments) || ids.has(step.id))
114
+ fail('invalid trace');
115
+ ids.add(step.id);
116
+ parameterBytes += bytes(JSON.stringify(step.arguments));
117
+ if (parameterBytes > maxBytes)
118
+ fail('byte limit');
119
+ const observation = checkedObservation(step, definition.source.scope.workspace);
120
+ if (observation !== undefined)
121
+ return observation;
122
+ if (!['read', 'write', 'edit'].includes(step.toolName))
123
+ fail('invalid tool');
124
+ // Validate the original source-workspace path shape without using it or
125
+ // granting the step access to this synthetic validation root.
126
+ checkedStep(step, definition.source.scope.workspace, '/assistant-skills-validation');
127
+ return { id: step.id, toolName: step.toolName, outcome: 'executed' };
128
+ });
129
+ }
130
+ async function total(root) {
131
+ let size = 0;
132
+ for (const entry of await readdir(root, { withFileTypes: true })) {
133
+ const path = join(root, entry.name);
134
+ const stat = await lstat(path);
135
+ if (stat.isSymbolicLink())
136
+ fail('symlink detected');
137
+ if (stat.isDirectory())
138
+ size += await total(path);
139
+ else if (stat.isFile())
140
+ size += stat.size;
141
+ else
142
+ fail('non-regular file');
143
+ }
144
+ return size;
145
+ }
146
+ export async function replaySkill(input) {
147
+ if (!input || !Number.isSafeInteger(input.maxToolCalls) || input.maxToolCalls < 0 || !Number.isSafeInteger(input.maxBytes) || input.maxBytes < 0 || !Array.isArray(input.files) || typeof input.stateRoot !== 'string' || !isAbsolute(input.stateRoot))
148
+ fail('invalid input');
149
+ input.signal.throwIfAborted();
150
+ input.authorize();
151
+ const definition = instantiate(input.definition, input.inputs);
152
+ if (definition.steps.length > 32 || definition.steps.length > input.maxToolCalls)
153
+ fail('tool-call limit');
154
+ const workspace = definition.source.scope.workspace;
155
+ if (typeof workspace !== 'string' || !isAbsolute(workspace))
156
+ fail('invalid source workspace');
157
+ if (input.files.length > 64)
158
+ fail('file count limit');
159
+ await mkdir(input.stateRoot, { recursive: true, mode: 0o700 });
160
+ const directory = await lstat(input.stateRoot);
161
+ if (!directory.isDirectory() || directory.isSymbolicLink() || await realpath(input.stateRoot) !== input.stateRoot || (directory.mode & 0o077) !== 0)
162
+ fail('private state root required');
163
+ const root = await mkdtemp(join(input.stateRoot, 'skill-replay-'));
164
+ let ctx;
165
+ let outcome, failure, cleanup;
166
+ let failed = false;
167
+ try {
168
+ const trace = validateReplayTrace(definition, input.maxToolCalls, input.maxBytes);
169
+ const expanded = dispatchSteps(definition);
170
+ const steps = expanded.map((step, index) => trace[index].outcome === 'executed' ? { ...step, arguments: checkedStep(step, workspace, root), trace: trace[index] } : { ...step, trace: trace[index] });
171
+ const parameterBytes = expanded.reduce((sum, step) => sum + bytes(JSON.stringify(step.arguments)), 0);
172
+ const files = input.files.map(file => { if (!file || typeof file.content !== 'string')
173
+ fail('invalid file'); return { path: pathIn(file.path, workspace, root), content: file.content }; });
174
+ if (parameterBytes + files.reduce((sum, file) => sum + bytes(file.content), 0) > input.maxBytes)
175
+ fail('byte limit');
176
+ for (const file of files) {
177
+ input.signal.throwIfAborted();
178
+ input.authorize();
179
+ await mkdir(resolve(file.path, '..'), { recursive: true });
180
+ await writeFile(file.path, file.content, { flag: 'wx' });
181
+ }
182
+ if (parameterBytes + await total(root) > input.maxBytes)
183
+ fail('byte limit');
184
+ ctx = new Context();
185
+ await ctx.plugin(SystemPrompt);
186
+ await ctx.plugin(ToolRuntime, { mode: 'native' });
187
+ await ctx.plugin(LocalFileSystem, { cwd: root });
188
+ await ctx.plugin(FileTools);
189
+ const done = [];
190
+ for (const step of steps) {
191
+ input.signal.throwIfAborted();
192
+ input.authorize();
193
+ if (step.trace.outcome === 'omitted-observation') {
194
+ done.push(step.trace);
195
+ continue;
196
+ }
197
+ const result = await ctx.tools.execute({ callId: ToolCallId(`skill-replay-${done.length + 1}`), name: step.toolName, arguments: step.arguments, signal: input.signal });
198
+ input.signal.throwIfAborted();
199
+ input.authorize();
200
+ const observedAbsent = step.observationAllowsAbsent === true && result.isError && result.error.info?.code === 'FS_NOT_FOUND';
201
+ if (result.isError && !observedAbsent)
202
+ throw new Error(`assistant-skills: replay ${step.toolName} failed`);
203
+ if (parameterBytes + await total(root) > input.maxBytes)
204
+ fail('byte limit');
205
+ done.push({ id: step.id, toolName: step.toolName, outcome: 'executed', resultDigest: acceptanceDigest(result.content) });
206
+ }
207
+ const artifactFile = pathIn(input.artifactPath, workspace, root);
208
+ const stat = await lstat(artifactFile);
209
+ if (!stat.isFile() || stat.isSymbolicLink())
210
+ fail('invalid artifact');
211
+ outcome = { artifact: await readFile(artifactFile, 'utf8'), toolCalls: done.length,
212
+ executedToolCalls: done.filter(step => step.outcome === 'executed').length, omittedObservations: done.filter(step => step.outcome === 'omitted-observation').length, steps: done, quiescent: true };
213
+ }
214
+ catch (error) {
215
+ failed = true;
216
+ failure = error;
217
+ }
218
+ finally {
219
+ try {
220
+ if (ctx)
221
+ await ctx.fiber.dispose();
222
+ }
223
+ catch (error) {
224
+ cleanup = error;
225
+ }
226
+ try {
227
+ await rm(root, { recursive: true, force: true });
228
+ }
229
+ catch (error) {
230
+ if (!cleanup)
231
+ cleanup = error;
232
+ }
233
+ }
234
+ if (cleanup)
235
+ throw cleanup;
236
+ if (failed)
237
+ throw failure;
238
+ return outcome;
239
+ }
240
+ //# sourceMappingURL=replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.js","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { GoalScope } from '@dsh-enhanced/assistant-goals';
2
+ import type { SkillComparisonProfile } from './comparison.js';
3
+ /** Host-only sealed plan. It is deliberately not a plugin configuration or model tool argument. */
4
+ export interface SealedSkillHoldoutProvider {
5
+ readonly generation: string;
6
+ read(input: Readonly<{
7
+ planId: string;
8
+ scope: GoalScope;
9
+ }>): Readonly<{
10
+ profile: SkillComparisonProfile;
11
+ attestationDigest: string;
12
+ }> | undefined;
13
+ }
14
+ export declare function sealedPlan(provider: SealedSkillHoldoutProvider, planId: string, scope: GoalScope): Readonly<{
15
+ profile: SkillComparisonProfile;
16
+ profileDigest: string;
17
+ attestationDigest: string;
18
+ bindingDigest: string;
19
+ }>;
20
+ //# sourceMappingURL=sealed-holdout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sealed-holdout.d.ts","sourceRoot":"","sources":["../src/sealed-holdout.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AAC9D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAG7D,mGAAmG;AACnG,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,CAAA;KAAE,CAAC,GAAG,QAAQ,CAAC;QAAE,OAAO,EAAE,sBAAsB,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,CAAA;CAClJ;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,0BAA0B,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS;;;;;GAMhG"}
@@ -0,0 +1,12 @@
1
+ import { acceptanceDigest } from '@dsh-enhanced/task-acceptance-contract';
2
+ import { validateComparisonProfiles } from './comparison.js';
3
+ export function sealedPlan(provider, planId, scope) {
4
+ if (!provider || typeof provider.generation !== 'string' || !provider.generation || typeof provider.read !== 'function' || typeof planId !== 'string' || !planId)
5
+ throw new Error('assistant-skills: sealed holdout provider unavailable');
6
+ const value = provider.read({ planId, scope });
7
+ if (!value || typeof value.attestationDigest !== 'string' || !/^[a-f0-9]{64}$/u.test(value.attestationDigest))
8
+ throw new Error('assistant-skills: sealed holdout plan unavailable');
9
+ const profile = validateComparisonProfiles([value.profile])[0];
10
+ return Object.freeze({ profile, profileDigest: acceptanceDigest(profile), attestationDigest: value.attestationDigest, bindingDigest: acceptanceDigest({ generation: provider.generation, planId, scope, profileDigest: acceptanceDigest(profile), attestationDigest: value.attestationDigest }) });
11
+ }
12
+ //# sourceMappingURL=sealed-holdout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sealed-holdout.js","sourceRoot":"","sources":["../src/sealed-holdout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AAGzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAA;AAQ5D,MAAM,UAAU,UAAU,CAAC,QAAoC,EAAE,MAAc,EAAE,KAAgB;IAC/F,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAA;IAC1O,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IAC9C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,iBAAiB,KAAK,QAAQ,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;IACnL,MAAM,OAAO,GAAG,0BAA0B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAE,CAAA;IAC/D,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,EAAE,KAAK,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAA;AACpS,CAAC"}