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,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aismemory invite accept` — register this agent with a friends invite and
|
|
3
|
+
* print the bond link for the human (CORBOT-74F03CB8, design
|
|
4
|
+
* docs/design/2026-09-25-invite-friends.md §A/§B).
|
|
5
|
+
*
|
|
6
|
+
* The token is read from an environment variable (--token-env NAME) or from
|
|
7
|
+
* stdin (--token-stdin), never from argv: argv lands in process listings and
|
|
8
|
+
* shell history. There is deliberately no --token flag.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* AIS_FRIEND_INVITE_TOKEN=... npx -y aismemory invite accept --token-env AIS_FRIEND_INVITE_TOKEN
|
|
12
|
+
* printf '%s' "$AIS_FRIEND_INVITE_TOKEN" | npx -y aismemory invite accept --token-stdin
|
|
13
|
+
*
|
|
14
|
+
* Exit codes:
|
|
15
|
+
* 0 — registered; the bond link is on stdout
|
|
16
|
+
* 1 — bad arguments, no token, or the service refused the invite
|
|
17
|
+
*/
|
|
18
|
+
import { DEFAULT_AIS_URL } from '../ais-http.js';
|
|
19
|
+
const USAGE = `aismemory invite accept — join Agents & Swarms with a friends invite
|
|
20
|
+
|
|
21
|
+
Usage:
|
|
22
|
+
AIS_FRIEND_INVITE_TOKEN=... aismemory invite accept --token-env AIS_FRIEND_INVITE_TOKEN
|
|
23
|
+
printf '%s' "$AIS_FRIEND_INVITE_TOKEN" | aismemory invite accept --token-stdin
|
|
24
|
+
|
|
25
|
+
Options:
|
|
26
|
+
--token-env <NAME> Read the invite token from environment variable NAME.
|
|
27
|
+
--token-stdin Read the invite token from standard input.
|
|
28
|
+
--name <name> Name for this agent (optional).
|
|
29
|
+
--help, -h Show this message.
|
|
30
|
+
|
|
31
|
+
There is no --token flag: a token on the command line lands in process
|
|
32
|
+
listings and shell history. Give your human only the bond link printed.
|
|
33
|
+
`;
|
|
34
|
+
const ENV_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
35
|
+
export class InviteAcceptError extends Error {
|
|
36
|
+
constructor(message) {
|
|
37
|
+
super(message);
|
|
38
|
+
this.name = 'InviteAcceptError';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function parseInviteArgs(argv) {
|
|
42
|
+
const [sub, ...rest] = argv;
|
|
43
|
+
if (sub === '--help' || sub === '-h' || sub === undefined) {
|
|
44
|
+
return { tokenStdin: false, help: true };
|
|
45
|
+
}
|
|
46
|
+
if (sub !== 'accept') {
|
|
47
|
+
throw new InviteAcceptError(`Unknown invite command: ${sub}. Run aismemory invite accept --help.`);
|
|
48
|
+
}
|
|
49
|
+
const args = { tokenStdin: false, help: false };
|
|
50
|
+
for (let i = 0; i < rest.length; i++) {
|
|
51
|
+
const flag = rest[i];
|
|
52
|
+
if (flag === '--token-env' && rest[i + 1] !== undefined) {
|
|
53
|
+
args.tokenEnv = rest[++i];
|
|
54
|
+
}
|
|
55
|
+
else if (flag === '--token-stdin') {
|
|
56
|
+
args.tokenStdin = true;
|
|
57
|
+
}
|
|
58
|
+
else if (flag === '--name' && rest[i + 1] !== undefined) {
|
|
59
|
+
args.name = rest[++i];
|
|
60
|
+
}
|
|
61
|
+
else if (flag === '--help' || flag === '-h') {
|
|
62
|
+
args.help = true;
|
|
63
|
+
}
|
|
64
|
+
else if (flag === '--token' || flag.startsWith('--token=')) {
|
|
65
|
+
// Never echo the value: it may be the token itself.
|
|
66
|
+
throw new InviteAcceptError('There is no --token flag; a token in argv leaks into process listings and shell history. ' +
|
|
67
|
+
'Use --token-env NAME or --token-stdin.');
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
throw new InviteAcceptError(`Unknown option: ${flag.startsWith('-') ? flag : '(positional argument)'}. Run aismemory invite accept --help.`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (args.help)
|
|
74
|
+
return args;
|
|
75
|
+
if ((args.tokenEnv !== undefined) === args.tokenStdin) {
|
|
76
|
+
throw new InviteAcceptError('Pass exactly one of --token-env NAME or --token-stdin.');
|
|
77
|
+
}
|
|
78
|
+
if (args.tokenEnv !== undefined && !ENV_NAME_PATTERN.test(args.tokenEnv)) {
|
|
79
|
+
throw new InviteAcceptError('--token-env takes the NAME of an environment variable, not the token.');
|
|
80
|
+
}
|
|
81
|
+
return args;
|
|
82
|
+
}
|
|
83
|
+
/** Resolve the token from the one source the arguments allow. */
|
|
84
|
+
export async function readInviteToken(args, deps) {
|
|
85
|
+
const raw = args.tokenStdin ? await deps.readStdin() : deps.env[args.tokenEnv];
|
|
86
|
+
const token = raw?.trim() ?? '';
|
|
87
|
+
if (token.length === 0) {
|
|
88
|
+
throw new InviteAcceptError(
|
|
89
|
+
// Never echo the name: a user may have passed the token itself as NAME.
|
|
90
|
+
args.tokenStdin ? 'No invite token on stdin.' : 'The environment variable named by --token-env is empty or not set.');
|
|
91
|
+
}
|
|
92
|
+
return token;
|
|
93
|
+
}
|
|
94
|
+
function pickString(source, key) {
|
|
95
|
+
const value = source[key];
|
|
96
|
+
return typeof value === 'string' ? value : undefined;
|
|
97
|
+
}
|
|
98
|
+
/** POST /v1/register with the invite. The bearer token in the reply is not printed. */
|
|
99
|
+
export async function acceptInvite(aisUrl, token, name, fetchImpl) {
|
|
100
|
+
const res = await fetchImpl(`${aisUrl}/v1/register`, {
|
|
101
|
+
method: 'POST',
|
|
102
|
+
headers: { 'Content-Type': 'application/json' },
|
|
103
|
+
body: JSON.stringify(name === undefined ? { inviteToken: token } : { inviteToken: token, name }),
|
|
104
|
+
});
|
|
105
|
+
const body = await res.json().catch(() => null);
|
|
106
|
+
const envelope = typeof body === 'object' && body !== null ? body : {};
|
|
107
|
+
const data = typeof envelope['data'] === 'object' && envelope['data'] !== null
|
|
108
|
+
? envelope['data']
|
|
109
|
+
: {};
|
|
110
|
+
const claimUrl = pickString(data, 'claimUrl');
|
|
111
|
+
if (!res.ok || claimUrl === undefined) {
|
|
112
|
+
const error = typeof envelope['error'] === 'object' && envelope['error'] !== null
|
|
113
|
+
? envelope['error']
|
|
114
|
+
: {};
|
|
115
|
+
throw new InviteAcceptError(pickString(error, 'message') ?? `The service refused the invite (HTTP ${res.status}).`);
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
ok: true,
|
|
119
|
+
claimUrl,
|
|
120
|
+
officialHost: pickString(data, 'officialHost'),
|
|
121
|
+
inviteCodeLabel: pickString(data, 'inviteCodeLabel'),
|
|
122
|
+
inviterDisplayName: pickString(data, 'inviterDisplayName'),
|
|
123
|
+
agentMessage: pickString(data, 'agentMessage'),
|
|
124
|
+
humanMessage: pickString(data, 'humanMessage'),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
async function readAllStdin() {
|
|
128
|
+
const chunks = [];
|
|
129
|
+
for await (const chunk of process.stdin) {
|
|
130
|
+
chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk);
|
|
131
|
+
}
|
|
132
|
+
return Buffer.concat(chunks).toString('utf8');
|
|
133
|
+
}
|
|
134
|
+
export async function main(argv, deps = {
|
|
135
|
+
env: process.env,
|
|
136
|
+
readStdin: readAllStdin,
|
|
137
|
+
fetchImpl: fetch,
|
|
138
|
+
stdout: (text) => { process.stdout.write(text); },
|
|
139
|
+
}) {
|
|
140
|
+
const args = parseInviteArgs(argv);
|
|
141
|
+
if (args.help) {
|
|
142
|
+
deps.stdout(USAGE);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const token = await readInviteToken(args, deps);
|
|
146
|
+
const aisUrl = (deps.env['AIS_URL']?.trim() || DEFAULT_AIS_URL).replace(/\/+$/, '');
|
|
147
|
+
const result = await acceptInvite(aisUrl, token, args.name, deps.fetchImpl);
|
|
148
|
+
deps.stdout(`${JSON.stringify(result, null, 2)}\n`);
|
|
149
|
+
}
|
|
150
|
+
/** Entry from `aismemory invite ...`: failures print one line and exit 1. */
|
|
151
|
+
export async function runFromCli(argv) {
|
|
152
|
+
try {
|
|
153
|
+
await main(argv);
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
157
|
+
process.stderr.write(`[aismemory invite] Failed: ${message}\n`);
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=invite-accept.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invite-accept.js","sourceRoot":"","sources":["../../src/cli/invite-accept.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,8 @@ export interface OrientationCheck {
|
|
|
2
2
|
step: string;
|
|
3
3
|
status: 'PASS' | 'FAIL';
|
|
4
4
|
message: string;
|
|
5
|
+
/** Absent means required (existing checks). Only a required FAIL fails the report. */
|
|
6
|
+
required?: boolean;
|
|
5
7
|
}
|
|
6
8
|
export interface OrientationReport {
|
|
7
9
|
scope: 'public-orientation';
|
package/dist/cli/orientation.js
CHANGED
|
@@ -5,6 +5,20 @@ const channel = z.enum(['ais', 'mcp', 'inbox']);
|
|
|
5
5
|
const evidence = z.enum(['pass', 'missing', 'unknown']);
|
|
6
6
|
const marker = z.string().regex(/^[a-zA-Z0-9-]{1,64}$/);
|
|
7
7
|
const activationDoor = 'https://agentsandswarms.ai/activate';
|
|
8
|
+
// The wider surface an agent expects beyond the three AIS channels — tool
|
|
9
|
+
// servers and connectors it needs by name and purpose, never a secret value.
|
|
10
|
+
// One list per identity: `required` per item does the work a per-harness
|
|
11
|
+
// override set would otherwise do, which is the thing this manifest exists
|
|
12
|
+
// to detect (docs/ais/2026-09-19-operating-contract.md, P4).
|
|
13
|
+
const environmentItemName = z.string().min(1).max(64).regex(/^[a-zA-Z0-9 _.-]+$/);
|
|
14
|
+
const environmentItem = z.object({
|
|
15
|
+
name: environmentItemName,
|
|
16
|
+
kind: z.enum(['tool-server', 'connector', 'data-connector']),
|
|
17
|
+
purpose: z.string().min(1).max(200),
|
|
18
|
+
required: z.boolean(),
|
|
19
|
+
permission: z.string().min(1).max(120).optional(),
|
|
20
|
+
dataEnvironment: z.string().min(1).max(120).optional(),
|
|
21
|
+
}).strict();
|
|
8
22
|
const inputSchema = z.object({
|
|
9
23
|
version: z.literal(1),
|
|
10
24
|
identity: z.string().uuid(),
|
|
@@ -12,6 +26,9 @@ const inputSchema = z.object({
|
|
|
12
26
|
host,
|
|
13
27
|
account,
|
|
14
28
|
channels: z.array(channel).min(1).max(3).refine((values) => new Set(values).size === values.length),
|
|
29
|
+
environment: z.array(environmentItem).max(32)
|
|
30
|
+
.refine((values) => new Set(values.map((v) => v.name)).size === values.length)
|
|
31
|
+
.optional(),
|
|
15
32
|
}).strict(),
|
|
16
33
|
current: z.object({ host: host.or(z.literal('unknown')), account: account.or(z.literal('unknown')), session: marker }).strict(),
|
|
17
34
|
evidence: z.object({
|
|
@@ -21,6 +38,7 @@ const inputSchema = z.object({
|
|
|
21
38
|
credentials: evidence,
|
|
22
39
|
credentialSource: z.enum(['ais-bond', 'ais-oauth', 'ais-agent-key', 'none']),
|
|
23
40
|
channels: z.object({ ais: evidence, mcp: evidence, inbox: evidence }).strict(),
|
|
41
|
+
environment: z.record(environmentItemName, evidence).optional(),
|
|
24
42
|
}).strict(),
|
|
25
43
|
relocation: z.object({
|
|
26
44
|
verified: z.boolean(),
|
|
@@ -72,6 +90,18 @@ export function orient(input) {
|
|
|
72
90
|
message: fresh ? `Reported ${required}: ${data.evidence.channels[required]}.` : `Recheck ${required} in the current session.`,
|
|
73
91
|
});
|
|
74
92
|
}
|
|
93
|
+
for (const item of data.requirements.environment ?? []) {
|
|
94
|
+
const reported = data.evidence.environment?.[item.name] ?? 'unknown';
|
|
95
|
+
const status = fresh && reported === 'pass' ? 'PASS' : 'FAIL';
|
|
96
|
+
checks.push({
|
|
97
|
+
step: `Environment: ${item.name}`, status, required: item.required,
|
|
98
|
+
message: status === 'PASS'
|
|
99
|
+
? `Reported ${item.name} (${item.kind}): ${reported}.`
|
|
100
|
+
: `${item.required ? 'Missing required' : 'Missing optional'} ${item.kind} "${item.name}" — ${item.purpose}.`
|
|
101
|
+
+ (item.permission ? ` Needs permission: ${item.permission}.` : '')
|
|
102
|
+
+ (item.dataEnvironment ? ` Must point at: ${item.dataEnvironment}.` : ''),
|
|
103
|
+
});
|
|
104
|
+
}
|
|
75
105
|
if (!atHome) {
|
|
76
106
|
checks.push({
|
|
77
107
|
step: 'Know the way back', status: data.relocation.verified && data.relocation.observedAction ? 'PASS' : 'FAIL',
|
|
@@ -83,7 +113,7 @@ export function orient(input) {
|
|
|
83
113
|
return {
|
|
84
114
|
scope: 'public-orientation', runtimeEvidence: 'unverified', checks, bondUrl,
|
|
85
115
|
beacon: 'unknown-signing-capability',
|
|
86
|
-
exitCode: checks.some((check) => check.status === 'FAIL') ? 1 : 0,
|
|
116
|
+
exitCode: checks.some((check) => check.status === 'FAIL' && check.required !== false) ? 1 : 0,
|
|
87
117
|
};
|
|
88
118
|
}
|
|
89
119
|
//# sourceMappingURL=orientation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orientation.js","sourceRoot":"","sources":["../../src/cli/orientation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;AAC9D,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC;AAC3D,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;AAChD,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACxD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;AACxD,MAAM,cAAc,GAAG,qCAAqC,CAAC;AAE7D,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3B,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACrB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC3B,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC;QACrB,IAAI;QACJ,OAAO;QACP,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAW,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"orientation.js","sourceRoot":"","sources":["../../src/cli/orientation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CORBOT-AF282BD7: `--help` / `--version` must print and exit before any
|
|
3
|
+
* credential or server code runs. Pure helpers so they are testable without
|
|
4
|
+
* starting the MCP server.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* CORBOT-73753A98: shown to a person who runs `npx aismemory` in a terminal
|
|
8
|
+
* (stdin is a TTY). MCP clients launch the server with piped stdin, so they
|
|
9
|
+
* never see this.
|
|
10
|
+
*/
|
|
11
|
+
export declare const HUMAN_HOWTO_TEXT: string;
|
|
12
|
+
export declare const USAGE_TEXT: string;
|
|
13
|
+
/**
|
|
14
|
+
* Returns the text to print for a help or version request, or null when the
|
|
15
|
+
* arguments are not one. Only the first argument counts, so subcommand flags
|
|
16
|
+
* (e.g. `aismemory sync --help`) still reach their own handlers.
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveInfoRequest(args: readonly string[], version: string): string | null;
|
package/dist/cli-info.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CORBOT-AF282BD7: `--help` / `--version` must print and exit before any
|
|
3
|
+
* credential or server code runs. Pure helpers so they are testable without
|
|
4
|
+
* starting the MCP server.
|
|
5
|
+
*/
|
|
6
|
+
const HUMAN_MCP_CONFIG = [
|
|
7
|
+
' {',
|
|
8
|
+
' "mcpServers": {',
|
|
9
|
+
' "aismemory": {',
|
|
10
|
+
' "command": "npx",',
|
|
11
|
+
' "args": ["aismemory"]',
|
|
12
|
+
' }',
|
|
13
|
+
' }',
|
|
14
|
+
' }',
|
|
15
|
+
].join('\n');
|
|
16
|
+
/**
|
|
17
|
+
* CORBOT-73753A98: shown to a person who runs `npx aismemory` in a terminal
|
|
18
|
+
* (stdin is a TTY). MCP clients launch the server with piped stdin, so they
|
|
19
|
+
* never see this.
|
|
20
|
+
*/
|
|
21
|
+
export const HUMAN_HOWTO_TEXT = [
|
|
22
|
+
'aismemory - persistent memory for your AI agents.',
|
|
23
|
+
'',
|
|
24
|
+
'This is an MCP server: your AI client starts it, you do not run it by hand.',
|
|
25
|
+
'Add this to your client\'s MCP server config:',
|
|
26
|
+
'',
|
|
27
|
+
HUMAN_MCP_CONFIG,
|
|
28
|
+
'',
|
|
29
|
+
'The first time your agent uses memory it will show you a bond link.',
|
|
30
|
+
'Open it and press Bond.',
|
|
31
|
+
'',
|
|
32
|
+
'Run `aismemory --help` for all commands.',
|
|
33
|
+
'',
|
|
34
|
+
].join('\n');
|
|
35
|
+
export const USAGE_TEXT = [
|
|
36
|
+
'aismemory - persistent memory for AI agents (MCP server)',
|
|
37
|
+
'',
|
|
38
|
+
'Usage:',
|
|
39
|
+
' aismemory Start the MCP server on stdio',
|
|
40
|
+
' aismemory install Install aismemory into your MCP clients',
|
|
41
|
+
' aismemory enable-key-auth Enroll a device key for silent sign-in',
|
|
42
|
+
' aismemory sync Sync memories into AIS',
|
|
43
|
+
' aismemory pull Pull memories from AIS to local files',
|
|
44
|
+
' aismemory doctor Diagnose configuration and credentials',
|
|
45
|
+
'',
|
|
46
|
+
'Options:',
|
|
47
|
+
' -h, --help Show this help and exit',
|
|
48
|
+
' -v, --version Print the version and exit',
|
|
49
|
+
'',
|
|
50
|
+
'Setup:',
|
|
51
|
+
' Add this to your AI client\'s MCP server config:',
|
|
52
|
+
'',
|
|
53
|
+
HUMAN_MCP_CONFIG,
|
|
54
|
+
'',
|
|
55
|
+
' The first time your agent uses memory it will show you a bond link.',
|
|
56
|
+
' Open it and press Bond.',
|
|
57
|
+
'',
|
|
58
|
+
].join('\n');
|
|
59
|
+
/**
|
|
60
|
+
* Returns the text to print for a help or version request, or null when the
|
|
61
|
+
* arguments are not one. Only the first argument counts, so subcommand flags
|
|
62
|
+
* (e.g. `aismemory sync --help`) still reach their own handlers.
|
|
63
|
+
*/
|
|
64
|
+
export function resolveInfoRequest(args, version) {
|
|
65
|
+
const first = args[0];
|
|
66
|
+
if (first === '--help' || first === '-h')
|
|
67
|
+
return USAGE_TEXT;
|
|
68
|
+
if (first === '--version' || first === '-v')
|
|
69
|
+
return `${version}\n`;
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=cli-info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-info.js","sourceRoot":"","sources":["../src/cli-info.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,gBAAgB,GAAG;IACvB,KAAK;IACL,qBAAqB;IACrB,sBAAsB;IACtB,2BAA2B;IAC3B,+BAA+B;IAC/B,SAAS;IACT,OAAO;IACP,KAAK;CACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,mDAAmD;IACnD,EAAE;IACF,6EAA6E;IAC7E,+CAA+C;IAC/C,EAAE;IACF,gBAAgB;IAChB,EAAE;IACF,qEAAqE;IACrE,yBAAyB;IACzB,EAAE;IACF,0CAA0C;IAC1C,EAAE;CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,0DAA0D;IAC1D,EAAE;IACF,QAAQ;IACR,8DAA8D;IAC9D,wEAAwE;IACxE,uEAAuE;IACvE,uDAAuD;IACvD,sEAAsE;IACtE,uEAAuE;IACvE,EAAE;IACF,UAAU;IACV,wDAAwD;IACxD,2DAA2D;IAC3D,EAAE;IACF,QAAQ;IACR,oDAAoD;IACpD,EAAE;IACF,gBAAgB;IAChB,EAAE;IACF,uEAAuE;IACvE,2BAA2B;IAC3B,EAAE;CACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAuB,EAAE,OAAe;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,UAAU,CAAC;IAC5D,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,GAAG,OAAO,IAAI,CAAC;IACnE,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credential self-description passthrough (CORBOT-49535E96).
|
|
3
|
+
*
|
|
4
|
+
* `whoami` used to be answered locally in both key modes: the client probed a
|
|
5
|
+
* memory read, and if that did not throw it returned a hardcoded
|
|
6
|
+
* `{ agentId, authMode, keyValid: true }`. That proved the key was live, but it
|
|
7
|
+
* could not say what the key was allowed to do, which tenant it belonged to, or
|
|
8
|
+
* when it expired — the caller had to discover its own limits by tripping them.
|
|
9
|
+
*
|
|
10
|
+
* AIS now answers `GET /v1/agents/:agentId/whoami` with that description, so
|
|
11
|
+
* this module asks the server and passes the fields straight through. A server
|
|
12
|
+
* that predates the route (or has not widened its allowlist to it) answers 403
|
|
13
|
+
* or 404; in that case we fall back to the old liveness probe, and mark the
|
|
14
|
+
* result `selfDescribed: false` so a caller can tell a real answer from a
|
|
15
|
+
* fallback rather than reading a thin answer as a complete one.
|
|
16
|
+
*/
|
|
17
|
+
/** Fields AIS returns about the calling credential. All optional: a fallback answer carries none of them. */
|
|
18
|
+
export interface CredentialWhoamiData {
|
|
19
|
+
/** The agent this credential acts as. Always present — the identity gate reads it. */
|
|
20
|
+
agentId: string;
|
|
21
|
+
/** Kept for callers that predate the server route. */
|
|
22
|
+
authMode: 'agent-api-key' | 'workspace-key' | 'run-pass';
|
|
23
|
+
/** The credential authenticated successfully. */
|
|
24
|
+
keyValid: true;
|
|
25
|
+
/**
|
|
26
|
+
* True when AIS described the credential itself; false when this client fell
|
|
27
|
+
* back to a liveness probe and every field below is therefore absent.
|
|
28
|
+
*/
|
|
29
|
+
selfDescribed: boolean;
|
|
30
|
+
tenantId?: string;
|
|
31
|
+
mode?: string;
|
|
32
|
+
scopeModel?: string;
|
|
33
|
+
scopes?: string[];
|
|
34
|
+
restrictions?: string[];
|
|
35
|
+
actsAsGrantedAgent?: boolean;
|
|
36
|
+
expiresAt?: string | null;
|
|
37
|
+
}
|
|
38
|
+
export interface CredentialWhoamiResult {
|
|
39
|
+
success: true;
|
|
40
|
+
data: CredentialWhoamiData;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Ask AIS what this credential can do, falling back to a liveness probe.
|
|
44
|
+
*
|
|
45
|
+
* @param agentId the agent this credential acts as
|
|
46
|
+
* @param authMode which key mode is calling
|
|
47
|
+
* @param getWhoami GET /v1/agents/:agentId/whoami
|
|
48
|
+
* @param probeAlive a cheap allowlisted read that proves the key is still live
|
|
49
|
+
*/
|
|
50
|
+
export declare function fetchCredentialWhoami(agentId: string, authMode: 'agent-api-key' | 'workspace-key' | 'run-pass', getWhoami: () => Promise<unknown>, probeAlive: () => Promise<unknown>): Promise<CredentialWhoamiResult>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credential self-description passthrough (CORBOT-49535E96).
|
|
3
|
+
*
|
|
4
|
+
* `whoami` used to be answered locally in both key modes: the client probed a
|
|
5
|
+
* memory read, and if that did not throw it returned a hardcoded
|
|
6
|
+
* `{ agentId, authMode, keyValid: true }`. That proved the key was live, but it
|
|
7
|
+
* could not say what the key was allowed to do, which tenant it belonged to, or
|
|
8
|
+
* when it expired — the caller had to discover its own limits by tripping them.
|
|
9
|
+
*
|
|
10
|
+
* AIS now answers `GET /v1/agents/:agentId/whoami` with that description, so
|
|
11
|
+
* this module asks the server and passes the fields straight through. A server
|
|
12
|
+
* that predates the route (or has not widened its allowlist to it) answers 403
|
|
13
|
+
* or 404; in that case we fall back to the old liveness probe, and mark the
|
|
14
|
+
* result `selfDescribed: false` so a caller can tell a real answer from a
|
|
15
|
+
* fallback rather than reading a thin answer as a complete one.
|
|
16
|
+
*/
|
|
17
|
+
import { AisHttpError } from './ais-http-error.js';
|
|
18
|
+
/** Status codes an AIS without this route (or without it on the allowlist) answers with. */
|
|
19
|
+
function isRouteUnavailable(err) {
|
|
20
|
+
return err instanceof AisHttpError && (err.status === 403 || err.status === 404);
|
|
21
|
+
}
|
|
22
|
+
function readStringField(source, key) {
|
|
23
|
+
const value = source[key];
|
|
24
|
+
return typeof value === 'string' ? value : undefined;
|
|
25
|
+
}
|
|
26
|
+
function readStringArrayField(source, key) {
|
|
27
|
+
const value = source[key];
|
|
28
|
+
if (!Array.isArray(value))
|
|
29
|
+
return undefined;
|
|
30
|
+
return value.every((entry) => typeof entry === 'string') ? value : undefined;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Narrow the server's response to the fields this client passes through.
|
|
34
|
+
* Anything unrecognised is dropped rather than forwarded, so a future server
|
|
35
|
+
* field never reaches a caller as an untyped value.
|
|
36
|
+
*/
|
|
37
|
+
function readServerFields(response, agentId, authMode) {
|
|
38
|
+
if (response === null || typeof response !== 'object')
|
|
39
|
+
return null;
|
|
40
|
+
const data = response.data;
|
|
41
|
+
if (data === null || typeof data === 'undefined' || typeof data !== 'object')
|
|
42
|
+
return null;
|
|
43
|
+
const fields = data;
|
|
44
|
+
// Surface the server's self-described identity to the identity gate. A
|
|
45
|
+
// mismatch is exactly the signal gated writes must refuse.
|
|
46
|
+
const serverAgentId = readStringField(fields, 'id') ?? readStringField(fields, 'agentId') ?? agentId;
|
|
47
|
+
const expiresAtRaw = fields['expiresAt'];
|
|
48
|
+
const actsAsGranted = fields['actsAsGrantedAgent'];
|
|
49
|
+
return {
|
|
50
|
+
agentId: serverAgentId,
|
|
51
|
+
authMode,
|
|
52
|
+
keyValid: true,
|
|
53
|
+
selfDescribed: true,
|
|
54
|
+
...(readStringField(fields, 'tenantId') !== undefined ? { tenantId: readStringField(fields, 'tenantId') } : {}),
|
|
55
|
+
...(readStringField(fields, 'mode') !== undefined ? { mode: readStringField(fields, 'mode') } : {}),
|
|
56
|
+
...(readStringField(fields, 'scopeModel') !== undefined ? { scopeModel: readStringField(fields, 'scopeModel') } : {}),
|
|
57
|
+
...(readStringArrayField(fields, 'scopes') !== undefined ? { scopes: readStringArrayField(fields, 'scopes') } : {}),
|
|
58
|
+
...(readStringArrayField(fields, 'restrictions') !== undefined
|
|
59
|
+
? { restrictions: readStringArrayField(fields, 'restrictions') }
|
|
60
|
+
: {}),
|
|
61
|
+
...(typeof actsAsGranted === 'boolean' ? { actsAsGrantedAgent: actsAsGranted } : {}),
|
|
62
|
+
...(typeof expiresAtRaw === 'string' || expiresAtRaw === null ? { expiresAt: expiresAtRaw } : {}),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Ask AIS what this credential can do, falling back to a liveness probe.
|
|
67
|
+
*
|
|
68
|
+
* @param agentId the agent this credential acts as
|
|
69
|
+
* @param authMode which key mode is calling
|
|
70
|
+
* @param getWhoami GET /v1/agents/:agentId/whoami
|
|
71
|
+
* @param probeAlive a cheap allowlisted read that proves the key is still live
|
|
72
|
+
*/
|
|
73
|
+
export async function fetchCredentialWhoami(agentId, authMode, getWhoami, probeAlive) {
|
|
74
|
+
try {
|
|
75
|
+
const described = readServerFields(await getWhoami(), agentId, authMode);
|
|
76
|
+
if (described)
|
|
77
|
+
return { success: true, data: described };
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
// A server without the route is expected; anything else (401 on a dead
|
|
81
|
+
// key, a network failure) is the caller's answer and must not be masked.
|
|
82
|
+
if (!isRouteUnavailable(err))
|
|
83
|
+
throw err;
|
|
84
|
+
}
|
|
85
|
+
await probeAlive();
|
|
86
|
+
return {
|
|
87
|
+
success: true,
|
|
88
|
+
data: { agentId, authMode, keyValid: true, selfDescribed: false },
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=credential-whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-whoami.js","sourceRoot":"","sources":["../src/credential-whoami.ts"],"names":[],"mappings":"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"}
|
package/dist/hydration.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { getAisRequestTimeoutMs } from './request-timeout.js';
|
|
1
2
|
const LOG_PREFIX = '[aismemory]';
|
|
2
3
|
function redactHydrationMessage(message) {
|
|
3
4
|
return message
|
|
@@ -29,6 +30,7 @@ export async function hydrateIdentity(aisUrl, agentId, token, memoriesLimit) {
|
|
|
29
30
|
const query = memoriesLimit === undefined ? '' : `?memoriesLimit=${memoriesLimit}`;
|
|
30
31
|
const res = await fetch(`${aisUrl}/v1/agents/${agentId}/full-context${query}`, {
|
|
31
32
|
headers: { Authorization: `Bearer ${token}` },
|
|
33
|
+
signal: AbortSignal.timeout(getAisRequestTimeoutMs()),
|
|
32
34
|
});
|
|
33
35
|
if (!res.ok) {
|
|
34
36
|
let bodyHint = res.statusText;
|
|
@@ -91,6 +93,11 @@ export async function hydrateIdentity(aisUrl, agentId, token, memoriesLimit) {
|
|
|
91
93
|
createdAt: d.lastHandoff.createdAt ?? '',
|
|
92
94
|
}
|
|
93
95
|
: null;
|
|
96
|
+
// The receipt is passed through verbatim (CORBOT-2DDFC7A0). It is the
|
|
97
|
+
// server's own account of what this load selected, so re-deriving or
|
|
98
|
+
// re-shaping it here would make the client the authority on a question
|
|
99
|
+
// only the server can answer. An older AIS omits the field entirely.
|
|
100
|
+
const receipt = d.receipt ?? null;
|
|
94
101
|
return {
|
|
95
102
|
identity,
|
|
96
103
|
personality,
|
|
@@ -100,6 +107,7 @@ export async function hydrateIdentity(aisUrl, agentId, token, memoriesLimit) {
|
|
|
100
107
|
lastHandoff,
|
|
101
108
|
assembledAt: d.assembledAt ?? '',
|
|
102
109
|
totalTokens: d.context?.totalTokens ?? 0,
|
|
110
|
+
receipt,
|
|
103
111
|
};
|
|
104
112
|
}
|
|
105
113
|
catch (err) {
|
package/dist/hydration.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hydration.js","sourceRoot":"","sources":["../src/hydration.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"hydration.js","sourceRoot":"","sources":["../src/hydration.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED