aismemory 0.8.0 → 0.8.3
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/README.md +87 -7
- package/dist/__tests__/agent-key-mode.test.js +105 -6
- package/dist/__tests__/agent-key-mode.test.js.map +1 -1
- package/dist/__tests__/agent-load-persistence.test.js +22 -6
- package/dist/__tests__/agent-load-persistence.test.js.map +1 -1
- package/dist/__tests__/ais-http.test.js +50 -4
- package/dist/__tests__/ais-http.test.js.map +1 -1
- package/dist/__tests__/auto-handoff.test.js +56 -0
- package/dist/__tests__/auto-handoff.test.js.map +1 -1
- package/dist/__tests__/bond-link-survives-exit.test.d.ts +1 -0
- package/dist/__tests__/bond-link-survives-exit.test.js +177 -0
- package/dist/__tests__/bond-link-survives-exit.test.js.map +1 -0
- package/dist/__tests__/cli-info.test.d.ts +1 -0
- package/dist/__tests__/cli-info.test.js +113 -0
- package/dist/__tests__/cli-info.test.js.map +1 -0
- package/dist/__tests__/credential-resolution.test.js +57 -3
- package/dist/__tests__/credential-resolution.test.js.map +1 -1
- package/dist/__tests__/credential-whoami.test.d.ts +8 -0
- package/dist/__tests__/credential-whoami.test.js +93 -0
- package/dist/__tests__/credential-whoami.test.js.map +1 -0
- package/dist/__tests__/device-flow-gate-e2e.test.js +6 -4
- package/dist/__tests__/device-flow-gate-e2e.test.js.map +1 -1
- package/dist/__tests__/doctor.test.js +39 -13
- package/dist/__tests__/doctor.test.js.map +1 -1
- package/dist/__tests__/full-context-view-forwarding.test.d.ts +1 -0
- package/dist/__tests__/full-context-view-forwarding.test.js +80 -0
- package/dist/__tests__/full-context-view-forwarding.test.js.map +1 -0
- package/dist/__tests__/hydration.test.js +56 -1
- package/dist/__tests__/hydration.test.js.map +1 -1
- package/dist/__tests__/install.test.d.ts +1 -0
- package/dist/__tests__/install.test.js +126 -0
- package/dist/__tests__/install.test.js.map +1 -0
- package/dist/__tests__/integration.test.js +1 -0
- package/dist/__tests__/integration.test.js.map +1 -1
- package/dist/__tests__/invite-accept.test.d.ts +1 -0
- package/dist/__tests__/invite-accept.test.js +118 -0
- package/dist/__tests__/invite-accept.test.js.map +1 -0
- package/dist/__tests__/lost-agent.test.js +51 -0
- package/dist/__tests__/lost-agent.test.js.map +1 -1
- package/dist/__tests__/mcp-tools.test.js +245 -6
- package/dist/__tests__/mcp-tools.test.js.map +1 -1
- package/dist/__tests__/missing-credential-help.test.d.ts +1 -0
- package/dist/__tests__/missing-credential-help.test.js +14 -0
- package/dist/__tests__/missing-credential-help.test.js.map +1 -0
- package/dist/__tests__/pending-device-flow-e2e.test.js +22 -1
- package/dist/__tests__/pending-device-flow-e2e.test.js.map +1 -1
- package/dist/__tests__/pending-device-flow-resume.test.d.ts +1 -0
- package/dist/__tests__/pending-device-flow-resume.test.js +104 -0
- package/dist/__tests__/pending-device-flow-resume.test.js.map +1 -0
- package/dist/__tests__/prompt-resource.test.js +1 -0
- package/dist/__tests__/prompt-resource.test.js.map +1 -1
- package/dist/__tests__/reconnect-survival-e2e.test.js +3 -2
- package/dist/__tests__/reconnect-survival-e2e.test.js.map +1 -1
- package/dist/__tests__/refresh.test.js +24 -2
- package/dist/__tests__/refresh.test.js.map +1 -1
- package/dist/__tests__/request-timeout.test.d.ts +1 -0
- package/dist/__tests__/request-timeout.test.js +55 -0
- package/dist/__tests__/request-timeout.test.js.map +1 -0
- package/dist/__tests__/resolve-agent-preference-e2e.test.js +15 -3
- package/dist/__tests__/resolve-agent-preference-e2e.test.js.map +1 -1
- package/dist/__tests__/retry-after.test.js +63 -4
- package/dist/__tests__/retry-after.test.js.map +1 -1
- package/dist/__tests__/run-pass-mode.test.d.ts +1 -0
- package/dist/__tests__/run-pass-mode.test.js +163 -0
- package/dist/__tests__/run-pass-mode.test.js.map +1 -0
- package/dist/__tests__/session-identity.test.d.ts +1 -0
- package/dist/__tests__/session-identity.test.js +276 -0
- package/dist/__tests__/session-identity.test.js.map +1 -0
- package/dist/__tests__/version-check.test.js +16 -1
- package/dist/__tests__/version-check.test.js.map +1 -1
- package/dist/__tests__/workspace-key-mode.test.js +194 -16
- package/dist/__tests__/workspace-key-mode.test.js.map +1 -1
- package/dist/agent-key-mode.js +70 -30
- package/dist/agent-key-mode.js.map +1 -1
- package/dist/ais-http-error.d.ts +3 -0
- package/dist/ais-http-error.js +8 -1
- package/dist/ais-http-error.js.map +1 -1
- package/dist/ais-http.d.ts +4 -0
- package/dist/ais-http.js +58 -17
- package/dist/ais-http.js.map +1 -1
- package/dist/auto-handoff.js +33 -1
- package/dist/auto-handoff.js.map +1 -1
- package/dist/cli/doctor.d.ts +4 -0
- package/dist/cli/doctor.js +60 -18
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/install.d.ts +6 -0
- package/dist/cli/install.js +52 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/invite-accept.d.ts +32 -0
- package/dist/cli/invite-accept.js +161 -0
- package/dist/cli/invite-accept.js.map +1 -0
- package/dist/cli/orientation.d.ts +2 -0
- package/dist/cli/orientation.js +31 -1
- package/dist/cli/orientation.js.map +1 -1
- package/dist/cli-info.d.ts +18 -0
- package/dist/cli-info.js +72 -0
- package/dist/cli-info.js.map +1 -0
- package/dist/credential-whoami.d.ts +50 -0
- package/dist/credential-whoami.js +91 -0
- package/dist/credential-whoami.js.map +1 -0
- package/dist/hydration.js +8 -0
- package/dist/hydration.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +201 -31
- package/dist/index.js.map +1 -1
- package/dist/mcp/tools.d.ts +10 -0
- package/dist/mcp/tools.js +99 -11
- package/dist/mcp/tools.js.map +1 -1
- package/dist/pending-device-flow.d.ts +31 -0
- package/dist/pending-device-flow.js +38 -0
- package/dist/pending-device-flow.js.map +1 -1
- package/dist/refresh.js +5 -1
- package/dist/refresh.js.map +1 -1
- package/dist/request-timeout.d.ts +26 -0
- package/dist/request-timeout.js +58 -0
- package/dist/request-timeout.js.map +1 -0
- package/dist/run-pass-mode.d.ts +16 -0
- package/dist/run-pass-mode.js +312 -0
- package/dist/run-pass-mode.js.map +1 -0
- package/dist/session-identity.d.ts +15 -1
- package/dist/session-identity.js +104 -12
- package/dist/session-identity.js.map +1 -1
- package/dist/telemetry.d.ts +1 -1
- package/dist/telemetry.js.map +1 -1
- package/dist/tool-args.d.ts +11 -1
- package/dist/tool-args.js +17 -1
- package/dist/tool-args.js.map +1 -1
- package/dist/types.d.ts +32 -0
- package/dist/version-check.d.ts +8 -0
- package/dist/version-check.js +21 -1
- package/dist/version-check.js.map +1 -1
- package/dist/workspace-key-mode.js +120 -32
- package/dist/workspace-key-mode.js.map +1 -1
- package/package.json +4 -6
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run-pass auth mode for the aismemory MCP client (CORBOT-662A4B3A).
|
|
3
|
+
*
|
|
4
|
+
* A launcher writes the current short-lived pass to AIS_RUN_PASS_FILE and may
|
|
5
|
+
* rotate that file while this process is running. Every request re-reads the
|
|
6
|
+
* file and sends exactly one credential header: x-run-pass.
|
|
7
|
+
*/
|
|
8
|
+
import { constants } from 'node:fs';
|
|
9
|
+
import { lstat, open } from 'node:fs/promises';
|
|
10
|
+
import { AisHttpError, duplicateMemoryResult } from './ais-http-error.js';
|
|
11
|
+
import { getAisRequestTimeoutMs, toAisRequestError } from './request-timeout.js';
|
|
12
|
+
import { emitTelemetry } from './telemetry.js';
|
|
13
|
+
import { OutOfScopeToolError } from './agent-key-mode.js';
|
|
14
|
+
import { readInboxAndMaybeAck } from './inbox-client.js';
|
|
15
|
+
import { orient } from './cli/orientation.js';
|
|
16
|
+
import { AGENT_ARCHIVE_KEY_MODE_DETAIL } from './agent-archive.js';
|
|
17
|
+
import { fetchCredentialWhoami } from './credential-whoami.js';
|
|
18
|
+
import { parseEmptyToolArgs, parseRecallArgs, parseFullContextArgs, parseRememberArgs, parseGoalCreateArgs, parseGoalListArgs, parseGoalUpdateProgressArgs, parseGoalCompleteArgs, parseInboxSendArgs, parseInboxReadArgs, parseInboxAckArgs, parseHandoffArgs, } from './tool-args.js';
|
|
19
|
+
const AGENT_ID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
20
|
+
/** A valid pass is 50 bytes; anything past this cap is refused unread. */
|
|
21
|
+
const MAX_RUN_PASS_FILE_BYTES = 256;
|
|
22
|
+
const RUN_PASS_PATTERN = /^ais_rp_[A-Za-z0-9_-]{43}$/;
|
|
23
|
+
export class RunPassConfigError extends Error {
|
|
24
|
+
constructor(message) {
|
|
25
|
+
super(message);
|
|
26
|
+
this.name = 'RunPassConfigError';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function readJson(res) {
|
|
30
|
+
return res.json().catch(() => null);
|
|
31
|
+
}
|
|
32
|
+
export function loadRunPassConfig(env = process.env) {
|
|
33
|
+
const rawPath = env['AIS_RUN_PASS_FILE'];
|
|
34
|
+
if (rawPath === undefined)
|
|
35
|
+
return null;
|
|
36
|
+
const runPassFile = rawPath.trim();
|
|
37
|
+
if (runPassFile === '') {
|
|
38
|
+
throw new RunPassConfigError('AIS_RUN_PASS_FILE is set but empty. Refusing to start run-pass mode.');
|
|
39
|
+
}
|
|
40
|
+
const agentId = env['AIS_AGENT_ID']?.trim();
|
|
41
|
+
if (!agentId) {
|
|
42
|
+
throw new RunPassConfigError('AIS_RUN_PASS_FILE is set but AIS_AGENT_ID is missing. ' +
|
|
43
|
+
'Run-pass mode needs the one agent this pass is scoped to.');
|
|
44
|
+
}
|
|
45
|
+
if (!AGENT_ID_PATTERN.test(agentId)) {
|
|
46
|
+
throw new RunPassConfigError('AIS_AGENT_ID is not a UUID. Refusing to start run-pass mode.');
|
|
47
|
+
}
|
|
48
|
+
return { runPassFile, agentId };
|
|
49
|
+
}
|
|
50
|
+
function assertSafeRunPassFile(runPassFile, st) {
|
|
51
|
+
if (!st.isFile()) {
|
|
52
|
+
throw new RunPassConfigError(`Refusing AIS request: AIS_RUN_PASS_FILE at ${runPassFile} is not a regular file.`);
|
|
53
|
+
}
|
|
54
|
+
if (typeof process.getuid === 'function' && st.uid !== process.getuid()) {
|
|
55
|
+
throw new RunPassConfigError(`Refusing AIS request: AIS_RUN_PASS_FILE at ${runPassFile} is not owned by the current user.`);
|
|
56
|
+
}
|
|
57
|
+
if ((st.mode & 0o077) !== 0) {
|
|
58
|
+
throw new RunPassConfigError(`Refusing AIS request: AIS_RUN_PASS_FILE at ${runPassFile} is accessible to group or others (chmod 600).`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function readBoundedRunPassFile(runPassFile) {
|
|
62
|
+
// lstat first so a symlink, FIFO, or device is refused before it is opened.
|
|
63
|
+
assertSafeRunPassFile(runPassFile, await lstat(runPassFile));
|
|
64
|
+
// O_NOFOLLOW/O_NONBLOCK close the swap-after-lstat race; fstat re-checks the opened inode.
|
|
65
|
+
const handle = await open(runPassFile, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
66
|
+
try {
|
|
67
|
+
assertSafeRunPassFile(runPassFile, await handle.stat());
|
|
68
|
+
const buffer = Buffer.alloc(MAX_RUN_PASS_FILE_BYTES + 1);
|
|
69
|
+
const { bytesRead } = await handle.read(buffer, 0, buffer.length, 0);
|
|
70
|
+
if (bytesRead > MAX_RUN_PASS_FILE_BYTES) {
|
|
71
|
+
throw new RunPassConfigError(`Refusing AIS request: AIS_RUN_PASS_FILE at ${runPassFile} exceeds ${MAX_RUN_PASS_FILE_BYTES} bytes.`);
|
|
72
|
+
}
|
|
73
|
+
return buffer.toString('utf8', 0, bytesRead);
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
await handle.close();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export async function readRunPassFile(runPassFile) {
|
|
80
|
+
let raw;
|
|
81
|
+
try {
|
|
82
|
+
raw = await readBoundedRunPassFile(runPassFile);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (error instanceof RunPassConfigError)
|
|
86
|
+
throw error;
|
|
87
|
+
const reason = error instanceof Error ? error.message : 'unknown read error';
|
|
88
|
+
throw new RunPassConfigError(`Refusing AIS request: cannot read AIS_RUN_PASS_FILE at ${runPassFile}: ${reason}`);
|
|
89
|
+
}
|
|
90
|
+
const runPass = raw.trim();
|
|
91
|
+
if (runPass.length === 0) {
|
|
92
|
+
throw new RunPassConfigError(`Refusing AIS request: AIS_RUN_PASS_FILE at ${runPassFile} is empty.`);
|
|
93
|
+
}
|
|
94
|
+
if (!RUN_PASS_PATTERN.test(runPass)) {
|
|
95
|
+
throw new RunPassConfigError(`Refusing AIS request: AIS_RUN_PASS_FILE at ${runPassFile} does not contain a valid ais_rp_ run pass.`);
|
|
96
|
+
}
|
|
97
|
+
return runPass;
|
|
98
|
+
}
|
|
99
|
+
async function runPassHeaders(runPassFile, includeContentType) {
|
|
100
|
+
const runPass = await readRunPassFile(runPassFile);
|
|
101
|
+
return {
|
|
102
|
+
...(includeContentType ? { 'Content-Type': 'application/json' } : {}),
|
|
103
|
+
'x-run-pass': runPass,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
export async function runPassPost(aisUrl, path, runPassFile, body, fetchImpl = globalThis.fetch) {
|
|
107
|
+
const headers = await runPassHeaders(runPassFile, true);
|
|
108
|
+
const timeoutMs = getAisRequestTimeoutMs();
|
|
109
|
+
let res;
|
|
110
|
+
try {
|
|
111
|
+
res = await fetchImpl(`${aisUrl}${path}`, {
|
|
112
|
+
method: 'POST',
|
|
113
|
+
headers,
|
|
114
|
+
body: JSON.stringify(body),
|
|
115
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
const wrapped = toAisRequestError(err, path, timeoutMs);
|
|
120
|
+
emitTelemetry({ event: 'ais.http.failure', path, error: wrapped instanceof Error ? wrapped.message : String(wrapped) });
|
|
121
|
+
throw wrapped;
|
|
122
|
+
}
|
|
123
|
+
const data = await readJson(res);
|
|
124
|
+
if (!res.ok) {
|
|
125
|
+
emitTelemetry({ event: 'ais.http.failure', path, httpStatus: res.status, error: `HTTP ${res.status}` });
|
|
126
|
+
throw new AisHttpError(res.status, path, data);
|
|
127
|
+
}
|
|
128
|
+
return data;
|
|
129
|
+
}
|
|
130
|
+
export async function runPassGet(aisUrl, path, runPassFile, fetchImpl = globalThis.fetch) {
|
|
131
|
+
const headers = await runPassHeaders(runPassFile, false);
|
|
132
|
+
const timeoutMs = getAisRequestTimeoutMs();
|
|
133
|
+
let res;
|
|
134
|
+
try {
|
|
135
|
+
res = await fetchImpl(`${aisUrl}${path}`, {
|
|
136
|
+
headers,
|
|
137
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
const wrapped = toAisRequestError(err, path, timeoutMs);
|
|
142
|
+
emitTelemetry({ event: 'ais.http.failure', path, error: wrapped instanceof Error ? wrapped.message : String(wrapped) });
|
|
143
|
+
throw wrapped;
|
|
144
|
+
}
|
|
145
|
+
const data = await readJson(res);
|
|
146
|
+
if (!res.ok) {
|
|
147
|
+
emitTelemetry({ event: 'ais.http.failure', path, httpStatus: res.status, error: `HTTP ${res.status}` });
|
|
148
|
+
throw new AisHttpError(res.status, path, data);
|
|
149
|
+
}
|
|
150
|
+
return data;
|
|
151
|
+
}
|
|
152
|
+
export async function runPassPatch(aisUrl, path, runPassFile, body, fetchImpl = globalThis.fetch) {
|
|
153
|
+
const headers = await runPassHeaders(runPassFile, true);
|
|
154
|
+
const timeoutMs = getAisRequestTimeoutMs();
|
|
155
|
+
let res;
|
|
156
|
+
try {
|
|
157
|
+
res = await fetchImpl(`${aisUrl}${path}`, {
|
|
158
|
+
method: 'PATCH',
|
|
159
|
+
headers,
|
|
160
|
+
body: JSON.stringify(body),
|
|
161
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
const wrapped = toAisRequestError(err, path, timeoutMs);
|
|
166
|
+
emitTelemetry({ event: 'ais.http.failure', path, error: wrapped instanceof Error ? wrapped.message : String(wrapped) });
|
|
167
|
+
throw wrapped;
|
|
168
|
+
}
|
|
169
|
+
const data = await readJson(res);
|
|
170
|
+
if (!res.ok) {
|
|
171
|
+
emitTelemetry({ event: 'ais.http.failure', path, httpStatus: res.status, error: `HTTP ${res.status}` });
|
|
172
|
+
throw new AisHttpError(res.status, path, data);
|
|
173
|
+
}
|
|
174
|
+
return data;
|
|
175
|
+
}
|
|
176
|
+
export const UNKNOWN_TOOL_RUN_PASS_MODE = Symbol('unknown-tool-run-pass-mode');
|
|
177
|
+
export async function dispatchToolRunPassMode(aisUrl, config, name, rawArgs, fetchImpl = globalThis.fetch) {
|
|
178
|
+
const { agentId, runPassFile } = config;
|
|
179
|
+
switch (name) {
|
|
180
|
+
case 'remember': {
|
|
181
|
+
const args = parseRememberArgs(rawArgs);
|
|
182
|
+
try {
|
|
183
|
+
return await runPassPost(aisUrl, `/v1/agents/${agentId}/memory`, runPassFile, {
|
|
184
|
+
content: args.content,
|
|
185
|
+
type: args.type,
|
|
186
|
+
importance: args.importance,
|
|
187
|
+
...(args.tags !== undefined && { tags: args.tags }),
|
|
188
|
+
}, fetchImpl);
|
|
189
|
+
}
|
|
190
|
+
catch (err) {
|
|
191
|
+
const duplicate = duplicateMemoryResult(err);
|
|
192
|
+
if (duplicate)
|
|
193
|
+
return duplicate;
|
|
194
|
+
throw err;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
case 'recall': {
|
|
198
|
+
const args = parseRecallArgs(rawArgs);
|
|
199
|
+
const params = new URLSearchParams();
|
|
200
|
+
params.set('query', args.query);
|
|
201
|
+
if (args.limit !== undefined)
|
|
202
|
+
params.set('limit', String(args.limit));
|
|
203
|
+
if (args.type !== undefined)
|
|
204
|
+
params.set('types', args.type);
|
|
205
|
+
if (args.tags !== undefined && args.tags.length > 0)
|
|
206
|
+
params.set('tags', args.tags.join(','));
|
|
207
|
+
if (args.principalAgentId !== undefined)
|
|
208
|
+
params.set('principalAgentId', args.principalAgentId);
|
|
209
|
+
return runPassGet(aisUrl, `/v1/agents/${agentId}/memory?${params}`, runPassFile, fetchImpl);
|
|
210
|
+
}
|
|
211
|
+
case 'full_context': {
|
|
212
|
+
const fcArgs = parseFullContextArgs(rawArgs);
|
|
213
|
+
const fcParams = new URLSearchParams();
|
|
214
|
+
if (fcArgs.principalAgentId !== undefined)
|
|
215
|
+
fcParams.set('principalAgentId', fcArgs.principalAgentId);
|
|
216
|
+
if (fcArgs.memoriesLimit !== undefined)
|
|
217
|
+
fcParams.set('memoriesLimit', String(fcArgs.memoriesLimit));
|
|
218
|
+
if (fcArgs.view !== undefined)
|
|
219
|
+
fcParams.set('view', fcArgs.view);
|
|
220
|
+
if (fcArgs.maxTokens !== undefined)
|
|
221
|
+
fcParams.set('maxTokens', String(fcArgs.maxTokens));
|
|
222
|
+
const fcQs = fcParams.toString();
|
|
223
|
+
return runPassGet(aisUrl, `/v1/agents/${agentId}/full-context${fcQs ? `?${fcQs}` : ''}`, runPassFile, fetchImpl);
|
|
224
|
+
}
|
|
225
|
+
case 'dream':
|
|
226
|
+
parseEmptyToolArgs(rawArgs);
|
|
227
|
+
return runPassPost(aisUrl, `/v1/agents/${agentId}/dream`, runPassFile, {}, fetchImpl);
|
|
228
|
+
case 'whoami':
|
|
229
|
+
parseEmptyToolArgs(rawArgs);
|
|
230
|
+
return fetchCredentialWhoami(agentId, 'run-pass', () => runPassGet(aisUrl, `/v1/agents/${agentId}/whoami`, runPassFile, fetchImpl), () => runPassGet(aisUrl, `/v1/agents/${agentId}/memory?limit=1`, runPassFile, fetchImpl));
|
|
231
|
+
case 'orientation_check':
|
|
232
|
+
return orient(rawArgs);
|
|
233
|
+
case 'agent_load':
|
|
234
|
+
throw new OutOfScopeToolError(name, 'Run passes are scoped to one agent for one run; start a new run pass for another agent.');
|
|
235
|
+
case 'goal_create': {
|
|
236
|
+
const args = parseGoalCreateArgs(rawArgs);
|
|
237
|
+
return runPassPost(aisUrl, `/v1/agents/${agentId}/goals`, runPassFile, {
|
|
238
|
+
title: args.title,
|
|
239
|
+
description: args.description,
|
|
240
|
+
...(args.successCriteria !== undefined ? { successCriteria: args.successCriteria } : {}),
|
|
241
|
+
...(args.parentGoalId !== undefined ? { parentGoalId: args.parentGoalId } : {}),
|
|
242
|
+
}, fetchImpl);
|
|
243
|
+
}
|
|
244
|
+
case 'goal_list': {
|
|
245
|
+
const args = parseGoalListArgs(rawArgs);
|
|
246
|
+
const params = new URLSearchParams();
|
|
247
|
+
if (args.status !== undefined)
|
|
248
|
+
params.set('status', args.status);
|
|
249
|
+
if (args.page !== undefined)
|
|
250
|
+
params.set('page', String(args.page));
|
|
251
|
+
params.set('limit', String(args.limit));
|
|
252
|
+
if (args.parentGoalId !== undefined)
|
|
253
|
+
params.set('parentGoalId', args.parentGoalId);
|
|
254
|
+
return runPassGet(aisUrl, `/v1/agents/${agentId}/goals?${params}`, runPassFile, fetchImpl);
|
|
255
|
+
}
|
|
256
|
+
case 'goal_update_progress': {
|
|
257
|
+
const args = parseGoalUpdateProgressArgs(rawArgs);
|
|
258
|
+
return runPassPatch(aisUrl, `/v1/agents/${agentId}/goals/${args.goalId}`, runPassFile, {
|
|
259
|
+
progress: args.progress,
|
|
260
|
+
}, fetchImpl);
|
|
261
|
+
}
|
|
262
|
+
case 'goal_complete': {
|
|
263
|
+
const args = parseGoalCompleteArgs(rawArgs);
|
|
264
|
+
return runPassPost(aisUrl, `/v1/agents/${agentId}/goals/${args.goalId}/complete`, runPassFile, {
|
|
265
|
+
success: args.success,
|
|
266
|
+
...(args.notes !== undefined ? { notes: args.notes } : {}),
|
|
267
|
+
...(args.lessonsLearned !== undefined ? { lessonsLearned: args.lessonsLearned } : {}),
|
|
268
|
+
}, fetchImpl);
|
|
269
|
+
}
|
|
270
|
+
case 'inbox_send': {
|
|
271
|
+
const args = parseInboxSendArgs(rawArgs);
|
|
272
|
+
return runPassPost(aisUrl, `/v1/agents/${agentId}/inbox`, runPassFile, {
|
|
273
|
+
recipientAgentId: args.recipientAgentId,
|
|
274
|
+
kind: args.kind,
|
|
275
|
+
body: args.body,
|
|
276
|
+
...(args.threadId !== undefined ? { threadId: args.threadId } : {}),
|
|
277
|
+
...(args.taskId !== undefined ? { taskId: args.taskId } : {}),
|
|
278
|
+
...(args.inReplyTo !== undefined ? { inReplyTo: args.inReplyTo } : {}),
|
|
279
|
+
...(args.messageId !== undefined ? { messageId: args.messageId } : {}),
|
|
280
|
+
...(args.ttlSeconds !== undefined ? { ttlSeconds: args.ttlSeconds } : {}),
|
|
281
|
+
}, fetchImpl);
|
|
282
|
+
}
|
|
283
|
+
case 'inbox_read': {
|
|
284
|
+
const args = parseInboxReadArgs(rawArgs);
|
|
285
|
+
const params = new URLSearchParams();
|
|
286
|
+
if (args.cursor !== undefined)
|
|
287
|
+
params.set('cursor', args.cursor);
|
|
288
|
+
params.set('limit', String(args.limit));
|
|
289
|
+
params.set('unreadOnly', String(args.unreadOnly));
|
|
290
|
+
return readInboxAndMaybeAck(args, () => runPassGet(aisUrl, `/v1/agents/${agentId}/inbox?${params}`, runPassFile, fetchImpl), (messageIds) => runPassPost(aisUrl, `/v1/agents/${agentId}/inbox/ack`, runPassFile, { messageIds }, fetchImpl));
|
|
291
|
+
}
|
|
292
|
+
case 'inbox_ack': {
|
|
293
|
+
const args = parseInboxAckArgs(rawArgs);
|
|
294
|
+
return runPassPost(aisUrl, `/v1/agents/${agentId}/inbox/ack`, runPassFile, { messageIds: args.messageIds }, fetchImpl);
|
|
295
|
+
}
|
|
296
|
+
case 'handoff': {
|
|
297
|
+
const args = parseHandoffArgs(rawArgs);
|
|
298
|
+
return runPassPost(aisUrl, `/v1/agents/${agentId}/handoff`, runPassFile, {
|
|
299
|
+
...(args.summary !== undefined ? { summary: args.summary } : {}),
|
|
300
|
+
...(args.keyLearnings !== undefined ? { keyLearnings: args.keyLearnings } : {}),
|
|
301
|
+
...(args.docPath !== undefined ? { docPath: args.docPath } : {}),
|
|
302
|
+
...(args.docPrUrl !== undefined ? { docPrUrl: args.docPrUrl } : {}),
|
|
303
|
+
}, fetchImpl);
|
|
304
|
+
}
|
|
305
|
+
case 'agent_archive':
|
|
306
|
+
case 'agent_delete':
|
|
307
|
+
throw new OutOfScopeToolError(name, AGENT_ARCHIVE_KEY_MODE_DETAIL);
|
|
308
|
+
default:
|
|
309
|
+
return UNKNOWN_TOOL_RUN_PASS_MODE;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=run-pass-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-pass-mode.js","sourceRoot":"","sources":["../src/run-pass-mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,20 @@ declare const sessionIdentitySchema: z.ZodObject<{
|
|
|
9
9
|
}, z.core.$strict>;
|
|
10
10
|
export type SessionIdentity = z.infer<typeof sessionIdentitySchema>;
|
|
11
11
|
export declare const IDENTITY_REPAIR = "Set AIS_AGENT_ID for THIS session only \u2014 export it in the shell that launches aismemory, or set it in the env block of this session's own MCP config \u2014 then restart the session and run aismemory doctor. Switch agents inside a session with agent_load. Never pin a machine, install or harness to one agent; other sessions on this machine run as other agents.";
|
|
12
|
+
export declare const RECENT_IDENTITY_CONFIRMATION_TTL_MS: number;
|
|
13
|
+
export declare const WHOAMI_RETRY_BACKOFF_MS: readonly [250, 500];
|
|
14
|
+
type Clock = () => number;
|
|
15
|
+
type Sleep = (ms: number) => Promise<void>;
|
|
16
|
+
export interface VerifyPinnedIdentityOptions {
|
|
17
|
+
/** Identifies the credential without storing the secret itself. */
|
|
18
|
+
credentialKey: string;
|
|
19
|
+
/** Switch and doctor checks must ask AIS and may not accept cached proof. */
|
|
20
|
+
freshOnly?: boolean;
|
|
21
|
+
clock?: Clock;
|
|
22
|
+
sleep?: Sleep;
|
|
23
|
+
}
|
|
24
|
+
export declare function identityCredentialFingerprint(kind: string, credential: string): string;
|
|
25
|
+
export declare function clearPinnedIdentityConfirmation(pin: SessionIdentity | null, credentialKey?: string): void;
|
|
12
26
|
/**
|
|
13
27
|
* Lists leftover per-harness manifest files from the removed machine-wide pin.
|
|
14
28
|
* They are read by nothing; doctor only reports them so a human can delete
|
|
@@ -21,6 +35,6 @@ export declare function loadSessionIdentity(env?: NodeJS.ProcessEnv): SessionIde
|
|
|
21
35
|
export declare function switchedTo(previous: SessionIdentity, agentId: string): SessionIdentity;
|
|
22
36
|
export declare function assertPinnedAgent(pin: SessionIdentity | null, agentId: string): void;
|
|
23
37
|
/** Verify the same whoami response exposed by the selected auth adapter, before every mutation. */
|
|
24
|
-
export declare function verifyPinnedIdentity(pin: SessionIdentity | null, agentId: string, whoami: () => Promise<unknown
|
|
38
|
+
export declare function verifyPinnedIdentity(pin: SessionIdentity | null, agentId: string, whoami: () => Promise<unknown>, options: VerifyPinnedIdentityOptions): Promise<void>;
|
|
25
39
|
export declare function requiresIdentityGate(name: string, args: Record<string, unknown>): boolean;
|
|
26
40
|
export {};
|
package/dist/session-identity.js
CHANGED
|
@@ -13,9 +13,12 @@
|
|
|
13
13
|
* never reads shared per-machine state.
|
|
14
14
|
*/
|
|
15
15
|
import { readdirSync } from 'node:fs';
|
|
16
|
+
import { createHash } from 'node:crypto';
|
|
16
17
|
import { homedir } from 'node:os';
|
|
17
18
|
import { join } from 'node:path';
|
|
18
19
|
import { z } from 'zod';
|
|
20
|
+
import { AisHttpError } from './ais-http-error.js';
|
|
21
|
+
import { AisRequestTimeoutError } from './request-timeout.js';
|
|
19
22
|
const sessionIdentitySchema = z.object({
|
|
20
23
|
version: z.literal(1),
|
|
21
24
|
/** How this session's identity was selected. */
|
|
@@ -25,6 +28,78 @@ const sessionIdentitySchema = z.object({
|
|
|
25
28
|
export const IDENTITY_REPAIR = 'Set AIS_AGENT_ID for THIS session only — export it in the shell that launches aismemory, or set it in the env block of this session\'s own MCP config — then restart the session and run aismemory doctor. Switch agents inside a session with agent_load. Never pin a machine, install or harness to one agent; other sessions on this machine run as other agents.';
|
|
26
29
|
/** The directory the removed per-harness manifest pin used to write to. */
|
|
27
30
|
const LEGACY_HARNESS_DIR = ['.aismemory', 'harnesses'];
|
|
31
|
+
export const RECENT_IDENTITY_CONFIRMATION_TTL_MS = 5 * 60 * 1000;
|
|
32
|
+
export const WHOAMI_RETRY_BACKOFF_MS = [250, 500];
|
|
33
|
+
const confirmations = new Map();
|
|
34
|
+
const defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
35
|
+
function confirmationKey(agentId, credentialKey) {
|
|
36
|
+
return `${agentId}\n${credentialKey}`;
|
|
37
|
+
}
|
|
38
|
+
function clearConfirmationsForAgent(agentId) {
|
|
39
|
+
for (const key of Array.from(confirmations.keys())) {
|
|
40
|
+
if (key.startsWith(`${agentId}\n`))
|
|
41
|
+
confirmations.delete(key);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function rememberConfirmation(agentId, credentialKey, confirmedAtMs) {
|
|
45
|
+
confirmations.set(confirmationKey(agentId, credentialKey), { confirmedAtMs });
|
|
46
|
+
}
|
|
47
|
+
function hasRecentConfirmation(agentId, credentialKey, nowMs) {
|
|
48
|
+
const confirmation = confirmations.get(confirmationKey(agentId, credentialKey));
|
|
49
|
+
if (confirmation === undefined)
|
|
50
|
+
return false;
|
|
51
|
+
const ageMs = nowMs - confirmation.confirmedAtMs;
|
|
52
|
+
return ageMs >= 0 && ageMs < RECENT_IDENTITY_CONFIRMATION_TTL_MS;
|
|
53
|
+
}
|
|
54
|
+
const NETWORK_ERROR_CODES = new Set([
|
|
55
|
+
'ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'EAI_AGAIN', 'ETIMEDOUT', 'EPIPE',
|
|
56
|
+
'UND_ERR_CONNECT_TIMEOUT', 'UND_ERR_HEADERS_TIMEOUT', 'UND_ERR_BODY_TIMEOUT',
|
|
57
|
+
'UND_ERR_SOCKET', 'UND_ERR_CLOSED', 'UND_ERR_DESTROYED',
|
|
58
|
+
]);
|
|
59
|
+
function hasNetworkErrorCode(error) {
|
|
60
|
+
if (!(error instanceof Error))
|
|
61
|
+
return false;
|
|
62
|
+
const code = error.code;
|
|
63
|
+
return typeof code === 'string' && NETWORK_ERROR_CODES.has(code);
|
|
64
|
+
}
|
|
65
|
+
function isFetchNetworkError(error) {
|
|
66
|
+
if (!(error instanceof TypeError))
|
|
67
|
+
return false;
|
|
68
|
+
const cause = error.cause;
|
|
69
|
+
// AggregateError extends Error, so test it before the generic cause check.
|
|
70
|
+
if (cause instanceof AggregateError) {
|
|
71
|
+
return hasNetworkErrorCode(cause) || cause.errors.some(hasNetworkErrorCode);
|
|
72
|
+
}
|
|
73
|
+
return hasNetworkErrorCode(cause);
|
|
74
|
+
}
|
|
75
|
+
function isWhoamiUnavailable(error) {
|
|
76
|
+
if (error instanceof AisHttpError) {
|
|
77
|
+
return error.status === 429 || error.status >= 500;
|
|
78
|
+
}
|
|
79
|
+
if (error instanceof AisRequestTimeoutError)
|
|
80
|
+
return true;
|
|
81
|
+
return isFetchNetworkError(error);
|
|
82
|
+
}
|
|
83
|
+
function parseConfirmedAgentId(result) {
|
|
84
|
+
const parsed = z.object({ success: z.literal(true), data: z.object({
|
|
85
|
+
id: z.string().optional(), agentId: z.string().optional(),
|
|
86
|
+
}) }).safeParse(result);
|
|
87
|
+
if (!parsed.success)
|
|
88
|
+
return null;
|
|
89
|
+
return parsed.data.data.id ?? parsed.data.data.agentId ?? null;
|
|
90
|
+
}
|
|
91
|
+
export function identityCredentialFingerprint(kind, credential) {
|
|
92
|
+
return `${kind}:${createHash('sha256').update(credential).digest('hex')}`;
|
|
93
|
+
}
|
|
94
|
+
export function clearPinnedIdentityConfirmation(pin, credentialKey) {
|
|
95
|
+
if (!pin)
|
|
96
|
+
return;
|
|
97
|
+
if (credentialKey === undefined) {
|
|
98
|
+
clearConfirmationsForAgent(pin.agentId);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
confirmations.delete(confirmationKey(pin.agentId, credentialKey));
|
|
102
|
+
}
|
|
28
103
|
/**
|
|
29
104
|
* Lists leftover per-harness manifest files from the removed machine-wide pin.
|
|
30
105
|
* They are read by nothing; doctor only reports them so a human can delete
|
|
@@ -60,25 +135,42 @@ export function assertPinnedAgent(pin, agentId) {
|
|
|
60
135
|
if (!pin)
|
|
61
136
|
return;
|
|
62
137
|
if (pin.agentId !== agentId) {
|
|
138
|
+
clearConfirmationsForAgent(pin.agentId);
|
|
63
139
|
throw new Error(`Identity gate: expected ${pin.agentId}, received ${agentId}. Writes stopped. ${IDENTITY_REPAIR}`);
|
|
64
140
|
}
|
|
65
141
|
}
|
|
66
142
|
/** Verify the same whoami response exposed by the selected auth adapter, before every mutation. */
|
|
67
|
-
export async function verifyPinnedIdentity(pin, agentId, whoami) {
|
|
143
|
+
export async function verifyPinnedIdentity(pin, agentId, whoami, options) {
|
|
68
144
|
if (!pin)
|
|
69
145
|
return;
|
|
70
146
|
assertPinnedAgent(pin, agentId);
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
147
|
+
const credentialKey = options.credentialKey;
|
|
148
|
+
const clock = options.clock ?? Date.now;
|
|
149
|
+
const sleep = options.sleep ?? defaultSleep;
|
|
150
|
+
for (let attempt = 0; attempt <= WHOAMI_RETRY_BACKOFF_MS.length; attempt += 1) {
|
|
151
|
+
let result;
|
|
152
|
+
try {
|
|
153
|
+
result = await whoami();
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
if (!isWhoamiUnavailable(error)) {
|
|
157
|
+
clearConfirmationsForAgent(pin.agentId);
|
|
158
|
+
throw new Error(`Identity gate: whoami did not confirm ${agentId}. Writes stopped. ${IDENTITY_REPAIR}`);
|
|
159
|
+
}
|
|
160
|
+
const backoffMs = WHOAMI_RETRY_BACKOFF_MS[attempt];
|
|
161
|
+
if (backoffMs !== undefined) {
|
|
162
|
+
await sleep(backoffMs);
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (!options.freshOnly && hasRecentConfirmation(agentId, credentialKey, clock()))
|
|
166
|
+
return;
|
|
167
|
+
throw new Error(`Identity gate: whoami unavailable for ${agentId}. Writes stopped. ${IDENTITY_REPAIR}`);
|
|
168
|
+
}
|
|
169
|
+
if (parseConfirmedAgentId(result) === agentId) {
|
|
170
|
+
rememberConfirmation(agentId, credentialKey, clock());
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
clearConfirmationsForAgent(pin.agentId);
|
|
82
174
|
throw new Error(`Identity gate: whoami did not confirm ${agentId}. Writes stopped. ${IDENTITY_REPAIR}`);
|
|
83
175
|
}
|
|
84
176
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-identity.js","sourceRoot":"","sources":["../src/session-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"session-identity.js","sourceRoot":"","sources":["../src/session-identity.ts"],"names":[],"mappings":"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"}
|
package/dist/telemetry.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type TelemetryEventName = 'auth.device_flow.start' | 'auth.key.success' | 'auth.key.fallback' | 'auth.key.autoenroll' | 'auth.renew.success' | 'auth.renew.retry' | 'auth.renew.hard_expiry' | 'tool.call' | 'ais.http.failure' | 'ais.http.retry';
|
|
1
|
+
export type TelemetryEventName = 'auth.device_flow.start' | 'auth.device_flow.resume' | 'auth.key.success' | 'auth.key.fallback' | 'auth.key.autoenroll' | 'auth.renew.success' | 'auth.renew.retry' | 'auth.renew.hard_expiry' | 'tool.call' | 'ais.http.failure' | 'ais.http.retry';
|
|
2
2
|
export interface TelemetryEvent {
|
|
3
3
|
event: TelemetryEventName;
|
|
4
4
|
ts: string;
|
package/dist/telemetry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA+BzC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAEnD,gEAAgE;AAChE,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrE,OAAO,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,aAAa,CAAC,KAAmD;IAC/E,IAAI,CAAC,kBAAkB,EAAE;QAAE,OAAO;IAClC,MAAM,OAAO,GAAmB;QAC9B,GAAG,KAAK;QACR,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACzC,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC"}
|
package/dist/tool-args.d.ts
CHANGED
|
@@ -46,7 +46,16 @@ export declare const agentLoadArgsSchema: z.ZodObject<{
|
|
|
46
46
|
}, z.core.$strip>;
|
|
47
47
|
/** Tools with no parameters — reject unexpected keys. */
|
|
48
48
|
export declare const emptyArgsSchema: z.ZodObject<{}, z.core.$strict>;
|
|
49
|
-
/**
|
|
49
|
+
/**
|
|
50
|
+
* full_context: optional delegated-read principal + configurable memory limit (CORBOT-45FE6ECE).
|
|
51
|
+
*
|
|
52
|
+
* `maxTokens` mirrors the server's own bounds — MIN_MAX_TOKENS/MAX_MAX_TOKENS in
|
|
53
|
+
* packages/agent-identity-service/src/api/routes/full-context.ts. This package ships
|
|
54
|
+
* standalone to npm and cannot import from agent-identity-service, so the range is
|
|
55
|
+
* duplicated here on purpose; keep it in sync by hand if the server side changes.
|
|
56
|
+
*/
|
|
57
|
+
export declare const FULL_CONTEXT_MIN_MAX_TOKENS = 500;
|
|
58
|
+
export declare const FULL_CONTEXT_MAX_MAX_TOKENS = 20000;
|
|
50
59
|
export declare const fullContextArgsSchema: z.ZodObject<{
|
|
51
60
|
principalAgentId: z.ZodOptional<z.ZodString>;
|
|
52
61
|
memoriesLimit: z.ZodOptional<z.ZodNumber>;
|
|
@@ -55,6 +64,7 @@ export declare const fullContextArgsSchema: z.ZodObject<{
|
|
|
55
64
|
lean: "lean";
|
|
56
65
|
bootstrap: "bootstrap";
|
|
57
66
|
}>>;
|
|
67
|
+
maxTokens: z.ZodOptional<z.ZodNumber>;
|
|
58
68
|
}, z.core.$strict>;
|
|
59
69
|
export declare const INBOX_MAX_BODY_CHARS = 8000;
|
|
60
70
|
export declare const INBOX_MAX_TASK_ID_CHARS = 128;
|
package/dist/tool-args.js
CHANGED
|
@@ -73,13 +73,29 @@ export const agentLoadArgsSchema = z.object({
|
|
|
73
73
|
});
|
|
74
74
|
/** Tools with no parameters — reject unexpected keys. */
|
|
75
75
|
export const emptyArgsSchema = z.object({}).strict();
|
|
76
|
-
/**
|
|
76
|
+
/**
|
|
77
|
+
* full_context: optional delegated-read principal + configurable memory limit (CORBOT-45FE6ECE).
|
|
78
|
+
*
|
|
79
|
+
* `maxTokens` mirrors the server's own bounds — MIN_MAX_TOKENS/MAX_MAX_TOKENS in
|
|
80
|
+
* packages/agent-identity-service/src/api/routes/full-context.ts. This package ships
|
|
81
|
+
* standalone to npm and cannot import from agent-identity-service, so the range is
|
|
82
|
+
* duplicated here on purpose; keep it in sync by hand if the server side changes.
|
|
83
|
+
*/
|
|
84
|
+
export const FULL_CONTEXT_MIN_MAX_TOKENS = 500;
|
|
85
|
+
export const FULL_CONTEXT_MAX_MAX_TOKENS = 20_000;
|
|
77
86
|
export const fullContextArgsSchema = z
|
|
78
87
|
.object({
|
|
79
88
|
principalAgentId: principalAgentIdSchema.optional(),
|
|
80
89
|
memoriesLimit: z.number().int().min(1).max(50).optional(),
|
|
81
90
|
/** View mode: full (default), lean (bounded), bootstrap (cross-harness session start). */
|
|
82
91
|
view: z.enum(['full', 'lean', 'bootstrap']).optional(),
|
|
92
|
+
/** Token ceiling for the bounded views (lean, bootstrap). */
|
|
93
|
+
maxTokens: z
|
|
94
|
+
.number()
|
|
95
|
+
.int()
|
|
96
|
+
.min(FULL_CONTEXT_MIN_MAX_TOKENS)
|
|
97
|
+
.max(FULL_CONTEXT_MAX_MAX_TOKENS)
|
|
98
|
+
.optional(),
|
|
83
99
|
})
|
|
84
100
|
.strict();
|
|
85
101
|
// ── Agent inbox (CORBOT-7115B8AE) ───────────────────────────────────────
|