aismemory 0.4.0 → 0.5.1
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/dist/__tests__/auth-staleness.test.d.ts +9 -0
- package/dist/__tests__/auth-staleness.test.js +46 -0
- package/dist/__tests__/auth-staleness.test.js.map +1 -0
- package/dist/__tests__/auto-handoff.test.js +108 -2
- package/dist/__tests__/auto-handoff.test.js.map +1 -1
- package/dist/__tests__/config.test.js +6 -3
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/__tests__/device-flow-recovery.test.d.ts +1 -0
- package/dist/__tests__/device-flow-recovery.test.js +206 -0
- package/dist/__tests__/device-flow-recovery.test.js.map +1 -0
- package/dist/__tests__/env-agent.test.d.ts +1 -0
- package/dist/__tests__/env-agent.test.js +19 -0
- package/dist/__tests__/env-agent.test.js.map +1 -0
- package/dist/__tests__/existing-hashes.test.d.ts +1 -0
- package/dist/__tests__/existing-hashes.test.js +122 -0
- package/dist/__tests__/existing-hashes.test.js.map +1 -0
- package/dist/__tests__/hydration.test.js +38 -0
- package/dist/__tests__/hydration.test.js.map +1 -1
- package/dist/__tests__/key-auth.test.d.ts +1 -0
- package/dist/__tests__/key-auth.test.js +284 -0
- package/dist/__tests__/key-auth.test.js.map +1 -0
- package/dist/__tests__/local-mirror.test.js +4 -0
- package/dist/__tests__/local-mirror.test.js.map +1 -1
- package/dist/__tests__/oauth-credentials.test.d.ts +1 -0
- package/dist/__tests__/oauth-credentials.test.js +29 -0
- package/dist/__tests__/oauth-credentials.test.js.map +1 -0
- package/dist/__tests__/pipeline-ingestion.test.js +112 -1
- package/dist/__tests__/pipeline-ingestion.test.js.map +1 -1
- package/dist/__tests__/refresh.test.js +24 -0
- package/dist/__tests__/refresh.test.js.map +1 -1
- package/dist/__tests__/sync-memory-cli.test.d.ts +1 -0
- package/dist/__tests__/sync-memory-cli.test.js +200 -0
- package/dist/__tests__/sync-memory-cli.test.js.map +1 -0
- package/dist/__tests__/telemetry.test.d.ts +1 -0
- package/dist/__tests__/telemetry.test.js +67 -0
- package/dist/__tests__/telemetry.test.js.map +1 -0
- package/dist/__tests__/token-expiry-reauth.test.d.ts +1 -0
- package/dist/__tests__/token-expiry-reauth.test.js +201 -0
- package/dist/__tests__/token-expiry-reauth.test.js.map +1 -0
- package/dist/__tests__/tool-args.test.d.ts +1 -0
- package/dist/__tests__/tool-args.test.js +78 -0
- package/dist/__tests__/tool-args.test.js.map +1 -0
- package/dist/auth-staleness.d.ts +27 -0
- package/dist/auth-staleness.js +41 -0
- package/dist/auth-staleness.js.map +1 -0
- package/dist/auto-handoff.d.ts +2 -0
- package/dist/auto-handoff.js +40 -16
- package/dist/auto-handoff.js.map +1 -1
- package/dist/cli/enable-key-auth.d.ts +1 -0
- package/dist/cli/enable-key-auth.js +131 -0
- package/dist/cli/enable-key-auth.js.map +1 -0
- package/dist/cli/sync-memory.js +31 -36
- package/dist/cli/sync-memory.js.map +1 -1
- package/dist/config.js +4 -1
- package/dist/config.js.map +1 -1
- package/dist/env-agent.d.ts +10 -0
- package/dist/env-agent.js +14 -0
- package/dist/env-agent.js.map +1 -0
- package/dist/hydration.js +54 -3
- package/dist/hydration.js.map +1 -1
- package/dist/index.js +314 -118
- package/dist/index.js.map +1 -1
- package/dist/key-auth.d.ts +66 -0
- package/dist/key-auth.js +179 -0
- package/dist/key-auth.js.map +1 -0
- package/dist/local-mirror.d.ts +5 -0
- package/dist/local-mirror.js +72 -14
- package/dist/local-mirror.js.map +1 -1
- package/dist/oauth-credentials.d.ts +14 -0
- package/dist/oauth-credentials.js +35 -0
- package/dist/oauth-credentials.js.map +1 -0
- package/dist/pipeline/bulk-store.d.ts +46 -0
- package/dist/pipeline/bulk-store.js +165 -0
- package/dist/pipeline/bulk-store.js.map +1 -0
- package/dist/pipeline/existing-hashes.d.ts +20 -0
- package/dist/pipeline/existing-hashes.js +111 -0
- package/dist/pipeline/existing-hashes.js.map +1 -0
- package/dist/pipeline/ingestion.d.ts +8 -4
- package/dist/pipeline/ingestion.js +36 -8
- package/dist/pipeline/ingestion.js.map +1 -1
- package/dist/telemetry.d.ts +22 -0
- package/dist/telemetry.js +28 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/tool-args.d.ts +52 -0
- package/dist/tool-args.js +78 -0
- package/dist/tool-args.js.map +1 -0
- package/dist/trust-ledger.js +2 -2
- package/dist/trust-ledger.js.map +1 -1
- package/package.json +9 -4
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { MAX_MEMORY_CONTENT_LENGTH, parseAgentLoadArgs, parseEmptyToolArgs, parseHandoffArgs, parseRecallArgs, parseRememberArgs, } from '../tool-args.js';
|
|
3
|
+
describe('parseRememberArgs', () => {
|
|
4
|
+
it('accepts valid remember payload', () => {
|
|
5
|
+
const parsed = parseRememberArgs({
|
|
6
|
+
content: 'hello',
|
|
7
|
+
type: 'fact',
|
|
8
|
+
importance: 0.8,
|
|
9
|
+
});
|
|
10
|
+
expect(parsed).toEqual({ content: 'hello', type: 'fact', importance: 0.8 });
|
|
11
|
+
});
|
|
12
|
+
it('applies defaults for optional fields', () => {
|
|
13
|
+
expect(parseRememberArgs({ content: 'x' })).toEqual({
|
|
14
|
+
content: 'x',
|
|
15
|
+
type: 'context',
|
|
16
|
+
importance: 0.5,
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
it('rejects missing content', () => {
|
|
20
|
+
expect(() => parseRememberArgs({})).toThrow(/content is required/);
|
|
21
|
+
});
|
|
22
|
+
it('rejects invalid memory type', () => {
|
|
23
|
+
expect(() => parseRememberArgs({ content: 'x', type: 'invalid' })).toThrow();
|
|
24
|
+
});
|
|
25
|
+
it('rejects importance outside 0-1', () => {
|
|
26
|
+
expect(() => parseRememberArgs({ content: 'x', importance: 2 })).toThrow();
|
|
27
|
+
});
|
|
28
|
+
it('rejects oversized content', () => {
|
|
29
|
+
expect(() => parseRememberArgs({ content: 'x'.repeat(MAX_MEMORY_CONTENT_LENGTH + 1) })).toThrow(/exceeds maximum length/);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe('parseRecallArgs', () => {
|
|
33
|
+
it('requires query', () => {
|
|
34
|
+
expect(() => parseRecallArgs({})).toThrow(/query is required/);
|
|
35
|
+
});
|
|
36
|
+
it('accepts query with optional limit and type', () => {
|
|
37
|
+
expect(parseRecallArgs({ query: 'cats', limit: 5, type: 'fact' })).toEqual({
|
|
38
|
+
query: 'cats',
|
|
39
|
+
limit: 5,
|
|
40
|
+
type: 'fact',
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
it('rejects limit above MAX_QUERY_LIMIT', () => {
|
|
44
|
+
expect(() => parseRecallArgs({ query: 'x', limit: 101 })).toThrow();
|
|
45
|
+
});
|
|
46
|
+
it('rejects oversized query', () => {
|
|
47
|
+
expect(() => parseRecallArgs({ query: 'q'.repeat(MAX_MEMORY_CONTENT_LENGTH + 1) })).toThrow(/exceeds maximum length/);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe('parseHandoffArgs', () => {
|
|
51
|
+
it('accepts empty handoff args', () => {
|
|
52
|
+
expect(parseHandoffArgs({})).toEqual({});
|
|
53
|
+
});
|
|
54
|
+
it('accepts summary and keyLearnings', () => {
|
|
55
|
+
expect(parseHandoffArgs({ summary: 'done', keyLearnings: ['a', 'b'] })).toEqual({ summary: 'done', keyLearnings: ['a', 'b'] });
|
|
56
|
+
});
|
|
57
|
+
it('rejects too many keyLearnings', () => {
|
|
58
|
+
expect(() => parseHandoffArgs({ keyLearnings: Array.from({ length: 101 }, () => 'x') })).toThrow(/maximum of 100/);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('parseAgentLoadArgs', () => {
|
|
62
|
+
it('requires non-empty query', () => {
|
|
63
|
+
expect(() => parseAgentLoadArgs({})).toThrow(/query is required/);
|
|
64
|
+
expect(() => parseAgentLoadArgs({ query: ' ' })).toThrow(/query is required/);
|
|
65
|
+
});
|
|
66
|
+
it('trims whitespace from query', () => {
|
|
67
|
+
expect(parseAgentLoadArgs({ query: ' Corbot ' })).toEqual({ query: 'Corbot' });
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('parseEmptyToolArgs', () => {
|
|
71
|
+
it('accepts empty object for no-arg tools', () => {
|
|
72
|
+
expect(parseEmptyToolArgs({})).toEqual({});
|
|
73
|
+
});
|
|
74
|
+
it('rejects unexpected keys', () => {
|
|
75
|
+
expect(() => parseEmptyToolArgs({ extra: true })).toThrow();
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=tool-args.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-args.test.js","sourceRoot":"","sources":["../../src/__tests__/tool-args.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credential staleness + auth-error detection for the MCP re-auth loop.
|
|
3
|
+
*
|
|
4
|
+
* key-auth.ts promises: "When the JWT expires (or AIS rotates JWT_SECRET)
|
|
5
|
+
* the client silently re-runs challenge/prove. The user notices nothing."
|
|
6
|
+
* These helpers are the detection half of that promise (CORBOT-A5BBD580):
|
|
7
|
+
* ensureCredentials() uses isCredsStale() to refuse near-expiry cached
|
|
8
|
+
* creds, and the tool dispatcher uses isAuthErrorResult() to clear creds
|
|
9
|
+
* and retry once when AIS rejects a token mid-session.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Safety margin before the recorded expiry at which cached credentials are
|
|
13
|
+
* treated as stale. Five minutes comfortably covers clock skew between the
|
|
14
|
+
* client and AIS plus the duration of any single tool call.
|
|
15
|
+
*/
|
|
16
|
+
export declare const CREDS_STALENESS_MARGIN_MS: number;
|
|
17
|
+
/**
|
|
18
|
+
* True when credentials expiring at `expiresAt` should no longer be used at
|
|
19
|
+
* time `nowMs`. Unparseable expiry timestamps are treated as stale — a
|
|
20
|
+
* re-auth is cheap, silently using a token of unknown validity is not.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isCredsStale(expiresAt: string, nowMs: number, marginMs?: number): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* True when an AIS response body is a token-rejection error
|
|
25
|
+
* (TOKEN_EXPIRED or INVALID_TOKEN) — the signal to re-auth and retry.
|
|
26
|
+
*/
|
|
27
|
+
export declare function isAuthErrorResult(result: unknown): boolean;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credential staleness + auth-error detection for the MCP re-auth loop.
|
|
3
|
+
*
|
|
4
|
+
* key-auth.ts promises: "When the JWT expires (or AIS rotates JWT_SECRET)
|
|
5
|
+
* the client silently re-runs challenge/prove. The user notices nothing."
|
|
6
|
+
* These helpers are the detection half of that promise (CORBOT-A5BBD580):
|
|
7
|
+
* ensureCredentials() uses isCredsStale() to refuse near-expiry cached
|
|
8
|
+
* creds, and the tool dispatcher uses isAuthErrorResult() to clear creds
|
|
9
|
+
* and retry once when AIS rejects a token mid-session.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Safety margin before the recorded expiry at which cached credentials are
|
|
13
|
+
* treated as stale. Five minutes comfortably covers clock skew between the
|
|
14
|
+
* client and AIS plus the duration of any single tool call.
|
|
15
|
+
*/
|
|
16
|
+
export const CREDS_STALENESS_MARGIN_MS = 5 * 60 * 1000;
|
|
17
|
+
/**
|
|
18
|
+
* True when credentials expiring at `expiresAt` should no longer be used at
|
|
19
|
+
* time `nowMs`. Unparseable expiry timestamps are treated as stale — a
|
|
20
|
+
* re-auth is cheap, silently using a token of unknown validity is not.
|
|
21
|
+
*/
|
|
22
|
+
export function isCredsStale(expiresAt, nowMs, marginMs = CREDS_STALENESS_MARGIN_MS) {
|
|
23
|
+
const expiresMs = Date.parse(expiresAt);
|
|
24
|
+
if (Number.isNaN(expiresMs))
|
|
25
|
+
return true;
|
|
26
|
+
return expiresMs - nowMs <= marginMs;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* True when an AIS response body is a token-rejection error
|
|
30
|
+
* (TOKEN_EXPIRED or INVALID_TOKEN) — the signal to re-auth and retry.
|
|
31
|
+
*/
|
|
32
|
+
export function isAuthErrorResult(result) {
|
|
33
|
+
if (typeof result !== 'object' || result === null)
|
|
34
|
+
return false;
|
|
35
|
+
const r = result;
|
|
36
|
+
if (r.success !== false)
|
|
37
|
+
return false;
|
|
38
|
+
const code = r.error?.code;
|
|
39
|
+
return code === 'TOKEN_EXPIRED' || code === 'INVALID_TOKEN';
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=auth-staleness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-staleness.js","sourceRoot":"","sources":["../src/auth-staleness.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEvD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,SAAiB,EACjB,KAAa,EACb,WAAmB,yBAAyB;IAE5C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,SAAS,GAAG,KAAK,IAAI,QAAQ,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAChE,MAAM,CAAC,GAAG,MAA0D,CAAC;IACrE,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC;IAC3B,OAAO,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,eAAe,CAAC;AAC9D,CAAC"}
|
package/dist/auto-handoff.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
export declare class ActivityTracker {
|
|
2
2
|
private toolCounts;
|
|
3
3
|
private storedMemories;
|
|
4
|
+
private storedMemoryCount;
|
|
4
5
|
recordToolUse(toolName: string): void;
|
|
5
6
|
recordMemoryStored(content: string): void;
|
|
6
7
|
getToolCounts(): Record<string, number>;
|
|
8
|
+
getStoredMemoryCount(): number;
|
|
7
9
|
getStoredMemories(): string[];
|
|
8
10
|
hasActivity(): boolean;
|
|
9
11
|
}
|
package/dist/auto-handoff.js
CHANGED
|
@@ -1,15 +1,30 @@
|
|
|
1
|
+
/** Max verbatim snippets kept for handoff keyLearnings (FIFO). */
|
|
2
|
+
const MAX_STORED_MEMORY_SNIPPETS = 10;
|
|
3
|
+
/** Max chars per snippet to bound handoff payload size. */
|
|
4
|
+
const MAX_STORED_MEMORY_SNIPPET_CHARS = 512;
|
|
1
5
|
export class ActivityTracker {
|
|
2
6
|
toolCounts = {};
|
|
3
7
|
storedMemories = [];
|
|
8
|
+
storedMemoryCount = 0;
|
|
4
9
|
recordToolUse(toolName) {
|
|
5
10
|
this.toolCounts[toolName] = (this.toolCounts[toolName] ?? 0) + 1;
|
|
6
11
|
}
|
|
7
12
|
recordMemoryStored(content) {
|
|
8
|
-
this.
|
|
13
|
+
this.storedMemoryCount++;
|
|
14
|
+
const snippet = content.length > MAX_STORED_MEMORY_SNIPPET_CHARS
|
|
15
|
+
? `${content.slice(0, MAX_STORED_MEMORY_SNIPPET_CHARS)}…`
|
|
16
|
+
: content;
|
|
17
|
+
this.storedMemories.push(snippet);
|
|
18
|
+
if (this.storedMemories.length > MAX_STORED_MEMORY_SNIPPETS) {
|
|
19
|
+
this.storedMemories.shift();
|
|
20
|
+
}
|
|
9
21
|
}
|
|
10
22
|
getToolCounts() {
|
|
11
23
|
return { ...this.toolCounts };
|
|
12
24
|
}
|
|
25
|
+
getStoredMemoryCount() {
|
|
26
|
+
return this.storedMemoryCount;
|
|
27
|
+
}
|
|
13
28
|
getStoredMemories() {
|
|
14
29
|
return [...this.storedMemories];
|
|
15
30
|
}
|
|
@@ -24,30 +39,39 @@ export function buildHandoffPayload(tracker) {
|
|
|
24
39
|
const toolParts = Object.entries(tracker.getToolCounts())
|
|
25
40
|
.map(([name, count]) => `${name} (${count})`)
|
|
26
41
|
.join(', ');
|
|
42
|
+
const memoryCount = tracker.getStoredMemoryCount();
|
|
27
43
|
const memories = tracker.getStoredMemories();
|
|
28
|
-
const summary = `Used tools: ${toolParts}.${
|
|
44
|
+
const summary = `Used tools: ${toolParts}.${memoryCount > 0 ? ` Stored ${memoryCount} memories.` : ''}`;
|
|
29
45
|
return { summary, keyLearnings: memories };
|
|
30
46
|
}
|
|
47
|
+
const HANDOFF_FETCH_TIMEOUT_MS = 5_000;
|
|
31
48
|
export function setupAutoHandoff(aisUrl, agentId, token, tracker, onBeforeExit) {
|
|
32
|
-
|
|
49
|
+
let exiting = false;
|
|
50
|
+
const doHandoff = async () => {
|
|
51
|
+
if (exiting)
|
|
52
|
+
return;
|
|
53
|
+
exiting = true;
|
|
33
54
|
if (!tracker.hasActivity())
|
|
34
55
|
return;
|
|
35
56
|
const payload = buildHandoffPayload(tracker);
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
57
|
+
try {
|
|
58
|
+
await fetch(`${aisUrl}/v1/agents/${agentId}/handoff`, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` },
|
|
61
|
+
body: JSON.stringify(payload),
|
|
62
|
+
signal: AbortSignal.timeout(HANDOFF_FETCH_TIMEOUT_MS),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Best-effort — still exit if POST fails or times out
|
|
67
|
+
}
|
|
41
68
|
if (onBeforeExit)
|
|
42
69
|
onBeforeExit();
|
|
43
70
|
};
|
|
44
|
-
|
|
45
|
-
doHandoff();
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
process.on('SIGINT',
|
|
49
|
-
doHandoff();
|
|
50
|
-
process.exit(0);
|
|
51
|
-
});
|
|
71
|
+
const onSignal = () => {
|
|
72
|
+
void doHandoff().finally(() => process.exit(0));
|
|
73
|
+
};
|
|
74
|
+
process.on('SIGTERM', onSignal);
|
|
75
|
+
process.on('SIGINT', onSignal);
|
|
52
76
|
}
|
|
53
77
|
//# sourceMappingURL=auto-handoff.js.map
|
package/dist/auto-handoff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-handoff.js","sourceRoot":"","sources":["../src/auto-handoff.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAe;IAClB,UAAU,GAA2B,EAAE,CAAC;IACxC,cAAc,GAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-handoff.js","sourceRoot":"","sources":["../src/auto-handoff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `aismemory enable-key-auth` — one-shot enrollment for DID-based auth.
|
|
3
|
+
*
|
|
4
|
+
* Generates an Ed25519 keypair on the user's device, registers the public
|
|
5
|
+
* key with AIS, and writes the private key to `~/.aismemory/keys/`. After
|
|
6
|
+
* this runs once per device, every subsequent aismemory session authenticates
|
|
7
|
+
* silently with the key — no browser, no activation URL.
|
|
8
|
+
*
|
|
9
|
+
* Bootstrap requirements: the user needs a working bearer token from the
|
|
10
|
+
* existing device-flow credentials file (`~/.aismemory/credentials.json`).
|
|
11
|
+
* If absent, we tell them to run a normal aismemory session once first.
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* npx aismemory enable-key-auth
|
|
15
|
+
* AIS_URL=https://other.example.com npx aismemory enable-key-auth
|
|
16
|
+
*
|
|
17
|
+
* Exit codes:
|
|
18
|
+
* 0 — key registered + saved
|
|
19
|
+
* 1 — bootstrap credentials missing or registration failed
|
|
20
|
+
*/
|
|
21
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
22
|
+
import { join } from 'node:path';
|
|
23
|
+
import { homedir } from 'node:os';
|
|
24
|
+
import { generateAndSaveKeypair } from '../key-auth.js';
|
|
25
|
+
const PREFIX = '[aismemory enable-key-auth]';
|
|
26
|
+
function loadBootstrapCreds() {
|
|
27
|
+
const path = join(homedir(), '.aismemory', 'credentials.json');
|
|
28
|
+
if (!existsSync(path))
|
|
29
|
+
return null;
|
|
30
|
+
try {
|
|
31
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Decode a JWT payload WITHOUT verifying the signature. We trust the token
|
|
39
|
+
* because it came from our own credentials file — we just need its claims
|
|
40
|
+
* to know who we are.
|
|
41
|
+
*/
|
|
42
|
+
function decodeJwtPayload(token) {
|
|
43
|
+
const parts = token.split('.');
|
|
44
|
+
if (parts.length !== 3)
|
|
45
|
+
throw new Error('Malformed JWT');
|
|
46
|
+
const json = Buffer.from(parts[1], 'base64url').toString('utf-8');
|
|
47
|
+
return JSON.parse(json);
|
|
48
|
+
}
|
|
49
|
+
function log(msg) {
|
|
50
|
+
process.stderr.write(`${PREFIX} ${msg}\n`);
|
|
51
|
+
}
|
|
52
|
+
async function main() {
|
|
53
|
+
const aisUrl = process.env['AIS_URL'] ?? 'https://ais.agentsandswarms.ai';
|
|
54
|
+
// 1. Find a bootstrap bearer token.
|
|
55
|
+
const creds = loadBootstrapCreds();
|
|
56
|
+
if (!creds) {
|
|
57
|
+
log('No bootstrap credentials found at ~/.aismemory/credentials.json');
|
|
58
|
+
log('Run `npx aismemory` first (and complete the bond URL) to get an initial token,');
|
|
59
|
+
log('then re-run this command.');
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
62
|
+
if (new Date(creds.expiresAt) <= new Date()) {
|
|
63
|
+
log('Bootstrap credentials at ~/.aismemory/credentials.json have expired.');
|
|
64
|
+
log('Run `npx aismemory` once to refresh them, then re-run this command.');
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
// 2. Extract userId from the JWT.
|
|
68
|
+
let payload;
|
|
69
|
+
try {
|
|
70
|
+
payload = decodeJwtPayload(creds.token);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
log(`Failed to decode bootstrap JWT: ${err.message}`);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
const userId = payload.user_id ?? payload.sub;
|
|
77
|
+
if (!userId) {
|
|
78
|
+
log('Bootstrap JWT does not carry a user_id claim. This token may be agent-only —');
|
|
79
|
+
log('claim your agent to a user account first, then re-run.');
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
// Derive the userDid. The domain is the host portion of AIS_URL — strip
|
|
83
|
+
// the protocol so the resulting DID matches what AIS computes server-side.
|
|
84
|
+
const aisHost = new URL(aisUrl).host;
|
|
85
|
+
const userDid = `did:web:${aisHost}:users:${userId}`;
|
|
86
|
+
log(`AIS URL : ${aisUrl}`);
|
|
87
|
+
log(`userId : ${userId}`);
|
|
88
|
+
log(`userDid : ${userDid}`);
|
|
89
|
+
// 3. Generate keypair + write to disk.
|
|
90
|
+
const label = `${process.env['USER'] ?? 'user'}-${process.platform}`;
|
|
91
|
+
log('Generating Ed25519 keypair…');
|
|
92
|
+
const keyFile = await generateAndSaveKeypair({ userId, userDid });
|
|
93
|
+
// 4. POST public key to AIS.
|
|
94
|
+
log('Registering public key with AIS…');
|
|
95
|
+
const res = await fetch(`${aisUrl}/v1/users/me/keys`, {
|
|
96
|
+
method: 'POST',
|
|
97
|
+
headers: {
|
|
98
|
+
'Content-Type': 'application/json',
|
|
99
|
+
Authorization: `Bearer ${creds.token}`,
|
|
100
|
+
},
|
|
101
|
+
body: JSON.stringify({
|
|
102
|
+
publicKey: keyFile.publicKeyJwk,
|
|
103
|
+
label,
|
|
104
|
+
}),
|
|
105
|
+
});
|
|
106
|
+
const body = (await res.json().catch(() => ({})));
|
|
107
|
+
if (!res.ok || !body.success) {
|
|
108
|
+
// Special-case: 409 = key already registered. Treat as success since we
|
|
109
|
+
// still wrote the file locally and the server already knows about us.
|
|
110
|
+
if (res.status === 409) {
|
|
111
|
+
log('Public key was already registered (server says 409 — duplicate).');
|
|
112
|
+
log('Local key file is up to date; no further action needed.');
|
|
113
|
+
process.exit(0);
|
|
114
|
+
}
|
|
115
|
+
log(`Failed to register key: HTTP ${res.status} ${body.error?.code ?? ''} ${body.error?.message ?? ''}`);
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
log('✓ Public key registered with AIS');
|
|
119
|
+
log(` key id : ${body.data?.id ?? '<unknown>'}`);
|
|
120
|
+
log(` label : ${label}`);
|
|
121
|
+
log('');
|
|
122
|
+
log('Done. Future aismemory sessions will authenticate silently with this key.');
|
|
123
|
+
log(`Private key lives at ~/.aismemory/keys/${userDid}.json (mode 0600).`);
|
|
124
|
+
log('Treat it like an SSH private key — back it up, do not share.');
|
|
125
|
+
process.exit(0);
|
|
126
|
+
}
|
|
127
|
+
main().catch((err) => {
|
|
128
|
+
log(`Fatal: ${err instanceof Error ? err.message : String(err)}`);
|
|
129
|
+
process.exit(1);
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=enable-key-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enable-key-auth.js","sourceRoot":"","sources":["../../src/cli/enable-key-auth.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/sync-memory.js
CHANGED
|
@@ -3,6 +3,8 @@ import { join, resolve } from 'node:path';
|
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
import { createInterface } from 'node:readline/promises';
|
|
5
5
|
import { runIngestion } from '../pipeline/ingestion.js';
|
|
6
|
+
import { loadExistingHashes } from '../pipeline/existing-hashes.js';
|
|
7
|
+
import { bulkStoreViaAis, singleWriteAllViaAis } from '../pipeline/bulk-store.js';
|
|
6
8
|
import { LocalClaudeSource } from '../sources/local-claude.js';
|
|
7
9
|
import { SyncConfig } from '../config.js';
|
|
8
10
|
import { TrustLedger } from '../trust-ledger.js';
|
|
@@ -11,7 +13,13 @@ import { interactiveReview, bulkSelectAll } from '../review/cli-review.js';
|
|
|
11
13
|
import { resolveScope } from '../pipeline/scope-resolver.js';
|
|
12
14
|
import { readClaudeMemoryTree } from './read-claude-memory-tree.js';
|
|
13
15
|
function parseArgs(argv) {
|
|
14
|
-
const args = {
|
|
16
|
+
const args = {
|
|
17
|
+
source: 'claude-local',
|
|
18
|
+
dryRun: false,
|
|
19
|
+
saveScope: false,
|
|
20
|
+
acceptAll: false,
|
|
21
|
+
singleWrite: false,
|
|
22
|
+
};
|
|
15
23
|
for (let i = 0; i < argv.length; i++) {
|
|
16
24
|
if (argv[i] === '--source' && argv[i + 1]) {
|
|
17
25
|
args.source = argv[++i];
|
|
@@ -25,6 +33,12 @@ function parseArgs(argv) {
|
|
|
25
33
|
else if (argv[i] === '--save-scope') {
|
|
26
34
|
args.saveScope = true;
|
|
27
35
|
}
|
|
36
|
+
else if (argv[i] === '--accept-all') {
|
|
37
|
+
args.acceptAll = true;
|
|
38
|
+
}
|
|
39
|
+
else if (argv[i] === '--single-write') {
|
|
40
|
+
args.singleWrite = true;
|
|
41
|
+
}
|
|
28
42
|
}
|
|
29
43
|
return args;
|
|
30
44
|
}
|
|
@@ -33,38 +47,6 @@ function getAdapter(id) {
|
|
|
33
47
|
return new LocalClaudeSource();
|
|
34
48
|
throw new Error(`Unknown source: ${id}. Phase 1 supports only 'claude-local'.`);
|
|
35
49
|
}
|
|
36
|
-
async function bulkStoreViaAis(agentId, drafts) {
|
|
37
|
-
const apiBase = process.env['AIS_DOMAIN']
|
|
38
|
-
? `https://${process.env['AIS_DOMAIN']}`
|
|
39
|
-
: 'https://ais.agentsandswarms.ai';
|
|
40
|
-
const apiKey = process.env['AIS_SERVICE_KEY'] ?? process.env['AIS_API_KEY'];
|
|
41
|
-
const tenantId = process.env['AIS_TENANT_ID'];
|
|
42
|
-
if (!apiKey || !tenantId)
|
|
43
|
-
throw new Error('AIS_API_KEY and AIS_TENANT_ID must be set');
|
|
44
|
-
const body = {
|
|
45
|
-
memories: drafts.map((d) => ({
|
|
46
|
-
content: d.content,
|
|
47
|
-
type: d.type,
|
|
48
|
-
importance: d.importance,
|
|
49
|
-
metadata: { provenance: d.provenance, trustScoreHint: d.trustScore },
|
|
50
|
-
})),
|
|
51
|
-
};
|
|
52
|
-
const res = await fetch(`${apiBase}/v1/agents/${agentId}/memory/bulk`, {
|
|
53
|
-
method: 'POST',
|
|
54
|
-
headers: {
|
|
55
|
-
'Content-Type': 'application/json',
|
|
56
|
-
'x-api-key': apiKey,
|
|
57
|
-
'x-tenant-id': tenantId,
|
|
58
|
-
},
|
|
59
|
-
body: JSON.stringify(body),
|
|
60
|
-
});
|
|
61
|
-
if (!res.ok) {
|
|
62
|
-
const bodyText = await res.text().catch(() => '');
|
|
63
|
-
throw new Error(`AIS bulk store failed: HTTP ${res.status} ${res.statusText}${bodyText ? ` — ${bodyText.slice(0, 500)}` : ''}`);
|
|
64
|
-
}
|
|
65
|
-
const json = (await res.json());
|
|
66
|
-
return { created: json.data?.created ?? [], failed: json.data?.failed ?? [] };
|
|
67
|
-
}
|
|
68
50
|
async function main() {
|
|
69
51
|
const args = parseArgs(process.argv.slice(2));
|
|
70
52
|
const agentId = process.env['AIS_AGENT_ID'];
|
|
@@ -112,19 +94,32 @@ async function main() {
|
|
|
112
94
|
scope.label,
|
|
113
95
|
].join('|');
|
|
114
96
|
const firstSyncForScope = !ledger.isTrusted(agentId, adapter.id, scopeKey);
|
|
115
|
-
const review = async (drafts) => args.dryRun
|
|
97
|
+
const review = async (drafts) => args.dryRun || args.acceptAll
|
|
116
98
|
? bulkSelectAll(drafts)
|
|
117
99
|
: interactiveReview(drafts, {
|
|
118
100
|
sourceId: adapter.id,
|
|
119
101
|
scopeLabel: scope.label,
|
|
120
102
|
firstSyncForScope,
|
|
121
103
|
});
|
|
104
|
+
const apiKey = process.env['AIS_SERVICE_KEY'] ?? process.env['AIS_API_KEY'];
|
|
105
|
+
const tenantId = process.env['AIS_TENANT_ID'];
|
|
106
|
+
const apiBase = process.env['AIS_DOMAIN']
|
|
107
|
+
? `https://${process.env['AIS_DOMAIN']}`
|
|
108
|
+
: 'https://ais.agentsandswarms.ai';
|
|
122
109
|
const bulkStore = args.dryRun
|
|
123
110
|
? async (drafts) => ({
|
|
124
111
|
created: drafts.map((_, i) => ({ index: i, id: `dry-run-${i}` })),
|
|
125
112
|
failed: [],
|
|
126
113
|
})
|
|
127
|
-
: (
|
|
114
|
+
: (() => {
|
|
115
|
+
if (!apiKey || !tenantId)
|
|
116
|
+
throw new Error('AIS_API_KEY and AIS_TENANT_ID must be set');
|
|
117
|
+
const creds = { apiBase, apiKey, tenantId };
|
|
118
|
+
return args.singleWrite
|
|
119
|
+
? (drafts) => singleWriteAllViaAis(agentId, drafts, creds)
|
|
120
|
+
: (drafts) => bulkStoreViaAis(agentId, drafts, creds);
|
|
121
|
+
})();
|
|
122
|
+
const existingHashes = await loadExistingHashes(agentId, mirror, apiKey && tenantId ? { apiBase, apiKey, tenantId } : undefined);
|
|
128
123
|
const result = await runIngestion({
|
|
129
124
|
adapter,
|
|
130
125
|
rawSourceData,
|
|
@@ -133,7 +128,7 @@ async function main() {
|
|
|
133
128
|
config,
|
|
134
129
|
ledger,
|
|
135
130
|
mirror,
|
|
136
|
-
existingHashes
|
|
131
|
+
existingHashes,
|
|
137
132
|
bulkStore,
|
|
138
133
|
review,
|
|
139
134
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-memory.js","sourceRoot":"","sources":["../../src/cli/sync-memory.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"sync-memory.js","sourceRoot":"","sources":["../../src/cli/sync-memory.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -2,6 +2,9 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync, renameSync } from '
|
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { homedir } from 'node:os';
|
|
4
4
|
const DEFAULT_RETENTION_DAYS = 30;
|
|
5
|
+
function stderr(msg) {
|
|
6
|
+
process.stderr.write(`[aismemory] ${msg}\n`);
|
|
7
|
+
}
|
|
5
8
|
export class SyncConfig {
|
|
6
9
|
filePath;
|
|
7
10
|
data;
|
|
@@ -21,7 +24,7 @@ export class SyncConfig {
|
|
|
21
24
|
renameSync(this.filePath, backup);
|
|
22
25
|
}
|
|
23
26
|
catch { /* ignore */ }
|
|
24
|
-
|
|
27
|
+
stderr(`corrupt config.json backed up to ${backup}, using defaults`);
|
|
25
28
|
this.data = {};
|
|
26
29
|
}
|
|
27
30
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AASlC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC,MAAM,OAAO,UAAU;IACJ,QAAQ,CAAS;IAC1B,IAAI,CAAa;IAEzB,YAAY,OAAe,OAAO,EAAE;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAe,CAAC;YAC5E,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBACxD,IAAI,CAAC;oBAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;gBACjE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AASlC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAElC,SAAS,MAAM,CAAC,GAAW;IACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,OAAO,UAAU;IACJ,QAAQ,CAAS;IAC1B,IAAI,CAAa;IAEzB,YAAY,OAAe,OAAO,EAAE;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAe,CAAC;YAC5E,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;gBACxD,IAAI,CAAC;oBAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;gBACjE,MAAM,CAAC,oCAAoC,MAAM,kBAAkB,CAAC,CAAC;gBACrE,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YACjB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,sBAAsB,CAAC;IAC3D,CAAC;IAED,UAAU,CAAC,QAAgB;QACzB,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;IACnD,CAAC;IAED,eAAe,CAAC,WAAmB;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IAC3D,CAAC;IAED,mBAAmB,CAAC,WAAmB,EAAE,KAAgB;QACvD,IAAI,CAAC,IAAI,CAAC,gBAAgB,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC;QAC7F,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAEO,OAAO;QACb,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,MAAM,CAAC;QACnC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACxE,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface TenantAgentSummary {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
status: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Ensures AIS_AGENT_ID refers to an agent in the authenticated tenant.
|
|
8
|
+
* Throws with a message suitable for stderr when the id is missing or unknown.
|
|
9
|
+
*/
|
|
10
|
+
export declare function assertEnvAgentInTenant(envAgentId: string, agents: TenantAgentSummary[]): TenantAgentSummary;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensures AIS_AGENT_ID refers to an agent in the authenticated tenant.
|
|
3
|
+
* Throws with a message suitable for stderr when the id is missing or unknown.
|
|
4
|
+
*/
|
|
5
|
+
export function assertEnvAgentInTenant(envAgentId, agents) {
|
|
6
|
+
const match = agents.find((agent) => agent.id === envAgentId);
|
|
7
|
+
if (match) {
|
|
8
|
+
return match;
|
|
9
|
+
}
|
|
10
|
+
const available = agents.map((agent) => `${agent.name} (${agent.id})`).join(', ');
|
|
11
|
+
throw new Error(`AIS_AGENT_ID="${envAgentId}" is not a valid agent in this tenant. ` +
|
|
12
|
+
`Available: ${available || '(none)'}`);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=env-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env-agent.js","sourceRoot":"","sources":["../src/env-agent.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAAkB,EAClB,MAA4B;IAE5B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;IAC9D,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClF,MAAM,IAAI,KAAK,CACb,iBAAiB,UAAU,yCAAyC;QAClE,cAAc,SAAS,IAAI,QAAQ,EAAE,CACxC,CAAC;AACJ,CAAC"}
|