@namzu/sdk 56.2.0 → 57.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -0
- package/dist/agents/QueryAgent.d.ts.map +1 -1
- package/dist/agents/QueryAgent.js +1 -0
- package/dist/agents/QueryAgent.js.map +1 -1
- package/dist/agents/index.d.ts +1 -0
- package/dist/agents/index.d.ts.map +1 -1
- package/dist/agents/index.js +1 -0
- package/dist/agents/index.js.map +1 -1
- package/dist/agents/plan.d.ts +20 -0
- package/dist/agents/plan.d.ts.map +1 -0
- package/dist/agents/plan.js +27 -0
- package/dist/agents/plan.js.map +1 -0
- package/dist/compaction/dangling.d.ts +12 -1
- package/dist/compaction/dangling.d.ts.map +1 -1
- package/dist/compaction/dangling.js +17 -3
- package/dist/compaction/dangling.js.map +1 -1
- package/dist/compaction/index.d.ts +2 -2
- package/dist/compaction/index.d.ts.map +1 -1
- package/dist/compaction/index.js.map +1 -1
- package/dist/compaction/manager.d.ts +16 -0
- package/dist/compaction/manager.d.ts.map +1 -1
- package/dist/compaction/manager.js +55 -0
- package/dist/compaction/manager.js.map +1 -1
- package/dist/compaction/manual.d.ts +2 -0
- package/dist/compaction/manual.d.ts.map +1 -1
- package/dist/compaction/manual.js +33 -4
- package/dist/compaction/manual.js.map +1 -1
- package/dist/compaction/restore.d.ts +51 -0
- package/dist/compaction/restore.d.ts.map +1 -0
- package/dist/compaction/restore.js +123 -0
- package/dist/compaction/restore.js.map +1 -0
- package/dist/compaction/types.d.ts +22 -0
- package/dist/compaction/types.d.ts.map +1 -1
- package/dist/compaction/wire.d.ts +3 -1
- package/dist/compaction/wire.d.ts.map +1 -1
- package/dist/compaction/wire.js +16 -0
- package/dist/compaction/wire.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/plugin/shell-hook.d.ts +19 -1
- package/dist/plugin/shell-hook.d.ts.map +1 -1
- package/dist/plugin/shell-hook.js +21 -5
- package/dist/plugin/shell-hook.js.map +1 -1
- package/dist/prompt/coding-agent-doctrine.d.ts +2 -2
- package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
- package/dist/prompt/coding-agent-doctrine.js +3 -2
- package/dist/prompt/coding-agent-doctrine.js.map +1 -1
- package/dist/provider/errors.d.ts +3 -0
- package/dist/provider/errors.d.ts.map +1 -1
- package/dist/provider/errors.js +23 -3
- package/dist/provider/errors.js.map +1 -1
- package/dist/provider/fallback.d.ts.map +1 -1
- package/dist/provider/fallback.js +34 -3
- package/dist/provider/fallback.js.map +1 -1
- package/dist/provider/retry.d.ts +12 -5
- package/dist/provider/retry.d.ts.map +1 -1
- package/dist/provider/retry.js +22 -8
- package/dist/provider/retry.js.map +1 -1
- package/dist/public-runtime.d.ts +4 -2
- package/dist/public-runtime.d.ts.map +1 -1
- package/dist/public-runtime.js +4 -1
- package/dist/public-runtime.js.map +1 -1
- package/dist/public-types.d.ts +1 -1
- package/dist/public-types.d.ts.map +1 -1
- package/dist/runtime/jobs/registry.d.ts +42 -0
- package/dist/runtime/jobs/registry.d.ts.map +1 -1
- package/dist/runtime/jobs/registry.js +77 -0
- package/dist/runtime/jobs/registry.js.map +1 -1
- package/dist/runtime/query/calls-that-never-started.d.ts +12 -0
- package/dist/runtime/query/calls-that-never-started.d.ts.map +1 -0
- package/dist/runtime/query/calls-that-never-started.js +41 -0
- package/dist/runtime/query/calls-that-never-started.js.map +1 -0
- package/dist/runtime/query/executor/tool-call-admission.d.ts +2 -2
- package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
- package/dist/runtime/query/executor/tool-call-admission.js +13 -9
- package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
- package/dist/runtime/query/executor.d.ts +8 -0
- package/dist/runtime/query/executor.d.ts.map +1 -1
- package/dist/runtime/query/executor.js +35 -0
- package/dist/runtime/query/executor.js.map +1 -1
- package/dist/runtime/query/file-evidence-context.js +1 -1
- package/dist/runtime/query/file-evidence-context.js.map +1 -1
- package/dist/runtime/query/index.d.ts +6 -0
- package/dist/runtime/query/index.d.ts.map +1 -1
- package/dist/runtime/query/index.js +5 -0
- package/dist/runtime/query/index.js.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/compaction.js +20 -0
- package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
- package/dist/runtime/query/iteration/phases/context.d.ts +2 -0
- package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
- package/dist/runtime/query/iteration/phases/context.js.map +1 -1
- package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
- package/dist/runtime/query/iteration/stream-turn.js +45 -25
- package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
- package/dist/runtime/query/prepare-turn.d.ts.map +1 -1
- package/dist/runtime/query/prepare-turn.js +10 -1
- package/dist/runtime/query/prepare-turn.js.map +1 -1
- package/dist/scheduler/completion-inbox.js +3 -3
- package/dist/scheduler/completion-inbox.js.map +1 -1
- package/dist/tools/admit-facts.d.ts.map +1 -1
- package/dist/tools/admit-facts.js +1 -0
- package/dist/tools/admit-facts.js.map +1 -1
- package/dist/tools/builtins/bash.d.ts +42 -1
- package/dist/tools/builtins/bash.d.ts.map +1 -1
- package/dist/tools/builtins/bash.js +115 -48
- package/dist/tools/builtins/bash.js.map +1 -1
- package/dist/tools/builtins/read-file.d.ts.map +1 -1
- package/dist/tools/builtins/read-file.js +55 -5
- package/dist/tools/builtins/read-file.js.map +1 -1
- package/dist/tools/file-read-tracker.d.ts.map +1 -1
- package/dist/tools/file-read-tracker.js +28 -0
- package/dist/tools/file-read-tracker.js.map +1 -1
- package/dist/types/agent/base.d.ts +6 -0
- package/dist/types/agent/base.d.ts.map +1 -1
- package/dist/types/errors/catalog.d.ts +3 -0
- package/dist/types/errors/catalog.d.ts.map +1 -1
- package/dist/types/errors/catalog.js +24 -2
- package/dist/types/errors/catalog.js.map +1 -1
- package/dist/types/provider/error.d.ts +7 -0
- package/dist/types/provider/error.d.ts.map +1 -1
- package/dist/types/provider/errors.d.ts +24 -0
- package/dist/types/provider/errors.d.ts.map +1 -1
- package/dist/types/provider/errors.js +101 -1
- package/dist/types/provider/errors.js.map +1 -1
- package/dist/types/provider/stream.d.ts +6 -0
- package/dist/types/provider/stream.d.ts.map +1 -1
- package/dist/types/session/events.d.ts +8 -0
- package/dist/types/session/events.d.ts.map +1 -1
- package/dist/types/session/events.js.map +1 -1
- package/dist/types/tool/index.d.ts +39 -0
- package/dist/types/tool/index.d.ts.map +1 -1
- package/dist/types/tool/index.js.map +1 -1
- package/dist/types/tool/presentation.d.ts +4 -0
- package/dist/types/tool/presentation.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/agents/QueryAgent.ts +1 -0
- package/src/agents/index.ts +1 -0
- package/src/agents/plan.ts +30 -0
- package/src/compaction/dangling.ts +35 -3
- package/src/compaction/index.ts +4 -0
- package/src/compaction/manager.ts +53 -0
- package/src/compaction/manual.ts +42 -10
- package/src/compaction/restore.ts +159 -0
- package/src/compaction/types.ts +25 -0
- package/src/compaction/wire.ts +26 -1
- package/src/index.ts +2 -0
- package/src/plugin/shell-hook.ts +33 -5
- package/src/prompt/coding-agent-doctrine.ts +3 -2
- package/src/provider/errors.ts +27 -3
- package/src/provider/fallback.ts +34 -2
- package/src/provider/retry.ts +30 -10
- package/src/public-runtime.ts +8 -0
- package/src/public-types.ts +3 -0
- package/src/runtime/jobs/registry.ts +105 -0
- package/src/runtime/query/calls-that-never-started.ts +37 -0
- package/src/runtime/query/executor/tool-call-admission.ts +12 -9
- package/src/runtime/query/executor.ts +37 -0
- package/src/runtime/query/file-evidence-context.ts +1 -1
- package/src/runtime/query/index.ts +12 -0
- package/src/runtime/query/iteration/phases/compaction.ts +19 -0
- package/src/runtime/query/iteration/phases/context.ts +3 -0
- package/src/runtime/query/iteration/stream-turn.ts +47 -25
- package/src/runtime/query/prepare-turn.ts +10 -1
- package/src/scheduler/completion-inbox.ts +3 -3
- package/src/tools/admit-facts.ts +1 -0
- package/src/tools/builtins/bash.ts +149 -54
- package/src/tools/builtins/read-file.ts +66 -4
- package/src/tools/file-read-tracker.ts +25 -1
- package/src/types/agent/base.ts +7 -0
- package/src/types/errors/catalog.ts +31 -2
- package/src/types/provider/error.ts +7 -0
- package/src/types/provider/errors.ts +120 -1
- package/src/types/provider/stream.ts +6 -0
- package/src/types/session/events.ts +8 -0
- package/src/types/tool/index.ts +40 -0
- package/src/types/tool/presentation.ts +4 -0
|
@@ -9,6 +9,7 @@ import { findDanglingMessages, findSafeTrimIndex } from './dangling.js';
|
|
|
9
9
|
import { extractFromAssistantMessage, extractFromToolCall, extractFromToolResult, extractFromUserMessage, } from './extractor.js';
|
|
10
10
|
import { WorkingStateManager } from './manager.js';
|
|
11
11
|
import { planCompaction } from './plan.js';
|
|
12
|
+
import { recordRestorable, renderRestoredContext } from './restore.js';
|
|
12
13
|
import { findRetainedIndices } from './retention.js';
|
|
13
14
|
import { buildCompactionMessage, isCompactionMessage } from './summary.js';
|
|
14
15
|
import { buildVerifiedSummary } from './verifier.js';
|
|
@@ -42,10 +43,20 @@ function splice(preservedSystem, summaryBody, retainedOlder, recentMessages, rec
|
|
|
42
43
|
const summary = { ...buildCompactionMessage(summaryBody, recoveryNote), retain: true };
|
|
43
44
|
return { messages: [...preservedSystem, summary, ...retainedOlder, ...recentMessages], summary };
|
|
44
45
|
}
|
|
46
|
+
/** The summary with the loaded skills and read files put back after it. */
|
|
47
|
+
function withRestoredContext(body, manager, input) {
|
|
48
|
+
const window = resolveContextWindow(input.contextWindowTokens ?? input.config.contextWindowTokens, input.model);
|
|
49
|
+
const restored = renderRestoredContext(manager.getState(), {
|
|
50
|
+
contextWindowTokens: window.tokens,
|
|
51
|
+
...(input.restoreNote ? { hostNote: input.restoreNote } : {}),
|
|
52
|
+
});
|
|
53
|
+
return restored ? `${body}\n\n${restored}` : body;
|
|
54
|
+
}
|
|
45
55
|
/** Build the state a host-triggered pass is about to replace. */
|
|
46
56
|
function populateWorkingState(manager, messages, config) {
|
|
47
57
|
let firstUser = true;
|
|
48
58
|
const toolNames = new Map();
|
|
59
|
+
const toolInputs = new Map();
|
|
49
60
|
for (const message of messages) {
|
|
50
61
|
switch (message.role) {
|
|
51
62
|
case 'user':
|
|
@@ -62,12 +73,27 @@ function populateWorkingState(manager, messages, config) {
|
|
|
62
73
|
extractFromAssistantMessage(manager, message.content, config);
|
|
63
74
|
for (const call of message.toolCalls ?? []) {
|
|
64
75
|
toolNames.set(call.id, call.function.name);
|
|
76
|
+
try {
|
|
77
|
+
toolInputs.set(call.id, JSON.parse(call.function.arguments));
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Unparseable arguments restore nothing.
|
|
81
|
+
}
|
|
65
82
|
extractFromToolCall(manager, call.function.name, call.function.arguments);
|
|
66
83
|
}
|
|
67
84
|
break;
|
|
68
|
-
case 'tool':
|
|
69
|
-
|
|
85
|
+
case 'tool': {
|
|
86
|
+
const toolName = toolNames.get(message.toolCallId) ?? 'tool';
|
|
87
|
+
const text = toolResultToText(message.content);
|
|
88
|
+
extractFromToolResult(manager, toolName, text, message.isError === true);
|
|
89
|
+
recordRestorable(manager, {
|
|
90
|
+
toolName,
|
|
91
|
+
input: toolInputs.get(message.toolCallId),
|
|
92
|
+
output: text,
|
|
93
|
+
success: message.isError !== true,
|
|
94
|
+
});
|
|
70
95
|
break;
|
|
96
|
+
}
|
|
71
97
|
case 'system':
|
|
72
98
|
break;
|
|
73
99
|
}
|
|
@@ -117,7 +143,7 @@ export async function compactNow(input) {
|
|
|
117
143
|
streamIdleTimeoutMs: input.streamIdleTimeoutMs,
|
|
118
144
|
instructions: input.instructions,
|
|
119
145
|
});
|
|
120
|
-
const { messages, summary } = splice(preservedSystem, body, retainedOlder, plan.recentMessages, input.recoveryNote);
|
|
146
|
+
const { messages, summary } = splice(preservedSystem, withRestoredContext(body, manager, input), retainedOlder, plan.recentMessages, input.recoveryNote);
|
|
121
147
|
return publishManualCompaction(input, {
|
|
122
148
|
messages,
|
|
123
149
|
shed: input.messages.length - messages.length,
|
|
@@ -187,7 +213,10 @@ export async function compactRegion(input) {
|
|
|
187
213
|
});
|
|
188
214
|
// Same cross-run ownership as compactNow: a selected region has been
|
|
189
215
|
// replaced outside a turn, so its only surviving account is pinned.
|
|
190
|
-
const summary = {
|
|
216
|
+
const summary = {
|
|
217
|
+
...buildCompactionMessage(withRestoredContext(body, manager, input), input.recoveryNote),
|
|
218
|
+
retain: true,
|
|
219
|
+
};
|
|
191
220
|
const out = [...messages.slice(0, start), summary, ...retainedSelected, ...messages.slice(end)];
|
|
192
221
|
// Checked after the splice, not only before it. The edges being
|
|
193
222
|
// individually safe does not make the RESULT valid — a span whose
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manual.js","sourceRoot":"","sources":["../../src/compaction/manual.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,EAAmB,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAG9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC1D,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACvE,OAAO,EACN,2BAA2B,EAC3B,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,GACtB,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,EAAsC,oBAAoB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"manual.js","sourceRoot":"","sources":["../../src/compaction/manual.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { WorkingStateManager } from './manager.js';
|
|
2
|
+
import type { WorkingState } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* What a compaction puts back after the summary.
|
|
5
|
+
*
|
|
6
|
+
* A summary says a skill was loaded and a file was read; it cannot give the
|
|
7
|
+
* model the skill's steps or the file's lines, so the next step either guesses
|
|
8
|
+
* from a paraphrase or loads and reads the same things again. This puts the
|
|
9
|
+
* most recent of each back, verbatim, inside fixed caps — and inside a share
|
|
10
|
+
* of the window, so a small window is not refilled by the thing that was meant
|
|
11
|
+
* to free it.
|
|
12
|
+
*/
|
|
13
|
+
/** Skills restored per pass, most recent first. */
|
|
14
|
+
export declare const RESTORE_MAX_SKILLS = 8;
|
|
15
|
+
/** Tokens of one restored skill. */
|
|
16
|
+
export declare const RESTORE_SKILL_TOKENS = 5000;
|
|
17
|
+
/** Tokens of all restored skills together. */
|
|
18
|
+
export declare const RESTORE_SKILLS_TOTAL_TOKENS = 25000;
|
|
19
|
+
/** Files restored per pass, most recent first. */
|
|
20
|
+
export declare const RESTORE_MAX_FILES = 5;
|
|
21
|
+
/** Tokens of one restored file. */
|
|
22
|
+
export declare const RESTORE_FILE_TOKENS = 5000;
|
|
23
|
+
/** Tokens of all restored files together. */
|
|
24
|
+
export declare const RESTORE_FILES_TOTAL_TOKENS = 50000;
|
|
25
|
+
/** The share of the window all restored files may take. */
|
|
26
|
+
export declare const RESTORE_FILES_WINDOW_SHARE = 0.1;
|
|
27
|
+
/** The share of the window all restored skills may take. */
|
|
28
|
+
export declare const RESTORE_SKILLS_WINDOW_SHARE = 0.05;
|
|
29
|
+
/**
|
|
30
|
+
* Note a finished tool call, if it is one whose result a compaction restores.
|
|
31
|
+
* Called with the call's input and the text the model was shown.
|
|
32
|
+
*/
|
|
33
|
+
export declare function recordRestorable(manager: WorkingStateManager, call: {
|
|
34
|
+
readonly toolName: string;
|
|
35
|
+
readonly input: unknown;
|
|
36
|
+
readonly output: string;
|
|
37
|
+
readonly success: boolean;
|
|
38
|
+
/** The read was answered as unchanged: the body is already stored from the earlier read. */
|
|
39
|
+
readonly unchanged?: boolean;
|
|
40
|
+
/** Resolves a relative path, so one file is one entry however the model spelled it. */
|
|
41
|
+
readonly workingDirectory?: string;
|
|
42
|
+
}): void;
|
|
43
|
+
export interface RestoreRenderOptions {
|
|
44
|
+
/** The window the pass is working against; caps scale down on a small one. */
|
|
45
|
+
readonly contextWindowTokens?: number;
|
|
46
|
+
/** A host's own line to carry across, such as where its plan file is. */
|
|
47
|
+
readonly hostNote?: string;
|
|
48
|
+
}
|
|
49
|
+
/** The section to append after a summary, or `undefined` when there is nothing to put back. */
|
|
50
|
+
export declare function renderRestoredContext(state: WorkingState, options?: RestoreRenderOptions): string | undefined;
|
|
51
|
+
//# sourceMappingURL=restore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore.d.ts","sourceRoot":"","sources":["../../src/compaction/restore.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C;;;;;;;;;GASG;AAEH,mDAAmD;AACnD,eAAO,MAAM,kBAAkB,IAAI,CAAA;AACnC,oCAAoC;AACpC,eAAO,MAAM,oBAAoB,OAAQ,CAAA;AACzC,8CAA8C;AAC9C,eAAO,MAAM,2BAA2B,QAAS,CAAA;AACjD,kDAAkD;AAClD,eAAO,MAAM,iBAAiB,IAAI,CAAA;AAClC,mCAAmC;AACnC,eAAO,MAAM,mBAAmB,OAAQ,CAAA;AACxC,6CAA6C;AAC7C,eAAO,MAAM,0BAA0B,QAAS,CAAA;AAChD,2DAA2D;AAC3D,eAAO,MAAM,0BAA0B,MAAM,CAAA;AAC7C,4DAA4D;AAC5D,eAAO,MAAM,2BAA2B,OAAO,CAAA;AAmB/C;;;GAGG;AACH,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE;IACL,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,4FAA4F;IAC5F,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,uFAAuF;IACvF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAClC,GACC,IAAI,CA0BN;AASD,MAAM,WAAW,oBAAoB;IACpC,8EAA8E;IAC9E,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;IACrC,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,+FAA+F;AAC/F,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE,oBAAyB,GAChC,MAAM,GAAG,SAAS,CA6CpB"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { resolve as resolvePath } from 'node:path';
|
|
2
|
+
import { CHARS_PER_TOKEN } from '../constants/limits.js';
|
|
3
|
+
/**
|
|
4
|
+
* What a compaction puts back after the summary.
|
|
5
|
+
*
|
|
6
|
+
* A summary says a skill was loaded and a file was read; it cannot give the
|
|
7
|
+
* model the skill's steps or the file's lines, so the next step either guesses
|
|
8
|
+
* from a paraphrase or loads and reads the same things again. This puts the
|
|
9
|
+
* most recent of each back, verbatim, inside fixed caps — and inside a share
|
|
10
|
+
* of the window, so a small window is not refilled by the thing that was meant
|
|
11
|
+
* to free it.
|
|
12
|
+
*/
|
|
13
|
+
/** Skills restored per pass, most recent first. */
|
|
14
|
+
export const RESTORE_MAX_SKILLS = 8;
|
|
15
|
+
/** Tokens of one restored skill. */
|
|
16
|
+
export const RESTORE_SKILL_TOKENS = 5_000;
|
|
17
|
+
/** Tokens of all restored skills together. */
|
|
18
|
+
export const RESTORE_SKILLS_TOTAL_TOKENS = 25_000;
|
|
19
|
+
/** Files restored per pass, most recent first. */
|
|
20
|
+
export const RESTORE_MAX_FILES = 5;
|
|
21
|
+
/** Tokens of one restored file. */
|
|
22
|
+
export const RESTORE_FILE_TOKENS = 5_000;
|
|
23
|
+
/** Tokens of all restored files together. */
|
|
24
|
+
export const RESTORE_FILES_TOTAL_TOKENS = 50_000;
|
|
25
|
+
/** The share of the window all restored files may take. */
|
|
26
|
+
export const RESTORE_FILES_WINDOW_SHARE = 0.1;
|
|
27
|
+
/** The share of the window all restored skills may take. */
|
|
28
|
+
export const RESTORE_SKILLS_WINDOW_SHARE = 0.05;
|
|
29
|
+
const CUT_MARKER = '\n… [cut to fit the restore budget]';
|
|
30
|
+
const SKILL_CONTINUATION = /\n\n\[More skill instructions remain\.[^\]]*\]/g;
|
|
31
|
+
function isInstructionPath(path) {
|
|
32
|
+
const normal = path.replace(/\\/g, '/');
|
|
33
|
+
const name = normal.slice(normal.lastIndexOf('/') + 1);
|
|
34
|
+
return name === 'AGENTS.md' || name === 'AGENTS.local.md' || normal.includes('/.namzu/rules/');
|
|
35
|
+
}
|
|
36
|
+
function resolveAgainst(path, workingDirectory) {
|
|
37
|
+
return workingDirectory ? resolvePath(workingDirectory, path) : path;
|
|
38
|
+
}
|
|
39
|
+
function isPlanPath(path) {
|
|
40
|
+
return /(^|\/)plans\/plan\.md$/.test(path.replace(/\\/g, '/'));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Note a finished tool call, if it is one whose result a compaction restores.
|
|
44
|
+
* Called with the call's input and the text the model was shown.
|
|
45
|
+
*/
|
|
46
|
+
export function recordRestorable(manager, call) {
|
|
47
|
+
const input = typeof call.input === 'object' && call.input !== null
|
|
48
|
+
? call.input
|
|
49
|
+
: undefined;
|
|
50
|
+
if (!input)
|
|
51
|
+
return;
|
|
52
|
+
if (call.toolName === 'skill') {
|
|
53
|
+
if (!call.success || typeof input.name !== 'string')
|
|
54
|
+
return;
|
|
55
|
+
manager.recordSkillBody(input.name, call.output.replace(SKILL_CONTINUATION, ''), typeof input.cursor === 'string' && input.cursor.length > 0);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (call.toolName === 'read') {
|
|
59
|
+
const path = typeof input.path === 'string' ? input.path : undefined;
|
|
60
|
+
if (!path || !call.success || call.unchanged)
|
|
61
|
+
return;
|
|
62
|
+
manager.recordFileText(resolveAgainst(path, call.workingDirectory), call.output);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (call.toolName === 'write' || call.toolName === 'edit') {
|
|
66
|
+
const path = typeof input.path === 'string' ? input.path : undefined;
|
|
67
|
+
// The body a read showed is behind the file now.
|
|
68
|
+
if (path && call.success)
|
|
69
|
+
manager.forgetFileText(resolveAgainst(path, call.workingDirectory));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function fit(text, tokens) {
|
|
73
|
+
const room = tokens * CHARS_PER_TOKEN;
|
|
74
|
+
return text.length <= room
|
|
75
|
+
? text
|
|
76
|
+
: `${text.slice(0, Math.max(0, room - CUT_MARKER.length))}${CUT_MARKER}`;
|
|
77
|
+
}
|
|
78
|
+
/** The section to append after a summary, or `undefined` when there is nothing to put back. */
|
|
79
|
+
export function renderRestoredContext(state, options = {}) {
|
|
80
|
+
const window = options.contextWindowTokens;
|
|
81
|
+
const skillsTotal = window === undefined
|
|
82
|
+
? RESTORE_SKILLS_TOTAL_TOKENS
|
|
83
|
+
: Math.min(RESTORE_SKILLS_TOTAL_TOKENS, Math.floor(window * RESTORE_SKILLS_WINDOW_SHARE));
|
|
84
|
+
const filesTotal = window === undefined
|
|
85
|
+
? RESTORE_FILES_TOTAL_TOKENS
|
|
86
|
+
: Math.min(RESTORE_FILES_TOTAL_TOKENS, Math.floor(window * RESTORE_FILES_WINDOW_SHARE));
|
|
87
|
+
const sections = [];
|
|
88
|
+
let skillBudget = skillsTotal;
|
|
89
|
+
const skills = [...(state.restorable?.skills ?? [])].reverse();
|
|
90
|
+
for (const skill of skills) {
|
|
91
|
+
if (sections.length >= RESTORE_MAX_SKILLS || skillBudget <= 0)
|
|
92
|
+
break;
|
|
93
|
+
const body = fit(skill.body, Math.min(RESTORE_SKILL_TOKENS, skillBudget));
|
|
94
|
+
skillBudget -= Math.ceil(body.length / CHARS_PER_TOKEN);
|
|
95
|
+
sections.push(`### Skill: ${skill.name}\n\n${body}`);
|
|
96
|
+
}
|
|
97
|
+
let fileBudget = filesTotal;
|
|
98
|
+
let files = 0;
|
|
99
|
+
const candidates = [...(state.restorable?.files ?? [])].reverse();
|
|
100
|
+
for (const file of candidates) {
|
|
101
|
+
if (files >= RESTORE_MAX_FILES || fileBudget <= 0)
|
|
102
|
+
break;
|
|
103
|
+
if (isInstructionPath(file.path) || isPlanPath(file.path))
|
|
104
|
+
continue;
|
|
105
|
+
const text = fit(file.text, Math.min(RESTORE_FILE_TOKENS, fileBudget));
|
|
106
|
+
fileBudget -= Math.ceil(text.length / CHARS_PER_TOKEN);
|
|
107
|
+
files += 1;
|
|
108
|
+
sections.push(`### File: ${file.path}\n\n${text}`);
|
|
109
|
+
}
|
|
110
|
+
const note = options.hostNote?.trim();
|
|
111
|
+
if (note)
|
|
112
|
+
sections.push(note);
|
|
113
|
+
if (sections.length === 0)
|
|
114
|
+
return undefined;
|
|
115
|
+
return [
|
|
116
|
+
'## Restored after compaction',
|
|
117
|
+
'',
|
|
118
|
+
'These were loaded or read earlier in this conversation and are put back here so you can keep using them. A file below may have changed on disk since it was read; read it again before you rely on it for an edit.',
|
|
119
|
+
'',
|
|
120
|
+
sections.join('\n\n'),
|
|
121
|
+
].join('\n');
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=restore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restore.js","sourceRoot":"","sources":["../../src/compaction/restore.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,28 @@ export interface WorkingState {
|
|
|
28
28
|
* of the state".
|
|
29
29
|
*/
|
|
30
30
|
evicted: Record<string, number>;
|
|
31
|
+
/**
|
|
32
|
+
* Bodies a compaction puts back after the summary: the skills the model
|
|
33
|
+
* loaded and the files it read. Kept apart from the slots above because
|
|
34
|
+
* they are verbatim text, not a summary of it, and are never rendered into
|
|
35
|
+
* the working-memory block.
|
|
36
|
+
*/
|
|
37
|
+
restorable?: RestorableState;
|
|
38
|
+
}
|
|
39
|
+
/** A skill the model loaded, as its instructions read. */
|
|
40
|
+
export interface RestorableSkill {
|
|
41
|
+
readonly name: string;
|
|
42
|
+
readonly body: string;
|
|
43
|
+
}
|
|
44
|
+
/** A file the model read, as the read returned it. */
|
|
45
|
+
export interface RestorableFile {
|
|
46
|
+
readonly path: string;
|
|
47
|
+
readonly text: string;
|
|
48
|
+
}
|
|
49
|
+
/** Oldest first; a later load or read of the same name or path replaces and moves to the end. */
|
|
50
|
+
export interface RestorableState {
|
|
51
|
+
skills: RestorableSkill[];
|
|
52
|
+
files: RestorableFile[];
|
|
31
53
|
}
|
|
32
54
|
export interface PinSlot {
|
|
33
55
|
key: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/compaction/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,QAAQ,EAAE,CAAA;IAChB;;;;;;;OAOG;IACH,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,WAAW,EAAE,cAAc,EAAE,CAAA;IAC7B,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB;;;;;;;;OAQG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/compaction/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,QAAQ,EAAE,CAAA;IAChB;;;;;;;OAOG;IACH,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,WAAW,EAAE,cAAc,EAAE,CAAA;IAC7B,gBAAgB,EAAE,MAAM,EAAE,CAAA;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB;;;;;;;;OAQG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,eAAe,CAAA;CAC5B;AAED,0DAA0D;AAC1D,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACrB;AAED,sDAAsD;AACtD,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACrB;AAED,iGAAiG;AACjG,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,eAAe,EAAE,CAAA;IACzB,KAAK,EAAE,cAAc,EAAE,CAAA;CACvB;AAED,MAAM,WAAW,OAAO;IACvB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;CACjB;AAED,+EAA+E;AAC/E,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,QAAQ;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAA;CACjD;AAED,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,UAAU,EAAE,CAAA;CACrB;AAED,MAAM,MAAM,UAAU,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAA;AAErB,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG,UAAU,GAAG,gBAAgB,GAAG,UAAU,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { CompactionConfig } from '../config/runtime.js';
|
|
2
2
|
import { WorkingStateManager } from './manager.js';
|
|
3
|
-
import type { FileSlot, PinSlot, PlanSlot, ToolResultSlot } from './types.js';
|
|
3
|
+
import type { FileSlot, PinSlot, PlanSlot, RestorableState, ToolResultSlot } from './types.js';
|
|
4
4
|
/**
|
|
5
5
|
* The working state in a form that survives a process boundary.
|
|
6
6
|
*
|
|
@@ -41,6 +41,8 @@ export interface WorkingStateSnapshot {
|
|
|
41
41
|
* completeness it does not have.
|
|
42
42
|
*/
|
|
43
43
|
readonly evicted: Readonly<Record<string, number>>;
|
|
44
|
+
/** Absent in snapshots written before bodies were restored; restored as none. */
|
|
45
|
+
readonly restorable?: RestorableState;
|
|
44
46
|
}
|
|
45
47
|
export declare function snapshotWorkingState(manager: WorkingStateManager): WorkingStateSnapshot;
|
|
46
48
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/compaction/wire.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/compaction/wire.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EACX,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,eAAe,EACf,cAAc,EAEd,MAAM,YAAY,CAAA;AAEnB;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAA;IAClC,yEAAyE;IACzE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,CAAA;IAClC,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAA;IACnC,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;IACrC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAA;IACvC,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAA;IACvC,QAAQ,CAAC,WAAW,EAAE,SAAS,cAAc,EAAE,CAAA;IAC/C,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;IAC5C,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAA;IAC1C;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAClD,iFAAiF;IACjF,QAAQ,CAAC,UAAU,CAAC,EAAE,eAAe,CAAA;CACrC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,GAAG,oBAAoB,CAwBvF;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,EAAE,gBAAgB,GACtB,mBAAmB,CA0BrB"}
|
package/dist/compaction/wire.js
CHANGED
|
@@ -14,6 +14,14 @@ export function snapshotWorkingState(manager) {
|
|
|
14
14
|
userRequirements: [...state.userRequirements],
|
|
15
15
|
assistantNotes: [...state.assistantNotes],
|
|
16
16
|
evicted: { ...state.evicted },
|
|
17
|
+
...(state.restorable
|
|
18
|
+
? {
|
|
19
|
+
restorable: {
|
|
20
|
+
skills: state.restorable.skills.map((skill) => ({ ...skill })),
|
|
21
|
+
files: state.restorable.files.map((file) => ({ ...file })),
|
|
22
|
+
},
|
|
23
|
+
}
|
|
24
|
+
: {}),
|
|
17
25
|
};
|
|
18
26
|
}
|
|
19
27
|
/**
|
|
@@ -40,6 +48,14 @@ export function restoreWorkingState(snapshot, config) {
|
|
|
40
48
|
userRequirements: [...snapshot.userRequirements],
|
|
41
49
|
assistantNotes: [...snapshot.assistantNotes],
|
|
42
50
|
evicted: { ...snapshot.evicted },
|
|
51
|
+
...(snapshot.restorable
|
|
52
|
+
? {
|
|
53
|
+
restorable: {
|
|
54
|
+
skills: snapshot.restorable.skills.map((skill) => ({ ...skill })),
|
|
55
|
+
files: snapshot.restorable.files.map((file) => ({ ...file })),
|
|
56
|
+
},
|
|
57
|
+
}
|
|
58
|
+
: {}),
|
|
43
59
|
};
|
|
44
60
|
manager.replaceState(state);
|
|
45
61
|
return manager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../src/compaction/wire.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../src/compaction/wire.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAsDlD,MAAM,UAAU,oBAAoB,CAAC,OAA4B;IAChE,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;IAChC,OAAO;QACN,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;QACrB,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAChC,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;QAC/B,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;QAC7B,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC;QACnC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC;QACnC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC;QACnC,gBAAgB,EAAE,CAAC,GAAG,KAAK,CAAC,gBAAgB,CAAC;QAC7C,cAAc,EAAE,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC;QACzC,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE;QAC7B,GAAG,CAAC,KAAK,CAAC,UAAU;YACnB,CAAC,CAAC;gBACA,UAAU,EAAE;oBACX,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;oBAC9D,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;iBAC1D;aACD;YACF,CAAC,CAAC,EAAE,CAAC;KACN,CAAA;AACF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAClC,QAA8B,EAC9B,MAAwB;IAExB,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAA;IAC/C,MAAM,KAAK,GAAiB;QAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;QACxB,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3D,KAAK,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACtD,SAAS,EAAE,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC;QAClC,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAChC,WAAW,EAAE,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC;QACtC,WAAW,EAAE,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC;QACtC,WAAW,EAAE,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC;QACtC,gBAAgB,EAAE,CAAC,GAAG,QAAQ,CAAC,gBAAgB,CAAC;QAChD,cAAc,EAAE,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC;QAC5C,OAAO,EAAE,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE;QAChC,GAAG,CAAC,QAAQ,CAAC,UAAU;YACtB,CAAC,CAAC;gBACA,UAAU,EAAE;oBACX,MAAM,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;oBACjE,KAAK,EAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;iBAC7D;aACD;YACF,CAAC,CAAC,EAAE,CAAC;KACN,CAAA;IACD,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IAC3B,OAAO,OAAO,CAAA;AACf,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,5 +5,5 @@ export { BackgroundJobLimitError, BackgroundJobRegistry, UnknownBackgroundJobErr
|
|
|
5
5
|
export { MONITOR_BATCH_MAX_CHARS, MONITOR_BATCH_WINDOW_MS, MONITOR_BUCKET_CAPACITY, MONITOR_BUCKET_REFILL_MS, MONITOR_LINE_MAX_CHARS, MONITOR_NOTIFICATION_MAX_CHARS, MONITOR_PARTIAL_LINE_MAX_BYTES, MONITOR_SUPPRESSION_LIMIT_MS, MONITOR_TIMEOUT_CAP_MS, MONITOR_TIMEOUT_DEFAULT_MS, MONITOR_TIMEOUT_MAX_MS, MONITOR_TIMEOUT_MIN_MS, createMonitorStream, formatMonitorDuration, } from './runtime/jobs/monitor-stream.js';
|
|
6
6
|
export type { MonitorStream, MonitorStreamOptions, MonitorStreamStats, } from './runtime/jobs/monitor-stream.js';
|
|
7
7
|
export { createBackgroundJobId, isBackgroundJobId, } from './runtime/jobs/job-id.js';
|
|
8
|
-
export type { BackgroundJob, BackgroundJobOutput, BackgroundJobRegistryConfig, BackgroundJobStatus, MonitorEvent, StartJobParams, } from './runtime/jobs/registry.js';
|
|
8
|
+
export type { BackgroundJob, ForegroundCommand, ForegroundHandoffReason, BackgroundJobOutput, BackgroundJobRegistryConfig, BackgroundJobStatus, MonitorEvent, StartJobParams, } from './runtime/jobs/registry.js';
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,mBAAmB,mBAAmB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AAKjC,OAAO,EACN,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,EACzB,SAAS,EACT,kBAAkB,GAClB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACN,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,8BAA8B,EAC9B,8BAA8B,EAC9B,4BAA4B,EAC5B,sBAAsB,EACtB,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,GACrB,MAAM,kCAAkC,CAAA;AACzC,YAAY,EACX,aAAa,EACb,oBAAoB,EACpB,kBAAkB,GAClB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EACN,qBAAqB,EACrB,iBAAiB,GACjB,MAAM,0BAA0B,CAAA;AACjC,YAAY,EACX,aAAa,EACb,mBAAmB,EACnB,2BAA2B,EAC3B,mBAAmB,EACnB,YAAY,EACZ,cAAc,GACd,MAAM,4BAA4B,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,mBAAmB,mBAAmB,CAAA;AACtC,cAAc,qBAAqB,CAAA;AACnC,cAAc,mBAAmB,CAAA;AAKjC,OAAO,EACN,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,EACzB,SAAS,EACT,kBAAkB,GAClB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACN,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,8BAA8B,EAC9B,8BAA8B,EAC9B,4BAA4B,EAC5B,sBAAsB,EACtB,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,qBAAqB,GACrB,MAAM,kCAAkC,CAAA;AACzC,YAAY,EACX,aAAa,EACb,oBAAoB,EACpB,kBAAkB,GAClB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EACN,qBAAqB,EACrB,iBAAiB,GACjB,MAAM,0BAA0B,CAAA;AACjC,YAAY,EACX,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,2BAA2B,EAC3B,mBAAmB,EACnB,YAAY,EACZ,cAAc,GACd,MAAM,4BAA4B,CAAA"}
|
|
@@ -14,7 +14,13 @@
|
|
|
14
14
|
* The command runs with `sh -c` in `cwd`. It receives one JSON object on
|
|
15
15
|
* stdin — `event`, `cwd`, `session_id`, `turn_id` inside a turn, and for
|
|
16
16
|
* tool events `tool_name`, `tool_input` and (after the call) `tool_result`;
|
|
17
|
-
* `subagent_stop` adds `parent_session_id` and `parent_turn_id
|
|
17
|
+
* `subagent_stop` adds `parent_session_id` and `parent_turn_id`. Each fact a
|
|
18
|
+
* script written for another host would look for under a different name is
|
|
19
|
+
* also sent under that name: `hook_event_name` (the PascalCase spelling,
|
|
20
|
+
* `PreToolUse`, `Stop`, ...), `tool_response` (the same object as
|
|
21
|
+
* `tool_result`), and, when the host knows them, `transcript_path` and
|
|
22
|
+
* `permission_mode`. The Namzu names stay, so no existing script changes.
|
|
23
|
+
* The same facts go out as
|
|
18
24
|
* same facts as `NAMZU_HOOK_EVENT`, `NAMZU_SESSION_ID`, `NAMZU_TURN_ID`,
|
|
19
25
|
* `NAMZU_TOOL_NAME` and, when the input names a file, `NAMZU_TOOL_PATH`.
|
|
20
26
|
*
|
|
@@ -189,6 +195,10 @@ export interface ShellHookInput {
|
|
|
189
195
|
readonly notification?: PluginNotificationInfo;
|
|
190
196
|
/** On `turn_end` and `subagent_stop`: an earlier answer already kept this turn going. */
|
|
191
197
|
readonly stopHookActive?: boolean;
|
|
198
|
+
/** The session's transcript file, when the host has one. Sent as `transcript_path`. */
|
|
199
|
+
readonly transcriptPath?: string;
|
|
200
|
+
/** How tool calls are being decided right now. Sent as `permission_mode`. */
|
|
201
|
+
readonly permissionMode?: string;
|
|
192
202
|
}
|
|
193
203
|
/** Run one hook command to completion, bounded by its deadline and capture. */
|
|
194
204
|
export declare function runShellHook(entry: ShellHookEntry, input: ShellHookInput, signal?: AbortSignal): Promise<ShellHookOutcome>;
|
|
@@ -202,6 +212,14 @@ export interface ShellHookOptions {
|
|
|
202
212
|
/** Where the command runs and what `cwd` says on stdin. */
|
|
203
213
|
readonly cwd: string;
|
|
204
214
|
readonly log?: Logger;
|
|
215
|
+
/**
|
|
216
|
+
* The transcript file of a session, sent as `transcript_path`. Called at
|
|
217
|
+
* each run, because a host's session can change under one manager. Absent
|
|
218
|
+
* or returning `undefined`, the field is left out.
|
|
219
|
+
*/
|
|
220
|
+
readonly transcriptPath?: (sessionId: string) => string | undefined;
|
|
221
|
+
/** The permission mode in force now, sent as `permission_mode`. Called at each run. */
|
|
222
|
+
readonly permissionMode?: () => string | undefined;
|
|
205
223
|
}
|
|
206
224
|
/** One entry as a hook definition the lifecycle manager accepts. */
|
|
207
225
|
export declare function createShellHook(event: ShellHookEvent, entry: ShellHookEntry, options: ShellHookOptions): PluginHookDefinition;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-hook.d.ts","sourceRoot":"","sources":["../../src/plugin/shell-hook.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"shell-hook.d.ts","sourceRoot":"","sources":["../../src/plugin/shell-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmGG;AAUH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,EACX,oBAAoB,EAEpB,oBAAoB,EACpB,eAAe,EAEf,gBAAgB,EAChB,sBAAsB,EACtB,MAAM,0BAA0B,CAAA;AAIjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAE5D;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,CACnC,eAAe,EACb,oBAAoB,GACpB,eAAe,GACf,aAAa,GACb,cAAc,GACd,eAAe,GACf,uBAAuB,GACvB,oBAAoB,GACpB,cAAc,GACd,aAAa,GACb,cAAc,GACd,eAAe,GACf,YAAY,GACZ,UAAU,CACZ,CAAA;AAED,eAAO,MAAM,iBAAiB,EAAE,SAAS,cAAc,EActD,CAAA;AAED,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC9B,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;IACzB,gHAAgH;IAChH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;IACpB,qDAAqD;IACrD,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,+DAA+D;IAC/D,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAC/B;AAED,+DAA+D;AAC/D,MAAM,MAAM,gBAAgB,GAAG;IAC9B,QAAQ,EAAE,KAAK,IAAI,cAAc,CAAC,CAAC,EAAE,SAAS,cAAc,EAAE;CAC9D,CAAA;AAED,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,EAAE,QAA6D,CAAA;AAEjG,eAAO,MAAM,6BAA6B,SAAU,CAAA;AACpD,eAAO,MAAM,yBAAyB,QAAc,CAAA;AAIpD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC1B,OAAO,CAgBT;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,EAAE,OAAO,GAChB,OAAO,CAgCT;AAED,0EAA0E;AAC1E,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,wDAAwD;IACxD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAA;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,qDAAqD;IACrD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,+EAA+E;IAC/E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,kDAAkD;IAClD,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,6EAA6E;IAC7E,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAA;IAC1C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE;QACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;QACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;QACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KACvB,CAAA;IACD,gEAAgE;IAChE,QAAQ,CAAC,YAAY,CAAC,EAAE,sBAAsB,CAAA;IAC9C,yFAAyF;IACzF,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,uFAAuF;IACvF,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;IAChC,6EAA6E;IAC7E,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAChC;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAC3B,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,cAAc,EACrB,MAAM,CAAC,EAAE,WAAW,GAClB,OAAO,CAAC,gBAAgB,CAAC,CA2I3B;AA8KD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,gBAAgB,EACzB,GAAG,GAAE,MAAoB,GACvB,gBAAgB,CAuKlB;AAED,MAAM,WAAW,gBAAgB;IAChC,2DAA2D;IAC3D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;IACnE,uFAAuF;IACvF,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;CAClD;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAC9B,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,gBAAgB,GACvB,oBAAoB,CA2DtB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,IAAI,CAAC,sBAAsB,EAAE,cAAc,CAAC,EACrD,KAAK,EAAE,gBAAgB,EACvB,OAAO,EAAE,gBAAgB,GAAG;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;CAAE,GAC1D,MAAM,CAkBR"}
|
|
@@ -14,7 +14,13 @@
|
|
|
14
14
|
* The command runs with `sh -c` in `cwd`. It receives one JSON object on
|
|
15
15
|
* stdin — `event`, `cwd`, `session_id`, `turn_id` inside a turn, and for
|
|
16
16
|
* tool events `tool_name`, `tool_input` and (after the call) `tool_result`;
|
|
17
|
-
* `subagent_stop` adds `parent_session_id` and `parent_turn_id
|
|
17
|
+
* `subagent_stop` adds `parent_session_id` and `parent_turn_id`. Each fact a
|
|
18
|
+
* script written for another host would look for under a different name is
|
|
19
|
+
* also sent under that name: `hook_event_name` (the PascalCase spelling,
|
|
20
|
+
* `PreToolUse`, `Stop`, ...), `tool_response` (the same object as
|
|
21
|
+
* `tool_result`), and, when the host knows them, `transcript_path` and
|
|
22
|
+
* `permission_mode`. The Namzu names stay, so no existing script changes.
|
|
23
|
+
* The same facts go out as
|
|
18
24
|
* same facts as `NAMZU_HOOK_EVENT`, `NAMZU_SESSION_ID`, `NAMZU_TURN_ID`,
|
|
19
25
|
* `NAMZU_TOOL_NAME` and, when the input names a file, `NAMZU_TOOL_PATH`.
|
|
20
26
|
*
|
|
@@ -197,8 +203,11 @@ export function runShellHook(entry, input, signal) {
|
|
|
197
203
|
const timeoutMs = Math.min(MAX_SHELL_HOOK_TIMEOUT_MS, Math.max(1, entry.timeoutMs ?? DEFAULT_SHELL_HOOK_TIMEOUT_MS));
|
|
198
204
|
const payload = JSON.stringify({
|
|
199
205
|
event: input.event,
|
|
206
|
+
hook_event_name: PASCAL_EVENT_NAMES[input.event] ?? input.event,
|
|
200
207
|
cwd: input.cwd,
|
|
201
208
|
session_id: input.sessionId,
|
|
209
|
+
...(input.transcriptPath !== undefined ? { transcript_path: input.transcriptPath } : {}),
|
|
210
|
+
...(input.permissionMode !== undefined ? { permission_mode: input.permissionMode } : {}),
|
|
202
211
|
...(input.turnId !== undefined ? { turn_id: input.turnId } : {}),
|
|
203
212
|
...(input.parentSessionId !== undefined ? { parent_session_id: input.parentSessionId } : {}),
|
|
204
213
|
...(input.parentTurnId !== undefined ? { parent_turn_id: input.parentTurnId } : {}),
|
|
@@ -206,7 +215,9 @@ export function runShellHook(entry, input, signal) {
|
|
|
206
215
|
...(input.compaction !== undefined ? { compaction: input.compaction } : {}),
|
|
207
216
|
...(input.toolName !== undefined ? { tool_name: input.toolName } : {}),
|
|
208
217
|
...(input.toolInput !== undefined ? { tool_input: input.toolInput } : {}),
|
|
209
|
-
...(input.toolResult !== undefined
|
|
218
|
+
...(input.toolResult !== undefined
|
|
219
|
+
? { tool_result: input.toolResult, tool_response: input.toolResult }
|
|
220
|
+
: {}),
|
|
210
221
|
...(input.event === 'post_tool_use_failure' && input.toolResult?.error !== undefined
|
|
211
222
|
? { error: input.toolResult.error }
|
|
212
223
|
: {}),
|
|
@@ -453,11 +464,12 @@ function readShellHookJson(event, stdout) {
|
|
|
453
464
|
}
|
|
454
465
|
else if (decision !== 'defer') {
|
|
455
466
|
return {
|
|
456
|
-
invalid: '`permissionDecision` must be "allow", "deny" or "
|
|
467
|
+
invalid: '`permissionDecision` must be "allow", "deny", "ask" or "defer"',
|
|
457
468
|
};
|
|
458
469
|
}
|
|
459
|
-
// "defer"
|
|
460
|
-
//
|
|
470
|
+
// "defer" is accepted and decides nothing: a script that hands a call
|
|
471
|
+
// back to a separate permission service gets the ordinary rules, the
|
|
472
|
+
// same as a hook that said nothing.
|
|
461
473
|
}
|
|
462
474
|
if (specific.updatedInput !== undefined) {
|
|
463
475
|
if (!isRecord(specific.updatedInput))
|
|
@@ -683,6 +695,8 @@ export function createShellHook(event, entry, options) {
|
|
|
683
695
|
}
|
|
684
696
|
if (entry.once === true)
|
|
685
697
|
spent = true;
|
|
698
|
+
const transcriptPath = options.transcriptPath?.(String(context.sessionId));
|
|
699
|
+
const permissionMode = options.permissionMode?.();
|
|
686
700
|
const outcome = await runShellHook(entry, {
|
|
687
701
|
event,
|
|
688
702
|
cwd: options.cwd,
|
|
@@ -711,6 +725,8 @@ export function createShellHook(event, entry, options) {
|
|
|
711
725
|
: {}),
|
|
712
726
|
...(context.notification !== undefined ? { notification: context.notification } : {}),
|
|
713
727
|
...(context.stopHookActive === true ? { stopHookActive: true } : {}),
|
|
728
|
+
...(transcriptPath !== undefined ? { transcriptPath } : {}),
|
|
729
|
+
...(permissionMode !== undefined ? { permissionMode } : {}),
|
|
714
730
|
}, context.signal);
|
|
715
731
|
return shellHookVerdict(event, entry, outcome, log);
|
|
716
732
|
},
|