aismemory 0.7.4 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +211 -11
- package/dist/__tests__/agent-archive.test.d.ts +1 -0
- package/dist/__tests__/agent-archive.test.js +153 -0
- package/dist/__tests__/agent-archive.test.js.map +1 -0
- package/dist/__tests__/agent-key-mode.test.js +88 -7
- package/dist/__tests__/agent-key-mode.test.js.map +1 -1
- package/dist/__tests__/ais-http.test.js +32 -0
- package/dist/__tests__/ais-http.test.js.map +1 -1
- package/dist/__tests__/credential-isolation.test.js +117 -3
- package/dist/__tests__/credential-isolation.test.js.map +1 -1
- package/dist/__tests__/credential-resolution.test.js +5 -5
- package/dist/__tests__/credential-resolution.test.js.map +1 -1
- package/dist/__tests__/device-flow-gate-e2e.test.js +5 -0
- package/dist/__tests__/device-flow-gate-e2e.test.js.map +1 -1
- package/dist/__tests__/doctor.test.js +144 -79
- package/dist/__tests__/doctor.test.js.map +1 -1
- package/dist/__tests__/mcp-tools.test.d.ts +1 -0
- package/dist/__tests__/mcp-tools.test.js +189 -0
- package/dist/__tests__/mcp-tools.test.js.map +1 -0
- package/dist/__tests__/memory-pull.test.d.ts +1 -0
- package/dist/__tests__/memory-pull.test.js +380 -0
- package/dist/__tests__/memory-pull.test.js.map +1 -0
- package/dist/__tests__/memory-write-failure.test.js +4 -8
- package/dist/__tests__/memory-write-failure.test.js.map +1 -1
- package/dist/__tests__/no-registered-keys-disk-bearer-fallback.test.js +4 -7
- package/dist/__tests__/no-registered-keys-disk-bearer-fallback.test.js.map +1 -1
- package/dist/__tests__/pending-device-flow-e2e.test.d.ts +19 -0
- package/dist/__tests__/pending-device-flow-e2e.test.js +159 -0
- package/dist/__tests__/pending-device-flow-e2e.test.js.map +1 -0
- package/dist/__tests__/pending-device-flow.test.d.ts +15 -0
- package/dist/__tests__/pending-device-flow.test.js +108 -0
- package/dist/__tests__/pending-device-flow.test.js.map +1 -0
- package/dist/__tests__/provisional-register-mcp-remember.test.js +4 -8
- package/dist/__tests__/provisional-register-mcp-remember.test.js.map +1 -1
- package/dist/__tests__/readme-quickstart-default-ais-url.test.d.ts +1 -0
- package/dist/__tests__/readme-quickstart-default-ais-url.test.js +80 -0
- package/dist/__tests__/readme-quickstart-default-ais-url.test.js.map +1 -0
- package/dist/__tests__/reconnect-survival-e2e.test.js +3 -4
- package/dist/__tests__/reconnect-survival-e2e.test.js.map +1 -1
- package/dist/__tests__/remember-duplicate-truth.test.d.ts +13 -0
- package/dist/__tests__/remember-duplicate-truth.test.js +106 -0
- package/dist/__tests__/remember-duplicate-truth.test.js.map +1 -0
- package/dist/__tests__/retry-after.test.d.ts +4 -0
- package/dist/__tests__/retry-after.test.js +128 -0
- package/dist/__tests__/retry-after.test.js.map +1 -0
- package/dist/__tests__/startup-credential-warning-e2e.test.d.ts +1 -0
- package/dist/__tests__/startup-credential-warning-e2e.test.js +102 -0
- package/dist/__tests__/startup-credential-warning-e2e.test.js.map +1 -0
- package/dist/__tests__/tool-args.test.js +10 -0
- package/dist/__tests__/tool-args.test.js.map +1 -1
- package/dist/__tests__/version-check.test.d.ts +1 -0
- package/dist/__tests__/version-check.test.js +349 -0
- package/dist/__tests__/version-check.test.js.map +1 -0
- package/dist/agent-archive.d.ts +36 -0
- package/dist/agent-archive.js +69 -0
- package/dist/agent-archive.js.map +1 -0
- package/dist/agent-key-mode.d.ts +1 -1
- package/dist/agent-key-mode.js +56 -19
- package/dist/agent-key-mode.js.map +1 -1
- package/dist/ais-http-error.d.ts +26 -2
- package/dist/ais-http-error.js +52 -4
- package/dist/ais-http-error.js.map +1 -1
- package/dist/ais-http.js +46 -16
- package/dist/ais-http.js.map +1 -1
- package/dist/cli/doctor.d.ts +17 -2
- package/dist/cli/doctor.js +93 -14
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/pull-memory.d.ts +17 -0
- package/dist/cli/pull-memory.js +141 -0
- package/dist/cli/pull-memory.js.map +1 -0
- package/dist/index.js +135 -398
- package/dist/index.js.map +1 -1
- package/dist/mcp/tools.d.ts +82 -0
- package/dist/mcp/tools.js +453 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/memory-pull.d.ts +114 -0
- package/dist/memory-pull.js +171 -0
- package/dist/memory-pull.js.map +1 -0
- package/dist/pending-device-flow.d.ts +49 -0
- package/dist/pending-device-flow.js +96 -0
- package/dist/pending-device-flow.js.map +1 -0
- package/dist/retry-after.d.ts +26 -0
- package/dist/retry-after.js +42 -0
- package/dist/retry-after.js.map +1 -0
- package/dist/session-identity.d.ts +26 -0
- package/dist/session-identity.js +89 -0
- package/dist/session-identity.js.map +1 -0
- package/dist/telemetry.d.ts +1 -1
- package/dist/telemetry.js.map +1 -1
- package/dist/tool-args.d.ts +4 -0
- package/dist/tool-args.js +16 -0
- package/dist/tool-args.js.map +1 -1
- package/dist/version-check.d.ts +72 -0
- package/dist/version-check.js +237 -0
- package/dist/version-check.js.map +1 -0
- package/dist/workspace-key-mode.js +22 -6
- package/dist/workspace-key-mode.js.map +1 -1
- package/package.json +4 -3
- package/dist/harness-identity.d.ts +0 -17
- package/dist/harness-identity.js +0 -105
- package/dist/harness-identity.js.map +0 -1
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { installHarnessIdentity } from '../harness-identity.js';
|
|
2
1
|
import { createServer } from 'node:http';
|
|
3
2
|
import { spawn } from 'node:child_process';
|
|
4
3
|
import { mkdtempSync, mkdirSync, writeFileSync, existsSync } from 'node:fs';
|
|
@@ -99,12 +98,9 @@ describe('aismemory MCP surfaces failed memory writes', () => {
|
|
|
99
98
|
throw new Error(`dist/index.js missing — run \`pnpm build\` first (looked at ${distPath})`);
|
|
100
99
|
}
|
|
101
100
|
const fakeHome = mkdtempSync(join(tmpdir(), 'aismem-writefail-'));
|
|
102
|
-
const manifest = join(fakeHome, 'harness.json');
|
|
103
|
-
writeFileSync(manifest, JSON.stringify({ version: 1, harness: 'test', agentId: 'agent-1' }));
|
|
104
|
-
installHarnessIdentity(manifest, fakeHome);
|
|
105
101
|
const aismemDir = join(fakeHome, '.aismemory');
|
|
106
|
-
mkdirSync(aismemDir, { recursive: true });
|
|
107
|
-
writeFileSync(join(aismemDir, 'credentials.json'), JSON.stringify({
|
|
102
|
+
mkdirSync(join(aismemDir, 'agents', 'agent-1'), { recursive: true });
|
|
103
|
+
writeFileSync(join(aismemDir, 'agents', 'agent-1', 'credentials.json'), JSON.stringify({
|
|
108
104
|
token: TOKEN,
|
|
109
105
|
agentId: 'agent-1',
|
|
110
106
|
tenantId: 'tenant-1',
|
|
@@ -117,8 +113,8 @@ describe('aismemory MCP surfaces failed memory writes', () => {
|
|
|
117
113
|
});
|
|
118
114
|
let proc = null;
|
|
119
115
|
try {
|
|
120
|
-
proc = spawn('node', [distPath
|
|
121
|
-
env: { ...process.env, HOME: fakeHome, AIS_URL: `http://127.0.0.1:${port}
|
|
116
|
+
proc = spawn('node', [distPath], {
|
|
117
|
+
env: { ...process.env, HOME: fakeHome, AIS_URL: `http://127.0.0.1:${port}`, AIS_AGENT_ID: 'agent-1' },
|
|
122
118
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
123
119
|
});
|
|
124
120
|
let stdoutBuf = '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-write-failure.test.js","sourceRoot":"","sources":["../../src/__tests__/memory-write-failure.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"memory-write-failure.test.js","sourceRoot":"","sources":["../../src/__tests__/memory-write-failure.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { installHarnessIdentity } from '../harness-identity.js';
|
|
2
1
|
/**
|
|
3
2
|
* CORBOT-3FF258DB: seeded v1 bearer + unregistered local DID key.
|
|
4
3
|
*
|
|
@@ -143,13 +142,11 @@ describe('NO_REGISTERED_KEYS falls back to non-stale disk bearer', () => {
|
|
|
143
142
|
recorded = [];
|
|
144
143
|
const token = mintProvisionalJwt();
|
|
145
144
|
const fakeHome = mkdtempSync(join(tmpdir(), 'aismem-no-reg-keys-'));
|
|
146
|
-
const manifest = join(fakeHome, 'harness.json');
|
|
147
|
-
writeFileSync(manifest, JSON.stringify({ version: 1, harness: 'test', agentId: AGENT_ID }));
|
|
148
|
-
installHarnessIdentity(manifest, fakeHome);
|
|
149
145
|
const aisDir = join(fakeHome, '.aismemory');
|
|
150
146
|
const keysDir = join(aisDir, 'keys');
|
|
151
147
|
mkdirSync(keysDir, { recursive: true });
|
|
152
|
-
|
|
148
|
+
mkdirSync(join(aisDir, 'agents', AGENT_ID), { recursive: true });
|
|
149
|
+
writeFileSync(join(aisDir, 'agents', AGENT_ID, 'credentials.json'), JSON.stringify({
|
|
153
150
|
token,
|
|
154
151
|
agentId: AGENT_ID,
|
|
155
152
|
tenantId: TENANT_ID,
|
|
@@ -159,8 +156,8 @@ describe('NO_REGISTERED_KEYS falls back to non-stale disk bearer', () => {
|
|
|
159
156
|
await generateAndSaveKeypair({ userId: USER_ID, userDid, keysDir });
|
|
160
157
|
let proc = null;
|
|
161
158
|
try {
|
|
162
|
-
proc = spawn('node', [distPath
|
|
163
|
-
env: { ...process.env, HOME: fakeHome, AIS_URL: `http://127.0.0.1:${port}
|
|
159
|
+
proc = spawn('node', [distPath], {
|
|
160
|
+
env: { ...process.env, HOME: fakeHome, AIS_URL: `http://127.0.0.1:${port}`, AIS_AGENT_ID: AGENT_ID },
|
|
164
161
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
165
162
|
});
|
|
166
163
|
let stdoutBuf = '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-registered-keys-disk-bearer-fallback.test.js","sourceRoot":"","sources":["../../src/__tests__/no-registered-keys-disk-bearer-fallback.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"no-registered-keys-disk-bearer-fallback.test.js","sourceRoot":"","sources":["../../src/__tests__/no-registered-keys-disk-bearer-fallback.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAA0D,MAAM,WAAW,CAAC;AACjG,OAAO,EAAE,KAAK,EAAuC,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAEnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,QAAQ,GAAG,sCAAsC,CAAC;AACxD,MAAM,SAAS,GAAG,sCAAsC,CAAC;AACzD,MAAM,OAAO,GAAG,sCAAsC,CAAC;AAQvD,SAAS,kBAAkB;IACzB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC/F,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CACzB,IAAI,CAAC,SAAS,CAAC;QACb,GAAG,EAAE,QAAQ;QACb,SAAS,EAAE,SAAS;QACpB,QAAQ,EAAE,QAAQ;QAClB,IAAI,EAAE,aAAa;KACpB,CAAC,CACH,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACxB,OAAO,GAAG,MAAM,IAAI,OAAO,sBAAsB,CAAC;AACpD,CAAC;AAED,SAAS,OAAO,CAAC,SAAwB,EAAE,EAAU,EAAE,KAAa;IAClE,OAAO,IAAI,OAAO,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,GAAS,EAAE;YACtB,IAAI,SAAS,EAAE,EAAE,CAAC;gBAChB,YAAY,EAAE,CAAC;gBACf,OAAO;YACT,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,EAAE,EAAE,CAAC;gBAC5B,MAAM,CAAC,IAAI,KAAK,CAAC,uBAAuB,KAAK,EAAE,CAAC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YACD,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACvB,CAAC,CAAC;QACF,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,GAAW,EAAE,EAAU;IAC5C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC;YAAE,SAAS;QAC3C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAE7B,CAAC;YACF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClB,OAAO;oBACL,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,KAAK,IAAI;oBACvC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE;iBAC7C,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACtC,CAAC;AAED,QAAQ,CAAC,wDAAwD,EAAE,GAAG,EAAE;IACtE,IAAI,OAA2B,CAAC;IAChC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,QAAQ,GAAsB,EAAE,CAAC;IAErC,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,OAAO,GAAG,YAAY,CAAC,CAAC,GAAoB,EAAE,GAAmB,EAAE,EAAE;YACnE,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBAClB,eAAe;YACjB,CAAC,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;gBACjB,QAAQ,CAAC,IAAI,CAAC;oBACZ,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;oBACxB,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE;oBAClB,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;iBAC1D,CAAC,CAAC;gBAEH,IAAI,GAAG,CAAC,GAAG,KAAK,oBAAoB,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC9D,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC;wBACb,OAAO,EAAE,IAAI;wBACb,IAAI,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;qBAC1F,CAAC,CACH,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,IAAI,GAAG,CAAC,GAAG,KAAK,oBAAoB,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC9D,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC;wBACb,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,OAAO,EAAE,oBAAoB,EAAE;qBACrE,CAAC,CACH,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,IAAI,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;oBAC/D,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC;wBACb,OAAO,EAAE,IAAI;wBACb,IAAI,EAAE;4BACJ,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;4BACtE,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;yBAC/B;qBACF,CAAC,CACH,CAAC;oBACF,OAAO;gBACT,CAAC;gBACD,IAAI,GAAG,CAAC,GAAG,KAAK,cAAc,QAAQ,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBACzE,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC,CAAC;oBAChF,OAAO;gBACT,CAAC;gBACD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC;oBACb,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE;wBACJ,EAAE,EAAE,QAAQ;wBACZ,IAAI,EAAE,kBAAkB;wBACxB,MAAM,EAAE,QAAQ;wBAChB,MAAM,EAAE,EAAE;wBACV,cAAc,EAAE,EAAE;wBAClB,KAAK,EAAE,EAAE;qBACV;iBACF,CAAC,CACH,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE;YAC5B,OAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;gBACnC,MAAM,IAAI,GAAG,OAAQ,CAAC,OAAO,EAAE,CAAC;gBAChC,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACvD,CAAC,EAAE,CAAC;YACN,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QACpE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,+DAA+D,QAAQ,GAAG,CAAC,CAAC;QAC9F,CAAC;QAED,QAAQ,GAAG,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,kBAAkB,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,qBAAqB,CAAC,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,aAAa,CACX,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EACpD,IAAI,CAAC,SAAS,CAAC;YACb,KAAK;YACL,OAAO,EAAE,QAAQ;YACjB,QAAQ,EAAE,SAAS;YACnB,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE;SACrE,CAAC,CACH,CAAC;QAEF,MAAM,OAAO,GAAG,2BAA2B,OAAO,EAAE,CAAC;QACrD,MAAM,sBAAsB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAEpE,IAAI,IAAI,GAA0C,IAAI,CAAC;QACvD,IAAI,CAAC;YACH,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE;gBAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,IAAI,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE;gBACpG,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC;YACH,IAAI,SAAS,GAAG,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE;gBACnC,SAAS,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;gBAC1B,UAAU;YACZ,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,KAAK,CAAC,KAAK,CACd,GAAG,IAAI,CAAC,SAAS,CAAC;gBAChB,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,CAAC;gBACL,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE;oBACN,eAAe,EAAE,YAAY;oBAC7B,YAAY,EAAE,EAAE;oBAChB,UAAU,EAAE,EAAE,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,OAAO,EAAE;iBACpE;aACF,CAAC,IAAI,CACP,CAAC;YACF,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAC;YAE/E,MAAM,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE;gBAC5B,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,KAAK,CAAC,KAAK,CACd,GAAG,IAAI,CAAC,SAAS,CAAC;gBAChB,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,CAAC;gBACL,MAAM,EAAE,YAAY;gBACpB,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,6BAA6B,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE;aACrG,CAAC,IAAI,CACP,CAAC;YACF,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC;YAE9E,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;YAErD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAC5B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,cAAc,QAAQ,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CACxE,CAAC;YACF,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,IAAI,EAAE,IAAI,EAAE,CAAC;YACb,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,EAAE,KAAK,CAAC,CAAC;AACZ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-process sign-in reuse — end-to-end (CORBOT-8F96A8EF).
|
|
3
|
+
*
|
|
4
|
+
* THE Jaire repro. Jaire runs through the published aismemory package, and
|
|
5
|
+
* its sign-in minted a new agent on every run — seven leftovers, and the same
|
|
6
|
+
* pattern behind 83 journey-probe orphans and ~723 harness agents.
|
|
7
|
+
*
|
|
8
|
+
* Cause: the server will reuse an earlier un-finalized flow's provisional
|
|
9
|
+
* agent if the client presents that flow's provisional token, but the client
|
|
10
|
+
* only ever held the token in a module-level variable. A stdio MCP server is
|
|
11
|
+
* respawned constantly, and a new process starts with that variable null, so
|
|
12
|
+
* the token was almost never sent and the server dutifully minted again.
|
|
13
|
+
*
|
|
14
|
+
* This drives the built binary as TWO SEPARATE PROCESSES sharing one home
|
|
15
|
+
* directory, against a fake Agent Identity Service that records what each
|
|
16
|
+
* sign-in presented. Process 2 must carry process 1's provisional token.
|
|
17
|
+
* Before the fix it carried nothing.
|
|
18
|
+
*/
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-process sign-in reuse — end-to-end (CORBOT-8F96A8EF).
|
|
3
|
+
*
|
|
4
|
+
* THE Jaire repro. Jaire runs through the published aismemory package, and
|
|
5
|
+
* its sign-in minted a new agent on every run — seven leftovers, and the same
|
|
6
|
+
* pattern behind 83 journey-probe orphans and ~723 harness agents.
|
|
7
|
+
*
|
|
8
|
+
* Cause: the server will reuse an earlier un-finalized flow's provisional
|
|
9
|
+
* agent if the client presents that flow's provisional token, but the client
|
|
10
|
+
* only ever held the token in a module-level variable. A stdio MCP server is
|
|
11
|
+
* respawned constantly, and a new process starts with that variable null, so
|
|
12
|
+
* the token was almost never sent and the server dutifully minted again.
|
|
13
|
+
*
|
|
14
|
+
* This drives the built binary as TWO SEPARATE PROCESSES sharing one home
|
|
15
|
+
* directory, against a fake Agent Identity Service that records what each
|
|
16
|
+
* sign-in presented. Process 2 must carry process 1's provisional token.
|
|
17
|
+
* Before the fix it carried nothing.
|
|
18
|
+
*/
|
|
19
|
+
import { createServer } from 'node:http';
|
|
20
|
+
import { spawn } from 'node:child_process';
|
|
21
|
+
import { mkdtempSync, rmSync, existsSync } from 'node:fs';
|
|
22
|
+
import { tmpdir } from 'node:os';
|
|
23
|
+
import { join, resolve } from 'node:path';
|
|
24
|
+
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
25
|
+
describe('aismemory sign-in reuses the provisional agent across processes', () => {
|
|
26
|
+
let server;
|
|
27
|
+
let port = 0;
|
|
28
|
+
const authorizeCalls = [];
|
|
29
|
+
beforeAll(async () => {
|
|
30
|
+
server = createServer((req, res) => {
|
|
31
|
+
req.on('data', () => { });
|
|
32
|
+
req.on('end', () => {
|
|
33
|
+
if (req.url === '/v1/oauth/device/authorize' && req.method === 'POST') {
|
|
34
|
+
authorizeCalls.push({ authorization: req.headers['authorization'] });
|
|
35
|
+
const n = authorizeCalls.length;
|
|
36
|
+
res.writeHead(200, { 'content-type': 'application/json' });
|
|
37
|
+
res.end(JSON.stringify({
|
|
38
|
+
success: true,
|
|
39
|
+
data: {
|
|
40
|
+
device_code: `device-${n}`,
|
|
41
|
+
user_code: `TEST-${String(n).padStart(4, '0')}`,
|
|
42
|
+
verification_uri: `http://127.0.0.1:${port}/activate`,
|
|
43
|
+
verification_uri_complete: `http://127.0.0.1:${port}/activate?user_code=TEST-${n}`,
|
|
44
|
+
expires_in: 1800,
|
|
45
|
+
interval: 1,
|
|
46
|
+
agent_id: `agent-${n}`,
|
|
47
|
+
provisional_tenant_id: `tenant-${n}`,
|
|
48
|
+
provisional_token: `provisional-token-${n}`,
|
|
49
|
+
},
|
|
50
|
+
}));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (req.url === '/v1/oauth/token' && req.method === 'POST') {
|
|
54
|
+
// Nobody clicks the bond link in this test: the flow stays
|
|
55
|
+
// un-finalized, which is exactly the state whose token must survive
|
|
56
|
+
// to the next process.
|
|
57
|
+
res.writeHead(400, { 'content-type': 'application/json' });
|
|
58
|
+
res.end(JSON.stringify({ error: 'authorization_pending' }));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
res.writeHead(404);
|
|
62
|
+
res.end();
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
await new Promise((done) => {
|
|
66
|
+
server.listen(0, '127.0.0.1', () => {
|
|
67
|
+
const addr = server.address();
|
|
68
|
+
if (addr && typeof addr === 'object')
|
|
69
|
+
port = addr.port;
|
|
70
|
+
done();
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
afterAll(async () => {
|
|
75
|
+
await new Promise((r) => server?.close(() => r()));
|
|
76
|
+
});
|
|
77
|
+
it('process 2 presents the provisional token process 1 was issued', async () => {
|
|
78
|
+
const distPath = resolve(__dirname, '..', '..', 'dist', 'index.js');
|
|
79
|
+
if (!existsSync(distPath)) {
|
|
80
|
+
throw new Error(`dist/index.js missing — run \`pnpm build\` first (looked at ${distPath})`);
|
|
81
|
+
}
|
|
82
|
+
// ONE home directory, shared by both runs — the same machine, same user.
|
|
83
|
+
const home = mkdtempSync(join(tmpdir(), 'aismem-xproc-'));
|
|
84
|
+
// Pin AIS_AGENT_ID rather than inheriting it: the credentials path (and
|
|
85
|
+
// so the pending-flow path) keys off it, and a fleet seat has a real one
|
|
86
|
+
// in the ambient environment. Pinning keeps the test hermetic and makes
|
|
87
|
+
// the expected file path computable.
|
|
88
|
+
const TEST_AGENT_ID = 'xproc-test-agent';
|
|
89
|
+
const pendingFile = join(home, '.aismemory', 'agents', TEST_AGENT_ID, 'pending-device-flow.json');
|
|
90
|
+
/** Spawn the binary, make one tool call to force sign-in, then stop it. */
|
|
91
|
+
async function runOnce(waitForPersist) {
|
|
92
|
+
let proc = null;
|
|
93
|
+
try {
|
|
94
|
+
proc = spawn('node', [distPath], {
|
|
95
|
+
env: {
|
|
96
|
+
...process.env,
|
|
97
|
+
HOME: home,
|
|
98
|
+
AIS_AGENT_ID: TEST_AGENT_ID,
|
|
99
|
+
AIS_URL: `http://127.0.0.1:${port}`,
|
|
100
|
+
},
|
|
101
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
102
|
+
});
|
|
103
|
+
let out = '';
|
|
104
|
+
proc.stdout.on('data', (d) => { out += d.toString(); });
|
|
105
|
+
proc.stderr.on('data', () => { });
|
|
106
|
+
proc.stdin.write(JSON.stringify({
|
|
107
|
+
jsonrpc: '2.0', id: 1, method: 'initialize',
|
|
108
|
+
params: {
|
|
109
|
+
protocolVersion: '2024-11-05',
|
|
110
|
+
capabilities: {},
|
|
111
|
+
clientInfo: { name: 'xproc-test', version: '0.0.0' },
|
|
112
|
+
},
|
|
113
|
+
}) + '\n');
|
|
114
|
+
await waitFor(() => out.includes('"id":1'), 15000, 'initialize response');
|
|
115
|
+
const before = authorizeCalls.length;
|
|
116
|
+
proc.stdin.write(JSON.stringify({
|
|
117
|
+
jsonrpc: '2.0', id: 2, method: 'tools/call',
|
|
118
|
+
params: { name: 'whoami', arguments: {} },
|
|
119
|
+
}) + '\n');
|
|
120
|
+
// The sign-in attempt is what we are measuring, not the tool result.
|
|
121
|
+
await waitFor(() => authorizeCalls.length > before, 30000, 'device authorize call');
|
|
122
|
+
// Run 1 must not be killed the instant the SERVER logs the call: the
|
|
123
|
+
// client writes the token to disk only after it reads the response.
|
|
124
|
+
// Killing on the server-side counter raced that write and made this
|
|
125
|
+
// test pass alone but fail under a loaded full-suite run.
|
|
126
|
+
if (waitForPersist) {
|
|
127
|
+
await waitFor(() => existsSync(pendingFile), 30000, 'provisional token persisted to disk');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
proc?.kill('SIGKILL');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
await runOnce(true);
|
|
136
|
+
await runOnce(false);
|
|
137
|
+
expect(authorizeCalls.length).toBeGreaterThanOrEqual(2);
|
|
138
|
+
// Run 1 is a genuine cold start: nothing to present, so it mints. Right.
|
|
139
|
+
expect(authorizeCalls[0]?.authorization).toBeUndefined();
|
|
140
|
+
// Run 2 is the bug. A brand-new process, but the SAME user and home —
|
|
141
|
+
// it must present run 1's provisional token so the server reuses that
|
|
142
|
+
// agent instead of minting an eighth Jaire.
|
|
143
|
+
expect(authorizeCalls[1]?.authorization).toBe('Bearer provisional-token-1');
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
rmSync(home, { recursive: true, force: true });
|
|
147
|
+
}
|
|
148
|
+
}, 180000);
|
|
149
|
+
});
|
|
150
|
+
async function waitFor(predicate, timeoutMs, what) {
|
|
151
|
+
const deadline = Date.now() + timeoutMs;
|
|
152
|
+
while (Date.now() < deadline) {
|
|
153
|
+
if (predicate())
|
|
154
|
+
return;
|
|
155
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
156
|
+
}
|
|
157
|
+
throw new Error(`Timed out after ${timeoutMs}ms waiting for ${what}`);
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=pending-device-flow-e2e.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending-device-flow-e2e.test.js","sourceRoot":"","sources":["../../src/__tests__/pending-device-flow-e2e.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pending device-flow persistence — unit tests (CORBOT-8F96A8EF).
|
|
3
|
+
*
|
|
4
|
+
* Jaire's sign-in minted a new agent on every run. The server already had the
|
|
5
|
+
* machinery to prevent it: present the provisional token from an earlier
|
|
6
|
+
* un-finalized flow and it reuses that provisional agent instead of minting
|
|
7
|
+
* another. The client just never presented one, because the token lived only
|
|
8
|
+
* in a module-level variable that is null in every freshly spawned process —
|
|
9
|
+
* and a stdio MCP server is spawned constantly.
|
|
10
|
+
*
|
|
11
|
+
* These cover the storage half. The cross-process proof (two separate node
|
|
12
|
+
* processes, one home directory, second run carries the first run's token)
|
|
13
|
+
* is in pending-device-flow-e2e.test.ts.
|
|
14
|
+
*/
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pending device-flow persistence — unit tests (CORBOT-8F96A8EF).
|
|
3
|
+
*
|
|
4
|
+
* Jaire's sign-in minted a new agent on every run. The server already had the
|
|
5
|
+
* machinery to prevent it: present the provisional token from an earlier
|
|
6
|
+
* un-finalized flow and it reuses that provisional agent instead of minting
|
|
7
|
+
* another. The client just never presented one, because the token lived only
|
|
8
|
+
* in a module-level variable that is null in every freshly spawned process —
|
|
9
|
+
* and a stdio MCP server is spawned constantly.
|
|
10
|
+
*
|
|
11
|
+
* These cover the storage half. The cross-process proof (two separate node
|
|
12
|
+
* processes, one home directory, second run carries the first run's token)
|
|
13
|
+
* is in pending-device-flow-e2e.test.ts.
|
|
14
|
+
*/
|
|
15
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
16
|
+
import { mkdtempSync, rmSync, writeFileSync, mkdirSync, statSync, existsSync } from 'node:fs';
|
|
17
|
+
import { tmpdir } from 'node:os';
|
|
18
|
+
import { join } from 'node:path';
|
|
19
|
+
import { clearPendingDeviceFlow, loadPendingDeviceFlow, pendingDeviceFlowPath, savePendingDeviceFlow, } from '../pending-device-flow.js';
|
|
20
|
+
let home;
|
|
21
|
+
function flow(overrides = {}) {
|
|
22
|
+
return {
|
|
23
|
+
provisionalToken: 'provisional-token-from-run-1',
|
|
24
|
+
agentId: 'agent-1',
|
|
25
|
+
provisionalTenantId: 'tenant-1',
|
|
26
|
+
startedAt: new Date().toISOString(),
|
|
27
|
+
...overrides,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
home = mkdtempSync(join(tmpdir(), 'aismem-pending-'));
|
|
32
|
+
delete process.env['AIS_CREDENTIALS_FILE'];
|
|
33
|
+
delete process.env['AIS_AGENT_ID'];
|
|
34
|
+
});
|
|
35
|
+
afterEach(() => {
|
|
36
|
+
rmSync(home, { recursive: true, force: true });
|
|
37
|
+
delete process.env['AIS_CREDENTIALS_FILE'];
|
|
38
|
+
delete process.env['AIS_AGENT_ID'];
|
|
39
|
+
});
|
|
40
|
+
describe('pending device flow persistence [CORBOT-8F96A8EF]', () => {
|
|
41
|
+
it('round-trips the provisional token so a later process can present it', () => {
|
|
42
|
+
savePendingDeviceFlow(flow(), home);
|
|
43
|
+
// A different process would call load() with no in-memory state at all.
|
|
44
|
+
const loaded = loadPendingDeviceFlow(home);
|
|
45
|
+
expect(loaded?.provisionalToken).toBe('provisional-token-from-run-1');
|
|
46
|
+
expect(loaded?.agentId).toBe('agent-1');
|
|
47
|
+
});
|
|
48
|
+
it('returns null when nothing has been persisted, so sign-in falls back to minting', () => {
|
|
49
|
+
expect(loadPendingDeviceFlow(home)).toBeNull();
|
|
50
|
+
});
|
|
51
|
+
it('writes the file 0600 — it is a bearer proof-of-session, not public', () => {
|
|
52
|
+
savePendingDeviceFlow(flow(), home);
|
|
53
|
+
const mode = statSync(pendingDeviceFlowPath(home)).mode & 0o777;
|
|
54
|
+
expect(mode).toBe(0o600);
|
|
55
|
+
});
|
|
56
|
+
it('discards a token older than the 7-day server-side claim window', () => {
|
|
57
|
+
const eightDaysAgo = new Date(Date.now() - 8 * 24 * 60 * 60 * 1000).toISOString();
|
|
58
|
+
savePendingDeviceFlow(flow({ startedAt: eightDaysAgo }), home);
|
|
59
|
+
// The server would reject it anyway; sending it just wastes a round trip.
|
|
60
|
+
expect(loadPendingDeviceFlow(home)).toBeNull();
|
|
61
|
+
});
|
|
62
|
+
it('keeps a token still inside the claim window', () => {
|
|
63
|
+
const sixDaysAgo = new Date(Date.now() - 6 * 24 * 60 * 60 * 1000).toISOString();
|
|
64
|
+
savePendingDeviceFlow(flow({ startedAt: sixDaysAgo }), home);
|
|
65
|
+
expect(loadPendingDeviceFlow(home)?.provisionalToken).toBe('provisional-token-from-run-1');
|
|
66
|
+
});
|
|
67
|
+
it('returns null on a malformed file rather than throwing', () => {
|
|
68
|
+
const file = pendingDeviceFlowPath(home);
|
|
69
|
+
mkdirSync(join(home, '.aismemory'), { recursive: true });
|
|
70
|
+
writeFileSync(file, '{ not json');
|
|
71
|
+
// Sign-in must never be broken by a corrupt cache file.
|
|
72
|
+
expect(loadPendingDeviceFlow(home)).toBeNull();
|
|
73
|
+
});
|
|
74
|
+
it('returns null when the token field is missing or empty', () => {
|
|
75
|
+
savePendingDeviceFlow(flow({ provisionalToken: '' }), home);
|
|
76
|
+
expect(loadPendingDeviceFlow(home)).toBeNull();
|
|
77
|
+
});
|
|
78
|
+
it('clears the record once the bond completes', () => {
|
|
79
|
+
savePendingDeviceFlow(flow(), home);
|
|
80
|
+
expect(existsSync(pendingDeviceFlowPath(home))).toBe(true);
|
|
81
|
+
clearPendingDeviceFlow(home);
|
|
82
|
+
// A token for an already-bonded agent is rejected server-side, which
|
|
83
|
+
// would send the next sign-in straight back to minting.
|
|
84
|
+
expect(existsSync(pendingDeviceFlowPath(home))).toBe(false);
|
|
85
|
+
expect(loadPendingDeviceFlow(home)).toBeNull();
|
|
86
|
+
});
|
|
87
|
+
it('clearing when nothing is stored is a no-op, not an error', () => {
|
|
88
|
+
expect(() => clearPendingDeviceFlow(home)).not.toThrow();
|
|
89
|
+
});
|
|
90
|
+
it('follows the per-agent credential isolation AIS_AGENT_ID already implies', () => {
|
|
91
|
+
process.env['AIS_AGENT_ID'] = 'agent-alpha';
|
|
92
|
+
const alphaPath = pendingDeviceFlowPath(home);
|
|
93
|
+
process.env['AIS_AGENT_ID'] = 'agent-beta';
|
|
94
|
+
const betaPath = pendingDeviceFlowPath(home);
|
|
95
|
+
// Two agents sharing a home must not share a provisional token, or one
|
|
96
|
+
// would bind over the other.
|
|
97
|
+
expect(alphaPath).not.toBe(betaPath);
|
|
98
|
+
expect(alphaPath).toContain('agent-alpha');
|
|
99
|
+
expect(betaPath).toContain('agent-beta');
|
|
100
|
+
});
|
|
101
|
+
it('sits beside credentials.json, not inside it', () => {
|
|
102
|
+
// Separate files: a half-finished sign-in must never be mistaken for a
|
|
103
|
+
// live bonded credential.
|
|
104
|
+
expect(pendingDeviceFlowPath(home)).toContain('pending-device-flow.json');
|
|
105
|
+
expect(pendingDeviceFlowPath(home)).not.toContain('credentials.json');
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=pending-device-flow.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending-device-flow.test.js","sourceRoot":"","sources":["../../src/__tests__/pending-device-flow.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { installHarnessIdentity } from '../harness-identity.js';
|
|
2
1
|
/**
|
|
3
2
|
* Acceptance: register-shaped provisional bearer → MCP remember.
|
|
4
3
|
*
|
|
@@ -128,12 +127,9 @@ describe('register-shaped provisional token → MCP remember', () => {
|
|
|
128
127
|
recorded = [];
|
|
129
128
|
const token = mintProvisionalJwt();
|
|
130
129
|
const fakeHome = mkdtempSync(join(tmpdir(), 'aismem-prov-remember-'));
|
|
131
|
-
const manifest = join(fakeHome, 'harness.json');
|
|
132
|
-
writeFileSync(manifest, JSON.stringify({ version: 1, harness: 'test', agentId: AGENT_ID }));
|
|
133
|
-
installHarnessIdentity(manifest, fakeHome);
|
|
134
130
|
const aisDir = join(fakeHome, '.aismemory');
|
|
135
|
-
mkdirSync(aisDir, { recursive: true });
|
|
136
|
-
writeFileSync(join(aisDir, 'credentials.json'), JSON.stringify({
|
|
131
|
+
mkdirSync(join(aisDir, 'agents', AGENT_ID), { recursive: true });
|
|
132
|
+
writeFileSync(join(aisDir, 'agents', AGENT_ID, 'credentials.json'), JSON.stringify({
|
|
137
133
|
token,
|
|
138
134
|
agentId: AGENT_ID,
|
|
139
135
|
tenantId: TENANT_ID,
|
|
@@ -141,8 +137,8 @@ describe('register-shaped provisional token → MCP remember', () => {
|
|
|
141
137
|
}));
|
|
142
138
|
let proc = null;
|
|
143
139
|
try {
|
|
144
|
-
proc = spawn('node', [distPath
|
|
145
|
-
env: { ...process.env, HOME: fakeHome, AIS_URL: `http://127.0.0.1:${port}
|
|
140
|
+
proc = spawn('node', [distPath], {
|
|
141
|
+
env: { ...process.env, HOME: fakeHome, AIS_URL: `http://127.0.0.1:${port}`, AIS_AGENT_ID: AGENT_ID },
|
|
146
142
|
stdio: ['pipe', 'pipe', 'pipe'],
|
|
147
143
|
});
|
|
148
144
|
let stdoutBuf = '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provisional-register-mcp-remember.test.js","sourceRoot":"","sources":["../../src/__tests__/provisional-register-mcp-remember.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"provisional-register-mcp-remember.test.js","sourceRoot":"","sources":["../../src/__tests__/provisional-register-mcp-remember.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression test for CORBOT-0DA63AAB.
|
|
3
|
+
*
|
|
4
|
+
* aismemory 0.7.3 dropped the documented AIS_URL default in getAisUrl(),
|
|
5
|
+
* so every client configured exactly as the README Quick Start shows it —
|
|
6
|
+
* `npx aismemory` with no AIS_URL set — failed its first `remember`,
|
|
7
|
+
* `recall`, or `inbox_read` call with "AIS_URL is not configured", while
|
|
8
|
+
* 499/499 unit tests stayed green. 0.7.4 restored the fallback. This test
|
|
9
|
+
* reproduces the README Quick Start environment exactly (only the two npm
|
|
10
|
+
* flags the config's `env` block sets — no AIS_URL, no agent-key vars) and
|
|
11
|
+
* exercises the HTTP paths those three tools use, so a future regression in
|
|
12
|
+
* the default fails here instead of shipping unnoticed.
|
|
13
|
+
*/
|
|
14
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
15
|
+
import { aisGet, aisPost } from '../ais-http.js';
|
|
16
|
+
const README_QUICKSTART_ENV_KEYS = [
|
|
17
|
+
'AIS_URL',
|
|
18
|
+
'AIS_AGENT_API_KEY',
|
|
19
|
+
'AIS_AGENT_ID',
|
|
20
|
+
'AIS_CREDENTIALS_FILE',
|
|
21
|
+
];
|
|
22
|
+
const PRODUCTION_DEFAULT_AIS_URL = 'https://ais.agentsandswarms.ai';
|
|
23
|
+
const savedEnv = new Map();
|
|
24
|
+
function jsonResponse(body, status = 200) {
|
|
25
|
+
return new Response(JSON.stringify(body), { status });
|
|
26
|
+
}
|
|
27
|
+
describe('README Quick Start default AIS_URL (CORBOT-0DA63AAB)', () => {
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
savedEnv.clear();
|
|
30
|
+
for (const key of README_QUICKSTART_ENV_KEYS) {
|
|
31
|
+
savedEnv.set(key, process.env[key]);
|
|
32
|
+
delete process.env[key];
|
|
33
|
+
}
|
|
34
|
+
// The README Quick Start `env` block sets only these two npm flags —
|
|
35
|
+
// never AIS_URL — so a client following it launches with exactly this.
|
|
36
|
+
process.env['npm_config_audit'] = 'false';
|
|
37
|
+
process.env['npm_config_fund'] = 'false';
|
|
38
|
+
});
|
|
39
|
+
afterEach(() => {
|
|
40
|
+
for (const [key, value] of savedEnv) {
|
|
41
|
+
if (value === undefined)
|
|
42
|
+
delete process.env[key];
|
|
43
|
+
else
|
|
44
|
+
process.env[key] = value;
|
|
45
|
+
}
|
|
46
|
+
delete process.env['npm_config_audit'];
|
|
47
|
+
delete process.env['npm_config_fund'];
|
|
48
|
+
});
|
|
49
|
+
it('resolves the configured base URL to the production default', async () => {
|
|
50
|
+
const fetchCalls = [];
|
|
51
|
+
globalThis.fetch = (async (input) => {
|
|
52
|
+
fetchCalls.push(String(input));
|
|
53
|
+
return jsonResponse({ success: true });
|
|
54
|
+
});
|
|
55
|
+
await aisPost('/v1/agents/a1/memory', { content: 'x' }, 'token');
|
|
56
|
+
expect(fetchCalls[0]).toBe(`${PRODUCTION_DEFAULT_AIS_URL}/v1/agents/a1/memory`);
|
|
57
|
+
});
|
|
58
|
+
it('constructs the HTTP client for remember without throwing', async () => {
|
|
59
|
+
globalThis.fetch = (async () => jsonResponse({ success: true, data: { id: 'mem-1' } }));
|
|
60
|
+
await expect(aisPost('/v1/agents/a1/memory', { content: 'hello', type: 'fact' }, 'token')).resolves.toEqual({ success: true, data: { id: 'mem-1' } });
|
|
61
|
+
});
|
|
62
|
+
it('constructs the HTTP client for recall without throwing', async () => {
|
|
63
|
+
globalThis.fetch = (async () => jsonResponse({ success: true, data: { memories: [] } }));
|
|
64
|
+
await expect(aisGet('/v1/agents/a1/memory?query=hello', 'token')).resolves.toEqual({
|
|
65
|
+
success: true,
|
|
66
|
+
data: { memories: [] },
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
it('constructs the HTTP client for inbox_read without throwing', async () => {
|
|
70
|
+
globalThis.fetch = (async () => jsonResponse({
|
|
71
|
+
success: true,
|
|
72
|
+
data: { messages: [], nextCursor: null, hasMore: false },
|
|
73
|
+
}));
|
|
74
|
+
await expect(aisGet('/v1/agents/a1/inbox?limit=20', 'token')).resolves.toEqual({
|
|
75
|
+
success: true,
|
|
76
|
+
data: { messages: [], nextCursor: null, hasMore: false },
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=readme-quickstart-default-ais-url.test.js.map
|