aismemory 0.7.1 → 0.7.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 +121 -2
- package/dist/__tests__/agent-key-mode-e2e.test.js +78 -0
- package/dist/__tests__/agent-key-mode-e2e.test.js.map +1 -1
- package/dist/__tests__/agent-key-mode.test.js +123 -0
- package/dist/__tests__/agent-key-mode.test.js.map +1 -1
- package/dist/__tests__/agent-load-persistence.test.js +25 -2
- package/dist/__tests__/agent-load-persistence.test.js.map +1 -1
- package/dist/__tests__/agent-preference.test.js +8 -0
- package/dist/__tests__/agent-preference.test.js.map +1 -1
- package/dist/__tests__/agentmemory.test.d.ts +1 -0
- package/dist/__tests__/agentmemory.test.js +73 -0
- package/dist/__tests__/agentmemory.test.js.map +1 -0
- package/dist/__tests__/ais-http.test.d.ts +1 -0
- package/dist/__tests__/ais-http.test.js +139 -0
- package/dist/__tests__/ais-http.test.js.map +1 -0
- package/dist/__tests__/auto-enroll-key.test.js +28 -4
- package/dist/__tests__/auto-enroll-key.test.js.map +1 -1
- package/dist/__tests__/beacon-contract.test.d.ts +1 -0
- package/dist/__tests__/beacon-contract.test.js +106 -0
- package/dist/__tests__/beacon-contract.test.js.map +1 -0
- package/dist/__tests__/credential-isolation.test.d.ts +1 -0
- package/dist/__tests__/credential-isolation.test.js +61 -0
- package/dist/__tests__/credential-isolation.test.js.map +1 -0
- package/dist/__tests__/credential-resolution.test.d.ts +1 -0
- package/dist/__tests__/credential-resolution.test.js +141 -0
- package/dist/__tests__/credential-resolution.test.js.map +1 -0
- package/dist/__tests__/delegated-read-args.test.d.ts +9 -0
- package/dist/__tests__/delegated-read-args.test.js +80 -0
- package/dist/__tests__/delegated-read-args.test.js.map +1 -0
- package/dist/__tests__/doctor.test.js +250 -9
- package/dist/__tests__/doctor.test.js.map +1 -1
- package/dist/__tests__/ender-receipt-auth.test.d.ts +1 -0
- package/dist/__tests__/ender-receipt-auth.test.js +26 -0
- package/dist/__tests__/ender-receipt-auth.test.js.map +1 -0
- package/dist/__tests__/fixtures/beacon-contract.d.ts +66 -0
- package/dist/__tests__/fixtures/beacon-contract.js +72 -0
- package/dist/__tests__/fixtures/beacon-contract.js.map +1 -0
- package/dist/__tests__/inbox-client.test.d.ts +1 -0
- package/dist/__tests__/inbox-client.test.js +108 -0
- package/dist/__tests__/inbox-client.test.js.map +1 -0
- package/dist/__tests__/key-auth.test.js +7 -1
- package/dist/__tests__/key-auth.test.js.map +1 -1
- package/dist/__tests__/list-all-agents.test.js +2 -0
- package/dist/__tests__/list-all-agents.test.js.map +1 -1
- package/dist/__tests__/lost-agent.test.d.ts +1 -0
- package/dist/__tests__/lost-agent.test.js +108 -0
- package/dist/__tests__/lost-agent.test.js.map +1 -0
- package/dist/__tests__/memory-write-failure.test.js +5 -1
- package/dist/__tests__/memory-write-failure.test.js.map +1 -1
- package/dist/__tests__/no-registered-keys-disk-bearer-fallback.test.d.ts +1 -0
- package/dist/__tests__/no-registered-keys-disk-bearer-fallback.test.js +207 -0
- package/dist/__tests__/no-registered-keys-disk-bearer-fallback.test.js.map +1 -0
- package/dist/__tests__/provisional-register-mcp-remember.test.d.ts +1 -0
- package/dist/__tests__/provisional-register-mcp-remember.test.js +196 -0
- package/dist/__tests__/provisional-register-mcp-remember.test.js.map +1 -0
- package/dist/__tests__/readme-tools-parity.test.d.ts +1 -0
- package/dist/__tests__/readme-tools-parity.test.js +64 -0
- package/dist/__tests__/readme-tools-parity.test.js.map +1 -0
- package/dist/__tests__/reconnect-survival-e2e.test.js +63 -1
- package/dist/__tests__/reconnect-survival-e2e.test.js.map +1 -1
- package/dist/__tests__/token-manager.test.js +20 -1
- package/dist/__tests__/token-manager.test.js.map +1 -1
- package/dist/__tests__/tool-args.test.js +196 -1
- package/dist/__tests__/tool-args.test.js.map +1 -1
- package/dist/__tests__/workspace-key-mode.test.d.ts +1 -0
- package/dist/__tests__/workspace-key-mode.test.js +264 -0
- package/dist/__tests__/workspace-key-mode.test.js.map +1 -0
- package/dist/agent-key-mode.d.ts +4 -2
- package/dist/agent-key-mode.js +106 -11
- package/dist/agent-key-mode.js.map +1 -1
- package/dist/ais-http.d.ts +7 -0
- package/dist/ais-http.js +137 -0
- package/dist/ais-http.js.map +1 -0
- package/dist/auth-staleness.d.ts +2 -0
- package/dist/auth-staleness.js +5 -0
- package/dist/auth-staleness.js.map +1 -1
- package/dist/auto-handoff.d.ts +1 -1
- package/dist/auto-handoff.js +5 -3
- package/dist/auto-handoff.js.map +1 -1
- package/dist/cli/doctor.d.ts +4 -0
- package/dist/cli/doctor.js +120 -8
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/enable-key-auth.js +4 -5
- package/dist/cli/enable-key-auth.js.map +1 -1
- package/dist/cli/orientation.d.ts +15 -0
- package/dist/cli/orientation.js +89 -0
- package/dist/cli/orientation.js.map +1 -0
- package/dist/harness-identity.d.ts +17 -0
- package/dist/harness-identity.js +105 -0
- package/dist/harness-identity.js.map +1 -0
- package/dist/hydration.d.ts +1 -1
- package/dist/hydration.js +3 -2
- package/dist/hydration.js.map +1 -1
- package/dist/inbox-client.d.ts +9 -0
- package/dist/inbox-client.js +74 -0
- package/dist/inbox-client.js.map +1 -0
- package/dist/index.js +498 -109
- package/dist/index.js.map +1 -1
- package/dist/key-auth.js +16 -10
- package/dist/key-auth.js.map +1 -1
- package/dist/oauth-credentials.d.ts +11 -0
- package/dist/oauth-credentials.js +31 -3
- package/dist/oauth-credentials.js.map +1 -1
- package/dist/token-manager.d.ts +6 -0
- package/dist/token-manager.js +16 -0
- package/dist/token-manager.js.map +1 -1
- package/dist/tool-args.d.ts +98 -0
- package/dist/tool-args.js +155 -0
- package/dist/tool-args.js.map +1 -1
- package/dist/workspace-key-mode.d.ts +40 -0
- package/dist/workspace-key-mode.js +258 -0
- package/dist/workspace-key-mode.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const host = z.enum(['local-mac', 'cloud-vm', 'local-other']);
|
|
3
|
+
const account = z.enum(['owner-account', 'fleet-account']);
|
|
4
|
+
const channel = z.enum(['ais', 'mcp', 'inbox']);
|
|
5
|
+
const evidence = z.enum(['pass', 'missing', 'unknown']);
|
|
6
|
+
const marker = z.string().regex(/^[a-zA-Z0-9-]{1,64}$/);
|
|
7
|
+
const activationDoor = 'https://agentsandswarms.ai/activate';
|
|
8
|
+
const inputSchema = z.object({
|
|
9
|
+
version: z.literal(1),
|
|
10
|
+
identity: z.string().uuid(),
|
|
11
|
+
requirements: z.object({
|
|
12
|
+
host,
|
|
13
|
+
account,
|
|
14
|
+
channels: z.array(channel).min(1).max(3).refine((values) => new Set(values).size === values.length),
|
|
15
|
+
}).strict(),
|
|
16
|
+
current: z.object({ host: host.or(z.literal('unknown')), account: account.or(z.literal('unknown')), session: marker }).strict(),
|
|
17
|
+
evidence: z.object({
|
|
18
|
+
session: marker,
|
|
19
|
+
host: host.or(z.literal('unknown')),
|
|
20
|
+
account: account.or(z.literal('unknown')),
|
|
21
|
+
credentials: evidence,
|
|
22
|
+
credentialSource: z.enum(['ais-bond', 'ais-oauth', 'ais-agent-key', 'none']),
|
|
23
|
+
channels: z.object({ ais: evidence, mcp: evidence, inbox: evidence }).strict(),
|
|
24
|
+
}).strict(),
|
|
25
|
+
relocation: z.object({
|
|
26
|
+
verified: z.boolean(),
|
|
27
|
+
observedAction: z.string().min(1).max(160).regex(/^[a-zA-Z0-9 .,():/-]+$/).optional(),
|
|
28
|
+
}).strict(),
|
|
29
|
+
activationUrl: z.string().max(160).optional(),
|
|
30
|
+
}).strict();
|
|
31
|
+
/** Accept only the canonical AIS device-flow URL; never relay an arbitrary link. */
|
|
32
|
+
function bondDoor(value) {
|
|
33
|
+
if (value === undefined || value === activationDoor)
|
|
34
|
+
return activationDoor;
|
|
35
|
+
if (!/^https:\/\/agentsandswarms\.ai\/activate\?user_code=[A-Z0-9]{4}-[A-Z0-9]{4}$/.test(value)) {
|
|
36
|
+
throw new Error('Invalid AIS activation URL. Use the AIS OAuth device-flow activation door.');
|
|
37
|
+
}
|
|
38
|
+
return value;
|
|
39
|
+
}
|
|
40
|
+
/** Pure read-only evaluation: no network, credential loading, relocation or delivery. */
|
|
41
|
+
export function orient(input) {
|
|
42
|
+
const parsed = inputSchema.safeParse(input);
|
|
43
|
+
if (!parsed.success)
|
|
44
|
+
throw new Error('Invalid public orientation input. Follow the packaged README schema; include no secrets.');
|
|
45
|
+
const data = parsed.data;
|
|
46
|
+
const bondUrl = bondDoor(data.activationUrl);
|
|
47
|
+
const fresh = data.current.session === data.evidence.session
|
|
48
|
+
&& data.current.host === data.evidence.host && data.current.account === data.evidence.account;
|
|
49
|
+
const atHome = data.current.host === data.requirements.host && data.current.account === data.requirements.account;
|
|
50
|
+
const checks = [
|
|
51
|
+
{
|
|
52
|
+
step: 'Know home', status: atHome ? 'PASS' : 'FAIL',
|
|
53
|
+
message: atHome ? 'Host and account match this manifest.'
|
|
54
|
+
: `Wrong machine or account for this manifest: requires ${data.requirements.host}/${data.requirements.account}; observed ${data.current.host}/${data.current.account}. This is a requirement mismatch, not a runtime verdict.`,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
step: 'Re-bootstrap on arrival', status: fresh ? 'PASS' : 'FAIL',
|
|
58
|
+
message: fresh ? 'Evidence reports the current host/account/process session.'
|
|
59
|
+
: 'Previous bootstrap evidence is stale. Reprove identity, tools, channels, ownership and live state in this session before claims or dispatch.',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
step: 'AIS human bonding',
|
|
63
|
+
status: fresh && data.evidence.credentials === 'pass' && data.evidence.credentialSource !== 'none' ? 'PASS' : 'FAIL',
|
|
64
|
+
message: fresh && data.evidence.credentials === 'pass' && data.evidence.credentialSource !== 'none'
|
|
65
|
+
? 'Reported AIS credential acceptance for this session.'
|
|
66
|
+
: 'Human: obtain the device code/URL through an aismemory MCP tool and complete AIS activation, or use your AIS-issued agent key. Never retrieve AIS credentials from Railway or infrastructure consoles.',
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
for (const required of data.requirements.channels) {
|
|
70
|
+
checks.push({
|
|
71
|
+
step: `Channel: ${required}`, status: fresh && data.evidence.channels[required] === 'pass' ? 'PASS' : 'FAIL',
|
|
72
|
+
message: fresh ? `Reported ${required}: ${data.evidence.channels[required]}.` : `Recheck ${required} in the current session.`,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
if (!atHome) {
|
|
76
|
+
checks.push({
|
|
77
|
+
step: 'Know the way back', status: data.relocation.verified && data.relocation.observedAction ? 'PASS' : 'FAIL',
|
|
78
|
+
message: data.relocation.verified && data.relocation.observedAction
|
|
79
|
+
? `Human: ${data.relocation.observedAction}. After moving, use a new session marker and recollect all evidence.`
|
|
80
|
+
: 'Stop: relocation capability is unverified. Ask the human to inspect the harness; do not invent a button or copy credentials.',
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
scope: 'public-orientation', runtimeEvidence: 'unverified', checks, bondUrl,
|
|
85
|
+
beacon: 'unknown-signing-capability',
|
|
86
|
+
exitCode: checks.some((check) => check.status === 'FAIL') ? 1 : 0,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=orientation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orientation.js","sourceRoot":"","sources":["../../src/cli/orientation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
declare const manifestSchema: z.ZodObject<{
|
|
3
|
+
version: z.ZodLiteral<1>;
|
|
4
|
+
harness: z.ZodString;
|
|
5
|
+
agentId: z.ZodString;
|
|
6
|
+
}, z.core.$strict>;
|
|
7
|
+
export type HarnessIdentity = z.infer<typeof manifestSchema>;
|
|
8
|
+
export declare const IDENTITY_REPAIR = "Create a JSON manifest {\"version\":1,\"harness\":\"<harness>\",\"agentId\":\"<intended-agent-id>\"}; run aismemory install --manifest <file>; launch this harness with aismemory --harness <harness>, restart it, then run aismemory doctor --harness <harness>.";
|
|
9
|
+
export declare function optionValue(argv: string[], option: string): string | undefined;
|
|
10
|
+
/** Installs only non-secret identity metadata; never edits a harness env or credentials. */
|
|
11
|
+
export declare function installHarnessIdentity(source: string, home?: string): HarnessIdentity;
|
|
12
|
+
export declare function loadHarnessIdentity(argv?: string[], env?: NodeJS.ProcessEnv, home?: string): HarnessIdentity | null;
|
|
13
|
+
export declare function assertPinnedAgent(pin: HarnessIdentity | null, agentId: string): void;
|
|
14
|
+
/** Verify the same whoami response exposed by the selected auth adapter, before every mutation. */
|
|
15
|
+
export declare function verifyPinnedIdentity(pin: HarnessIdentity | null, agentId: string, whoami: () => Promise<unknown>): Promise<void>;
|
|
16
|
+
export declare function requiresIdentityGate(name: string, args: Record<string, unknown>): boolean;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install one non-secret {version: 1, harness, agentId} manifest per harness:
|
|
3
|
+
* aismemory install --manifest <file>, then launch aismemory --harness <name>.
|
|
4
|
+
* Installation refuses to replace an existing pin. To change it deliberately,
|
|
5
|
+
* stop the harness, preserve/remove its manifest, install the replacement, and
|
|
6
|
+
* restart. Undo by restoring the preserved manifest before restarting.
|
|
7
|
+
* Neither installer nor doctor edits live harness configuration or credentials.
|
|
8
|
+
* A CLI doctor PASS verifies its own credential context, not a desktop restart.
|
|
9
|
+
*/
|
|
10
|
+
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
11
|
+
import { homedir } from 'node:os';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
const manifestSchema = z.object({
|
|
15
|
+
version: z.literal(1),
|
|
16
|
+
harness: z.string().regex(/^[a-z][a-z0-9-]{0,63}$/),
|
|
17
|
+
agentId: z.string().regex(/^[a-zA-Z0-9][a-zA-Z0-9-]{0,127}$/),
|
|
18
|
+
}).strict();
|
|
19
|
+
export const IDENTITY_REPAIR = 'Create a JSON manifest {"version":1,"harness":"<harness>","agentId":"<intended-agent-id>"}; run aismemory install --manifest <file>; launch this harness with aismemory --harness <harness>, restart it, then run aismemory doctor --harness <harness>.';
|
|
20
|
+
export function optionValue(argv, option) {
|
|
21
|
+
const index = argv.indexOf(option);
|
|
22
|
+
if (index === -1)
|
|
23
|
+
return undefined;
|
|
24
|
+
const value = argv[index + 1];
|
|
25
|
+
if (!value || value.startsWith('--'))
|
|
26
|
+
throw new Error(`Missing value for ${option}. ${IDENTITY_REPAIR}`);
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
function manifestPath(harness, home) {
|
|
30
|
+
const name = manifestSchema.shape.harness.parse(harness);
|
|
31
|
+
return join(home, '.aismemory', 'harnesses', `${name}.json`);
|
|
32
|
+
}
|
|
33
|
+
/** Installs only non-secret identity metadata; never edits a harness env or credentials. */
|
|
34
|
+
export function installHarnessIdentity(source, home = homedir()) {
|
|
35
|
+
const identity = manifestSchema.parse(JSON.parse(readFileSync(source, 'utf8')));
|
|
36
|
+
const path = manifestPath(identity.harness, home);
|
|
37
|
+
mkdirSync(join(home, '.aismemory', 'harnesses'), { recursive: true, mode: 0o700 });
|
|
38
|
+
// An existing pin must be deliberately removed before it can be replaced.
|
|
39
|
+
writeFileSync(path, `${JSON.stringify(identity, null, 2)}\n`, { flag: 'wx', mode: 0o600 });
|
|
40
|
+
return identity;
|
|
41
|
+
}
|
|
42
|
+
export function loadHarnessIdentity(argv = process.argv.slice(2), env = process.env, home = homedir()) {
|
|
43
|
+
const harness = optionValue(argv, '--harness');
|
|
44
|
+
if (harness) {
|
|
45
|
+
try {
|
|
46
|
+
const pin = manifestSchema.parse(JSON.parse(readFileSync(manifestPath(harness, home), 'utf8')));
|
|
47
|
+
if (pin.harness !== harness)
|
|
48
|
+
throw new Error('Harness name mismatch');
|
|
49
|
+
const envAgentId = env['AIS_AGENT_ID']?.trim();
|
|
50
|
+
if (envAgentId !== undefined && envAgentId !== '' && envAgentId !== pin.agentId) {
|
|
51
|
+
throw new Error('AIS_AGENT_ID conflicts with the installed harness pin');
|
|
52
|
+
}
|
|
53
|
+
return pin;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
throw new Error(`Identity gate: invalid, missing, or conflicting pin for ${harness}. ${IDENTITY_REPAIR}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Trim before validating: secret injection (a sourced .env file, a CI secret,
|
|
60
|
+
// a Kubernetes secret mount) commonly appends a trailing newline. This runs
|
|
61
|
+
// BEFORE main()'s agent-API-key check, so an untrimmed value failed the
|
|
62
|
+
// agentId regex here and killed the process with a raw schema error — agent
|
|
63
|
+
// API key mode could never engage even though its own loader trims for
|
|
64
|
+
// exactly this reason (CORBOT-D8D35CF0).
|
|
65
|
+
const agentId = env['AIS_AGENT_ID']?.trim();
|
|
66
|
+
if (agentId === undefined || agentId === '')
|
|
67
|
+
return null;
|
|
68
|
+
return manifestSchema.parse({ version: 1, harness: 'env-pin', agentId });
|
|
69
|
+
}
|
|
70
|
+
function repairFor(pin) {
|
|
71
|
+
if (!pin || pin.harness === 'env-pin')
|
|
72
|
+
return IDENTITY_REPAIR;
|
|
73
|
+
return `Restart this harness with aismemory --harness ${pin.harness}; run aismemory doctor --harness ${pin.harness} and confirm whoami is ${pin.agentId}. Restore that harness manifest if incorrect; never change the shared credential default to repair attribution.`;
|
|
74
|
+
}
|
|
75
|
+
export function assertPinnedAgent(pin, agentId) {
|
|
76
|
+
if (!pin)
|
|
77
|
+
return;
|
|
78
|
+
if (pin.agentId !== agentId) {
|
|
79
|
+
throw new Error(`Identity gate: expected ${pin.agentId}, received ${agentId}. Writes stopped. ${repairFor(pin)}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/** Verify the same whoami response exposed by the selected auth adapter, before every mutation. */
|
|
83
|
+
export async function verifyPinnedIdentity(pin, agentId, whoami) {
|
|
84
|
+
if (!pin)
|
|
85
|
+
return;
|
|
86
|
+
assertPinnedAgent(pin, agentId);
|
|
87
|
+
let result;
|
|
88
|
+
try {
|
|
89
|
+
result = await whoami();
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
throw new Error(`Identity gate: whoami unavailable for ${agentId}. Writes stopped. ${repairFor(pin)}`);
|
|
93
|
+
}
|
|
94
|
+
const parsed = z.object({ success: z.literal(true), data: z.object({
|
|
95
|
+
id: z.string().optional(), agentId: z.string().optional(),
|
|
96
|
+
}) }).safeParse(result);
|
|
97
|
+
if (!parsed.success || (parsed.data.data.id ?? parsed.data.data.agentId) !== agentId) {
|
|
98
|
+
throw new Error(`Identity gate: whoami did not confirm ${agentId}. Writes stopped. ${repairFor(pin)}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export function requiresIdentityGate(name, args) {
|
|
102
|
+
return ['remember', 'handoff', 'dream', 'inbox_send'].includes(name) ||
|
|
103
|
+
(name === 'inbox_read' && args['ack'] === true);
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=harness-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness-identity.js","sourceRoot":"","sources":["../src/harness-identity.ts"],"names":[],"mappings":"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"}
|
package/dist/hydration.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import type { AgentContext } from './types.js';
|
|
2
|
-
export declare function hydrateIdentity(aisUrl: string, agentId: string, token: string): Promise<AgentContext | null>;
|
|
2
|
+
export declare function hydrateIdentity(aisUrl: string, agentId: string, token: string, memoriesLimit?: number): Promise<AgentContext | null>;
|
package/dist/hydration.js
CHANGED
|
@@ -24,9 +24,10 @@ function logHydrationFailure(kind, details) {
|
|
|
24
24
|
const line = `${LOG_PREFIX} hydrateIdentity failed (${kind}, ${retryLabel})${statusPart}: ${redactHydrationMessage(details.message)}\n`;
|
|
25
25
|
process.stderr.write(line);
|
|
26
26
|
}
|
|
27
|
-
export async function hydrateIdentity(aisUrl, agentId, token) {
|
|
27
|
+
export async function hydrateIdentity(aisUrl, agentId, token, memoriesLimit) {
|
|
28
28
|
try {
|
|
29
|
-
const
|
|
29
|
+
const query = memoriesLimit === undefined ? '' : `?memoriesLimit=${memoriesLimit}`;
|
|
30
|
+
const res = await fetch(`${aisUrl}/v1/agents/${agentId}/full-context${query}`, {
|
|
30
31
|
headers: { Authorization: `Bearer ${token}` },
|
|
31
32
|
});
|
|
32
33
|
if (!res.ok) {
|
package/dist/hydration.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hydration.js","sourceRoot":"","sources":["../src/hydration.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG,aAAa,CAAC;AAIjC,SAAS,sBAAsB,CAAC,OAAe;IAC7C,OAAO,OAAO;SACX,OAAO,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;SAC9C,OAAO,CAAC,wBAAwB,EAAE,2BAA2B,CAAC;SAC9D,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAc;IAC3C,OAAO,MAAM,IAAI,GAAG,IAAI,MAAM,KAAK,GAAG,CAAC;AACzC,CAAC;AAED,SAAS,yBAAyB,CAAC,GAAY;IAC7C,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IACtC,OAAO,CACL,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;QACvB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;QACrB,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;QACvB,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC5B,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAC1B,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,IAA0B,EAC1B,OAAiE;IAEjE,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC;IACjE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,MAAM,IAAI,GAAG,GAAG,UAAU,4BAA4B,IAAI,KAAK,UAAU,IAAI,UAAU,KAAK,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;IACxI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,OAAe,EACf,KAAa;
|
|
1
|
+
{"version":3,"file":"hydration.js","sourceRoot":"","sources":["../src/hydration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { InboxReadArgs } from './tool-args.js';
|
|
2
|
+
/**
|
|
3
|
+
* Reads one inbox page via `getPage`, then acks the returned messageIds via
|
|
4
|
+
* `ackMessages` when `args.ack` is set. Both callbacks return AIS's raw
|
|
5
|
+
* response body (as `aisGet`/`aisPost`/`aisKeyGet`/`aisKeyPost` already do);
|
|
6
|
+
* an auth-error body from either call is returned as-is so the caller's
|
|
7
|
+
* existing re-auth-and-retry loop (`isAuthErrorResult`) still fires.
|
|
8
|
+
*/
|
|
9
|
+
export declare function readInboxAndMaybeAck(args: InboxReadArgs, getPage: () => Promise<unknown>, ackMessages: (messageIds: string[]) => Promise<unknown>): Promise<unknown>;
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side composition for `inbox_read` (CORBOT-7115B8AE).
|
|
3
|
+
*
|
|
4
|
+
* AIS's own `inbox_read` MCP handler
|
|
5
|
+
* (agent-identity-service/src/mcp/handlers/agent-inbox-handlers.ts) folds a
|
|
6
|
+
* conditional ack into one call because it already holds the
|
|
7
|
+
* AgentMessageService in-process. This package instead talks to AIS over
|
|
8
|
+
* REST (GET /v1/agents/:agentId/inbox, POST .../inbox/ack), so the same
|
|
9
|
+
* "read a page, then ack what it returned" composition has to happen here —
|
|
10
|
+
* shaped to match handleInboxRead's result exactly (messages, nextCursor,
|
|
11
|
+
* unreadRemaining?, acked?) so a caller sees the same contract regardless of
|
|
12
|
+
* which AIS entrypoint served it.
|
|
13
|
+
*/
|
|
14
|
+
import { isAuthErrorResult } from './auth-staleness.js';
|
|
15
|
+
/** Mirrors AIS core/inbox/types.ts MAX_ACK_IDS. A page never exceeds it (MAX_PAGE_SIZE === MAX_ACK_IDS), so no chunking is needed. */
|
|
16
|
+
const MAX_ACK_IDS = 100;
|
|
17
|
+
function isInboxMessageArray(value) {
|
|
18
|
+
return (Array.isArray(value) &&
|
|
19
|
+
value.every((item) => typeof item === 'object' && item !== null && typeof item.messageId === 'string'));
|
|
20
|
+
}
|
|
21
|
+
function isInboxListResponse(value) {
|
|
22
|
+
if (typeof value !== 'object' || value === null)
|
|
23
|
+
return false;
|
|
24
|
+
const r = value;
|
|
25
|
+
if (r.success !== true || typeof r.data !== 'object' || r.data === null)
|
|
26
|
+
return false;
|
|
27
|
+
const d = r.data;
|
|
28
|
+
return isInboxMessageArray(d.messages) && (typeof d.nextCursor === 'string' || d.nextCursor === null) && typeof d.hasMore === 'boolean';
|
|
29
|
+
}
|
|
30
|
+
function isAckResponse(value) {
|
|
31
|
+
if (typeof value !== 'object' || value === null)
|
|
32
|
+
return false;
|
|
33
|
+
const r = value;
|
|
34
|
+
if (r.success !== true || typeof r.data !== 'object' || r.data === null)
|
|
35
|
+
return false;
|
|
36
|
+
const acked = r.data.acked;
|
|
37
|
+
return Array.isArray(acked) && acked.every((id) => typeof id === 'string');
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Reads one inbox page via `getPage`, then acks the returned messageIds via
|
|
41
|
+
* `ackMessages` when `args.ack` is set. Both callbacks return AIS's raw
|
|
42
|
+
* response body (as `aisGet`/`aisPost`/`aisKeyGet`/`aisKeyPost` already do);
|
|
43
|
+
* an auth-error body from either call is returned as-is so the caller's
|
|
44
|
+
* existing re-auth-and-retry loop (`isAuthErrorResult`) still fires.
|
|
45
|
+
*/
|
|
46
|
+
export async function readInboxAndMaybeAck(args, getPage, ackMessages) {
|
|
47
|
+
const page = await getPage();
|
|
48
|
+
if (isAuthErrorResult(page))
|
|
49
|
+
return page;
|
|
50
|
+
if (!isInboxListResponse(page)) {
|
|
51
|
+
// AIS's response envelope changed shape underneath us — surface it
|
|
52
|
+
// verbatim rather than guessing, same as every other tool's `result`.
|
|
53
|
+
return page;
|
|
54
|
+
}
|
|
55
|
+
const { messages, nextCursor, hasMore } = page.data;
|
|
56
|
+
const result = { messages, nextCursor };
|
|
57
|
+
if (args.ack && messages.length > 0) {
|
|
58
|
+
const ids = messages.slice(0, MAX_ACK_IDS).map((m) => m.messageId);
|
|
59
|
+
const ackResult = await ackMessages(ids);
|
|
60
|
+
if (isAuthErrorResult(ackResult))
|
|
61
|
+
return ackResult;
|
|
62
|
+
result.acked = isAckResponse(ackResult) ? ackResult.data.acked : ids;
|
|
63
|
+
}
|
|
64
|
+
else if (args.ack) {
|
|
65
|
+
result.acked = [];
|
|
66
|
+
}
|
|
67
|
+
// Exact only when this read reached the end of the unread stream — see
|
|
68
|
+
// handleInboxRead's identical comment in agent-inbox-handlers.ts.
|
|
69
|
+
if (args.unreadOnly && !hasMore) {
|
|
70
|
+
result.unreadRemaining = args.ack ? 0 : messages.length;
|
|
71
|
+
}
|
|
72
|
+
return { success: true, data: result };
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=inbox-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inbox-client.js","sourceRoot":"","sources":["../src/inbox-client.ts"],"names":[],"mappings":"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"}
|