aismemory 0.7.4 → 0.7.5

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.
Files changed (73) hide show
  1. package/README.md +51 -11
  2. package/dist/__tests__/agent-key-mode.test.js +72 -7
  3. package/dist/__tests__/agent-key-mode.test.js.map +1 -1
  4. package/dist/__tests__/ais-http.test.js +32 -0
  5. package/dist/__tests__/ais-http.test.js.map +1 -1
  6. package/dist/__tests__/credential-isolation.test.js +117 -3
  7. package/dist/__tests__/credential-isolation.test.js.map +1 -1
  8. package/dist/__tests__/device-flow-gate-e2e.test.js +5 -0
  9. package/dist/__tests__/device-flow-gate-e2e.test.js.map +1 -1
  10. package/dist/__tests__/doctor.test.js +1 -1
  11. package/dist/__tests__/doctor.test.js.map +1 -1
  12. package/dist/__tests__/mcp-tools.test.d.ts +1 -0
  13. package/dist/__tests__/mcp-tools.test.js +155 -0
  14. package/dist/__tests__/mcp-tools.test.js.map +1 -0
  15. package/dist/__tests__/memory-pull.test.d.ts +1 -0
  16. package/dist/__tests__/memory-pull.test.js +380 -0
  17. package/dist/__tests__/memory-pull.test.js.map +1 -0
  18. package/dist/__tests__/pending-device-flow-e2e.test.d.ts +19 -0
  19. package/dist/__tests__/pending-device-flow-e2e.test.js +159 -0
  20. package/dist/__tests__/pending-device-flow-e2e.test.js.map +1 -0
  21. package/dist/__tests__/pending-device-flow.test.d.ts +15 -0
  22. package/dist/__tests__/pending-device-flow.test.js +108 -0
  23. package/dist/__tests__/pending-device-flow.test.js.map +1 -0
  24. package/dist/__tests__/readme-quickstart-default-ais-url.test.d.ts +1 -0
  25. package/dist/__tests__/readme-quickstart-default-ais-url.test.js +80 -0
  26. package/dist/__tests__/readme-quickstart-default-ais-url.test.js.map +1 -0
  27. package/dist/__tests__/remember-duplicate-truth.test.d.ts +13 -0
  28. package/dist/__tests__/remember-duplicate-truth.test.js +106 -0
  29. package/dist/__tests__/remember-duplicate-truth.test.js.map +1 -0
  30. package/dist/__tests__/startup-credential-warning-e2e.test.d.ts +1 -0
  31. package/dist/__tests__/startup-credential-warning-e2e.test.js +102 -0
  32. package/dist/__tests__/startup-credential-warning-e2e.test.js.map +1 -0
  33. package/dist/__tests__/tool-args.test.js +10 -0
  34. package/dist/__tests__/tool-args.test.js.map +1 -1
  35. package/dist/__tests__/version-check.test.d.ts +1 -0
  36. package/dist/__tests__/version-check.test.js +349 -0
  37. package/dist/__tests__/version-check.test.js.map +1 -0
  38. package/dist/agent-key-mode.d.ts +1 -1
  39. package/dist/agent-key-mode.js +30 -10
  40. package/dist/agent-key-mode.js.map +1 -1
  41. package/dist/ais-http-error.d.ts +22 -0
  42. package/dist/ais-http-error.js +42 -0
  43. package/dist/ais-http-error.js.map +1 -1
  44. package/dist/ais-http.js +31 -13
  45. package/dist/ais-http.js.map +1 -1
  46. package/dist/cli/doctor.d.ts +16 -0
  47. package/dist/cli/doctor.js +64 -0
  48. package/dist/cli/doctor.js.map +1 -1
  49. package/dist/cli/pull-memory.d.ts +17 -0
  50. package/dist/cli/pull-memory.js +141 -0
  51. package/dist/cli/pull-memory.js.map +1 -0
  52. package/dist/index.js +107 -382
  53. package/dist/index.js.map +1 -1
  54. package/dist/mcp/tools.d.ts +78 -0
  55. package/dist/mcp/tools.js +433 -0
  56. package/dist/mcp/tools.js.map +1 -0
  57. package/dist/memory-pull.d.ts +114 -0
  58. package/dist/memory-pull.js +171 -0
  59. package/dist/memory-pull.js.map +1 -0
  60. package/dist/pending-device-flow.d.ts +49 -0
  61. package/dist/pending-device-flow.js +96 -0
  62. package/dist/pending-device-flow.js.map +1 -0
  63. package/dist/telemetry.d.ts +1 -1
  64. package/dist/telemetry.js.map +1 -1
  65. package/dist/tool-args.d.ts +2 -0
  66. package/dist/tool-args.js +6 -0
  67. package/dist/tool-args.js.map +1 -1
  68. package/dist/version-check.d.ts +72 -0
  69. package/dist/version-check.js +237 -0
  70. package/dist/version-check.js.map +1 -0
  71. package/dist/workspace-key-mode.js +15 -6
  72. package/dist/workspace-key-mode.js.map +1 -1
  73. package/package.json +4 -3
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Memory pull — read an agent's own memories back out of the Agent Identity
3
+ * Service and into a local JSON Lines backup (CORBOT-31C43CBD).
4
+ *
5
+ * WHY THIS EXISTS
6
+ * The package could only ever push local -> Agent Identity Service
7
+ * (LocalMirror, aismemory-sync). Nothing an agent API key can call brought
8
+ * memories back down, so memories written from the Claude app or from Codex
9
+ * never reached the local copy. The two export routes do not help a key-only
10
+ * caller:
11
+ * * POST /v1/agents/:agentId/export -> 403, `export` is not in the
12
+ * agent-API-key allowlist (agentApiKeyAuth.ts ALLOWED_AGENT_SUBRESOURCES).
13
+ * * POST /v1/agents/:agentId/memory/export -> 400 "platform is required";
14
+ * it pushes to a third-party platform adapter and refuses file paths over
15
+ * HTTP, so it cannot produce a local file.
16
+ *
17
+ * WHAT THIS DOES INSTEAD
18
+ * Pages the browse path of GET /v1/agents/:agentId/memory, which IS already on
19
+ * the allowlist and already supports `limit` + `offset` pagination. No server
20
+ * change and no access scope change: this is a client that uses a route the
21
+ * key can call today.
22
+ *
23
+ * SCOPE SAFETY
24
+ * The agent id is taken from the caller's own configuration and interpolated
25
+ * into the path; the server additionally rejects any request whose path agent
26
+ * does not equal the agent the key encodes. `principalAgentId` (the delegated
27
+ * cross-agent read parameter) is never sent, so a pull can only ever read the
28
+ * caller's own memories.
29
+ */
30
+ import { AisHttpError } from './ais-http-error.js';
31
+ import { aisKeyGet } from './agent-key-mode.js';
32
+ /**
33
+ * Server-side cap on `limit` for GET /v1/agents/:agentId/memory
34
+ * (agent-identity-service `env.benchQueryLimitCap`; a larger value is a 400).
35
+ */
36
+ export const MAX_PAGE_SIZE = 100;
37
+ /** Page size used when the caller does not choose one. */
38
+ export const DEFAULT_PAGE_SIZE = 100;
39
+ /**
40
+ * Hard stop on pages fetched, so a server that never reports exhaustion cannot
41
+ * spin forever. At the maximum page size this covers 500,000 memories, an order
42
+ * of magnitude above the 50,000 the `.aismem` export format itself allows.
43
+ */
44
+ export const MAX_PAGES = 5_000;
45
+ function isRecord(value) {
46
+ return typeof value === 'object' && value !== null;
47
+ }
48
+ /**
49
+ * Pull `data.memories` and `data.totalCount` out of a browse response, rejecting
50
+ * anything that does not have the documented shape. A silently-empty parse would
51
+ * be indistinguishable from "this agent has no memories" and would write an
52
+ * empty backup over a good one.
53
+ */
54
+ export function parseBrowsePage(payload) {
55
+ if (!isRecord(payload) || !isRecord(payload['data'])) {
56
+ throw new Error('Unexpected response from the memory browse route: no `data` object. ' +
57
+ 'The Agent Identity Service may be returning an error page.');
58
+ }
59
+ const data = payload['data'];
60
+ const rawMemories = data['memories'];
61
+ if (!Array.isArray(rawMemories)) {
62
+ throw new Error('Unexpected response from the memory browse route: `data.memories` is not an array.');
63
+ }
64
+ const memories = [];
65
+ for (const entry of rawMemories) {
66
+ if (!isRecord(entry) || typeof entry['id'] !== 'string') {
67
+ throw new Error('Unexpected response from the memory browse route: a memory has no string `id`.');
68
+ }
69
+ memories.push(entry);
70
+ }
71
+ const rawTotal = data['totalCount'];
72
+ const totalCount = typeof rawTotal === 'number' && Number.isFinite(rawTotal) ? rawTotal : undefined;
73
+ return totalCount === undefined ? { memories } : { memories, totalCount };
74
+ }
75
+ /** Clamp a requested page size into the range the server accepts. */
76
+ export function clampPageSize(requested) {
77
+ if (requested === undefined || !Number.isFinite(requested))
78
+ return DEFAULT_PAGE_SIZE;
79
+ const floored = Math.floor(requested);
80
+ if (floored < 1)
81
+ return 1;
82
+ if (floored > MAX_PAGE_SIZE)
83
+ return MAX_PAGE_SIZE;
84
+ return floored;
85
+ }
86
+ /**
87
+ * Page the whole corpus for one agent, newest first.
88
+ *
89
+ * Deduplicates by memory id. This is load-bearing rather than defensive: the
90
+ * browse path orders by `createdAt` descending, so a memory written while the
91
+ * walk is in progress lands at offset 0 and shifts every later row down one,
92
+ * which would otherwise re-read a row that has already been captured.
93
+ */
94
+ export async function pullMemories(options) {
95
+ const { aisUrl, agentId, apiKey, fetchImpl, onProgress } = options;
96
+ const pageSize = clampPageSize(options.pageSize);
97
+ const seen = new Set();
98
+ const memories = [];
99
+ let offset = 0;
100
+ let pagesFetched = 0;
101
+ let totalCount;
102
+ let truncated = false;
103
+ for (;;) {
104
+ if (pagesFetched >= MAX_PAGES) {
105
+ truncated = true;
106
+ break;
107
+ }
108
+ const params = new URLSearchParams();
109
+ params.set('limit', String(pageSize));
110
+ params.set('offset', String(offset));
111
+ // Browse, not recall: no `query`, and relationship expansion off so a
112
+ // backup carries the stored memories rather than a graph walk around them.
113
+ params.set('expandRelationships', 'false');
114
+ const payload = await aisKeyGet(aisUrl, `/v1/agents/${encodeURIComponent(agentId)}/memory?${params.toString()}`, apiKey, fetchImpl);
115
+ pagesFetched += 1;
116
+ const page = parseBrowsePage(payload);
117
+ if (page.totalCount !== undefined)
118
+ totalCount = page.totalCount;
119
+ let added = 0;
120
+ for (const memory of page.memories) {
121
+ if (seen.has(memory.id))
122
+ continue;
123
+ seen.add(memory.id);
124
+ memories.push(memory);
125
+ added += 1;
126
+ }
127
+ onProgress?.(totalCount === undefined
128
+ ? { page: pagesFetched, added, total: memories.length }
129
+ : { page: pagesFetched, added, total: memories.length, totalCount });
130
+ // A short page means the corpus is exhausted. Advance by the page length
131
+ // actually returned, not by the number of NEW rows, or a shifted window
132
+ // would make the walk step backwards and never terminate.
133
+ if (page.memories.length < pageSize)
134
+ break;
135
+ offset += page.memories.length;
136
+ }
137
+ return totalCount === undefined
138
+ ? { memories, pagesFetched, truncated }
139
+ : { memories, pagesFetched, totalCount, truncated };
140
+ }
141
+ /**
142
+ * Render memories as JSON Lines: one memory object per line, in the order they
143
+ * were pulled (newest first). Always ends with a newline so the file can be
144
+ * appended to or concatenated cleanly.
145
+ */
146
+ export function toJsonLines(memories) {
147
+ if (memories.length === 0)
148
+ return '';
149
+ return `${memories.map((memory) => JSON.stringify(memory)).join('\n')}\n`;
150
+ }
151
+ /**
152
+ * Turn an out-of-scope or rejected pull into a message that names the cause,
153
+ * rather than leaving a bare HTTP status for the operator to decode.
154
+ */
155
+ export function describePullFailure(error) {
156
+ if (error instanceof AisHttpError) {
157
+ if (error.status === 401) {
158
+ return 'The Agent Identity Service rejected the agent API key (HTTP 401). Check AIS_API_KEY.';
159
+ }
160
+ if (error.status === 403) {
161
+ return ('The Agent Identity Service refused the read (HTTP 403). An agent API key may only read ' +
162
+ 'its own memories — check that AIS_AGENT_ID is the agent this key was minted for.');
163
+ }
164
+ if (error.status === 404) {
165
+ return 'No such agent in this tenant (HTTP 404). Check AIS_AGENT_ID.';
166
+ }
167
+ return `The Agent Identity Service returned HTTP ${error.status}.`;
168
+ }
169
+ return error instanceof Error ? error.message : String(error);
170
+ }
171
+ //# sourceMappingURL=memory-pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-pull.js","sourceRoot":"","sources":["../src/memory-pull.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Pending device-flow persistence (CORBOT-8F96A8EF).
3
+ *
4
+ * The orphan bug, client side. `startDeviceFlow` can hand the server the
5
+ * provisional token from an earlier un-finalized flow, and the server will
6
+ * then reuse that provisional agent instead of minting another
7
+ * (tryReuseProvisional, CORBOT-CDDC15FA). But the only place that token
8
+ * lived was `activeFlow`, a module-level variable — process-local, and null
9
+ * in every newly spawned process. A stdio server is respawned constantly, so
10
+ * in practice the token was almost never sent and sign-in minted a fresh
11
+ * agent nearly every run. That is where Jaire's leftovers came from.
12
+ *
13
+ * So the token is persisted next to the credentials file, under the same
14
+ * 0700 directory / 0600 file permissions: it is a bearer proof-of-session
15
+ * for an unbonded agent and must not be world-readable.
16
+ *
17
+ * It is deliberately NOT part of OAuthCredentials: those are the live bonded
18
+ * session, this is a half-finished sign-in. Keeping them in separate files
19
+ * means a stale pending flow can never be mistaken for a usable credential,
20
+ * and clearing one does not disturb the other.
21
+ */
22
+ /**
23
+ * A device flow that started but was never bonded. `provisionalToken` is the
24
+ * only field the server needs; the rest is there so a human reading the file
25
+ * (or a support session) can tell what it belongs to.
26
+ */
27
+ export interface PendingDeviceFlow {
28
+ provisionalToken: string;
29
+ agentId: string;
30
+ provisionalTenantId: string;
31
+ /** ISO timestamp of when this flow was started. */
32
+ startedAt: string;
33
+ }
34
+ /**
35
+ * Sits beside credentials.json, so it follows the same per-agent isolation
36
+ * that `credentialsFilePath` already implements (AIS_CREDENTIALS_FILE
37
+ * override, then AIS_AGENT_ID sub-directory, then the shared default).
38
+ */
39
+ export declare function pendingDeviceFlowPath(home?: string): string;
40
+ /** Persist the un-finalized flow so the next process reuses this agent. */
41
+ export declare function savePendingDeviceFlow(flow: PendingDeviceFlow, home?: string): void;
42
+ /**
43
+ * Read a still-usable pending flow, or null. Returns null (and does not
44
+ * throw) for a missing, unreadable, malformed, or expired file: every one of
45
+ * those means "no token to reuse", and the caller's fallback is correct.
46
+ */
47
+ export declare function loadPendingDeviceFlow(home?: string, now?: number): PendingDeviceFlow | null;
48
+ /** Drop the record once the flow has bonded (or is known dead). */
49
+ export declare function clearPendingDeviceFlow(home?: string): void;
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Pending device-flow persistence (CORBOT-8F96A8EF).
3
+ *
4
+ * The orphan bug, client side. `startDeviceFlow` can hand the server the
5
+ * provisional token from an earlier un-finalized flow, and the server will
6
+ * then reuse that provisional agent instead of minting another
7
+ * (tryReuseProvisional, CORBOT-CDDC15FA). But the only place that token
8
+ * lived was `activeFlow`, a module-level variable — process-local, and null
9
+ * in every newly spawned process. A stdio server is respawned constantly, so
10
+ * in practice the token was almost never sent and sign-in minted a fresh
11
+ * agent nearly every run. That is where Jaire's leftovers came from.
12
+ *
13
+ * So the token is persisted next to the credentials file, under the same
14
+ * 0700 directory / 0600 file permissions: it is a bearer proof-of-session
15
+ * for an unbonded agent and must not be world-readable.
16
+ *
17
+ * It is deliberately NOT part of OAuthCredentials: those are the live bonded
18
+ * session, this is a half-finished sign-in. Keeping them in separate files
19
+ * means a stale pending flow can never be mistaken for a usable credential,
20
+ * and clearing one does not disturb the other.
21
+ */
22
+ import { chmodSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
23
+ import { homedir } from 'node:os';
24
+ import { dirname, join } from 'node:path';
25
+ import { credentialsFilePath } from './oauth-credentials.js';
26
+ /**
27
+ * Provisional tokens are signed with a 7-day expiry server-side, matching the
28
+ * claim window. Past that the server rejects reuse anyway, so a local record
29
+ * older than this is dead weight and is discarded rather than sent.
30
+ */
31
+ const PENDING_FLOW_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;
32
+ /**
33
+ * Sits beside credentials.json, so it follows the same per-agent isolation
34
+ * that `credentialsFilePath` already implements (AIS_CREDENTIALS_FILE
35
+ * override, then AIS_AGENT_ID sub-directory, then the shared default).
36
+ */
37
+ export function pendingDeviceFlowPath(home = homedir()) {
38
+ return join(dirname(credentialsFilePath(home)), 'pending-device-flow.json');
39
+ }
40
+ /** Persist the un-finalized flow so the next process reuses this agent. */
41
+ export function savePendingDeviceFlow(flow, home = homedir()) {
42
+ const file = pendingDeviceFlowPath(home);
43
+ try {
44
+ mkdirSync(dirname(file), { recursive: true, mode: 0o700 });
45
+ writeFileSync(file, JSON.stringify(flow, null, 2), { mode: 0o600 });
46
+ // writeFileSync's mode is umask-dependent; chmod is the reliable path.
47
+ if (process.platform !== 'win32') {
48
+ chmodSync(file, 0o600);
49
+ }
50
+ }
51
+ catch {
52
+ // Best effort only. A read-only or full home directory must not break
53
+ // sign-in — the caller simply falls back to minting, which is today's
54
+ // behavior, not a regression.
55
+ }
56
+ }
57
+ /**
58
+ * Read a still-usable pending flow, or null. Returns null (and does not
59
+ * throw) for a missing, unreadable, malformed, or expired file: every one of
60
+ * those means "no token to reuse", and the caller's fallback is correct.
61
+ */
62
+ export function loadPendingDeviceFlow(home = homedir(), now = Date.now()) {
63
+ const file = pendingDeviceFlowPath(home);
64
+ try {
65
+ if (!existsSync(file))
66
+ return null;
67
+ const parsed = JSON.parse(readFileSync(file, 'utf-8'));
68
+ if (typeof parsed.provisionalToken !== 'string' || parsed.provisionalToken.length === 0) {
69
+ return null;
70
+ }
71
+ const startedAt = typeof parsed.startedAt === 'string' ? Date.parse(parsed.startedAt) : NaN;
72
+ if (Number.isFinite(startedAt) && now - startedAt > PENDING_FLOW_MAX_AGE_MS) {
73
+ return null;
74
+ }
75
+ return {
76
+ provisionalToken: parsed.provisionalToken,
77
+ agentId: typeof parsed.agentId === 'string' ? parsed.agentId : '',
78
+ provisionalTenantId: typeof parsed.provisionalTenantId === 'string' ? parsed.provisionalTenantId : '',
79
+ startedAt: typeof parsed.startedAt === 'string' ? parsed.startedAt : '',
80
+ };
81
+ }
82
+ catch {
83
+ return null;
84
+ }
85
+ }
86
+ /** Drop the record once the flow has bonded (or is known dead). */
87
+ export function clearPendingDeviceFlow(home = homedir()) {
88
+ try {
89
+ rmSync(pendingDeviceFlowPath(home), { force: true });
90
+ }
91
+ catch {
92
+ // Same best-effort rationale as save: a stale file costs one rejected
93
+ // reuse attempt, which degrades to minting.
94
+ }
95
+ }
96
+ //# sourceMappingURL=pending-device-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending-device-flow.js","sourceRoot":"","sources":["../src/pending-device-flow.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export type TelemetryEventName = 'auth.device_flow.start' | 'auth.key.success' | 'auth.key.fallback' | 'auth.key.autoenroll' | 'auth.renew.success' | 'auth.renew.retry' | 'auth.renew.hard_expiry' | 'tool.call' | 'ais.http.failure';
1
+ export type TelemetryEventName = 'auth.device_flow.start' | 'auth.key.success' | 'auth.key.fallback' | 'auth.key.autoenroll' | 'auth.renew.success' | 'auth.renew.retry' | 'auth.renew.hard_expiry' | 'tool.call' | 'ais.http.failure' | 'ais.http.retry';
2
2
  export interface TelemetryEvent {
3
3
  event: TelemetryEventName;
4
4
  ts: string;
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA2BzC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAEnD,gEAAgE;AAChE,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrE,OAAO,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,aAAa,CAAC,KAAmD;IAC/E,IAAI,CAAC,kBAAkB,EAAE;QAAE,OAAO;IAClC,MAAM,OAAO,GAAmB;QAC9B,GAAG,KAAK;QACR,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACzC,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC"}
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA4BzC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAEnD,gEAAgE;AAChE,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrE,OAAO,GAAG,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzE,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,aAAa,CAAC,KAAmD;IAC/E,IAAI,CAAC,kBAAkB,EAAE;QAAE,OAAO;IAClC,MAAM,OAAO,GAAmB;QAC9B,GAAG,KAAK;QACR,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACzC,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC"}
@@ -35,6 +35,8 @@ export declare const recallArgsSchema: z.ZodObject<{
35
35
  export declare const handoffArgsSchema: z.ZodObject<{
36
36
  summary: z.ZodOptional<z.ZodString>;
37
37
  keyLearnings: z.ZodOptional<z.ZodArray<z.ZodString>>;
38
+ docPath: z.ZodOptional<z.ZodString>;
39
+ docPrUrl: z.ZodOptional<z.ZodString>;
38
40
  }, z.core.$strip>;
39
41
  export declare const agentLoadArgsSchema: z.ZodObject<{
40
42
  query: z.ZodString;
package/dist/tool-args.js CHANGED
@@ -46,6 +46,12 @@ export const handoffArgsSchema = z.object({
46
46
  .max(MAX_MEMORY_CONTENT_LENGTH, `keyLearnings item exceeds maximum length of ${MAX_MEMORY_CONTENT_LENGTH} bytes`))
47
47
  .max(100, 'keyLearnings exceeds maximum of 100 items')
48
48
  .optional(),
49
+ // CORBOT-E3541A7F: the route accepts these two and persists them in the
50
+ // doc_path / doc_pr_url columns. Same shape the route validates — a string
51
+ // it ignores when blank — so nothing is added here beyond letting the
52
+ // caller's value survive the parse instead of being stripped.
53
+ docPath: z.string().optional(),
54
+ docPrUrl: z.string().optional(),
49
55
  });
50
56
  export const agentLoadArgsSchema = z.object({
51
57
  query: z
@@ -1 +1 @@
1
- {"version":3,"file":"tool-args.js","sourceRoot":"","sources":["../src/tool-args.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-args.js","sourceRoot":"","sources":["../src/tool-args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /** How the running version relates to the latest published version. */
2
+ export type VersionComparison = 'behind' | 'current' | 'ahead';
3
+ /** Why a check produced no answer. Never surfaced as an error to the user. */
4
+ export type VersionCheckSkipReason = 'disabled' | 'unreachable';
5
+ export interface UpdateStatus {
6
+ currentVersion: string;
7
+ latestVersion: string;
8
+ comparison: VersionComparison;
9
+ /** Plain-words upgrade notice. Present only when `comparison` is 'behind'. */
10
+ notice?: string;
11
+ }
12
+ export interface VersionCheckSkipped {
13
+ skipped: VersionCheckSkipReason;
14
+ /** One short phrase naming what went wrong; absent when disabled. */
15
+ detail?: string;
16
+ }
17
+ export type VersionCheckResult = UpdateStatus | VersionCheckSkipped;
18
+ export interface VersionCheckOptions {
19
+ /** The version this process is running (from package.json). */
20
+ currentVersion: string;
21
+ env?: Record<string, string | undefined>;
22
+ fetchImpl?: typeof fetch;
23
+ now?: () => number;
24
+ home?: string;
25
+ timeoutMs?: number;
26
+ cacheTtlMs?: number;
27
+ /** Called once with the notice text when the running version is behind. */
28
+ onUpdateAvailable?: (notice: string) => void;
29
+ }
30
+ /** npm registry endpoint that returns the metadata of the latest release. */
31
+ export declare const REGISTRY_LATEST_URL = "https://registry.npmjs.org/aismemory/latest";
32
+ /** Registry request timeout. Deliberately short — this is advisory only. */
33
+ export declare const VERSION_CHECK_TIMEOUT_MS = 2000;
34
+ /** How long a registry answer is reused before asking again. */
35
+ export declare const VERSION_CHECK_CACHE_TTL_MS: number;
36
+ /**
37
+ * The version this process is running, read from the package manifest that
38
+ * ships beside the compiled entrypoint. Lives here so the model context
39
+ * protocol entrypoint and the doctor command read it from one place.
40
+ */
41
+ export declare function readPackageVersion(): string;
42
+ export declare function isUpdateStatus(result: VersionCheckResult): result is UpdateStatus;
43
+ /** The check is on unless AISMEMORY_VERSION_CHECK names a falsey value. */
44
+ export declare function isVersionCheckEnabled(env?: Record<string, string | undefined>): boolean;
45
+ export declare function versionCacheFilePath(home?: string): string;
46
+ /**
47
+ * Compare two semantic versions: -1 when `left` is older, 1 when newer, 0 when
48
+ * equal. Build metadata (`+sha`) is ignored, as semantic versioning requires.
49
+ */
50
+ export declare function compareVersions(left: string, right: string): -1 | 0 | 1;
51
+ export declare function classifyVersion(current: string, latest: string): VersionComparison;
52
+ /**
53
+ * The one piece of text a customer reads when they are behind. It names both
54
+ * versions and the exact command for each of the two ways people run this
55
+ * package: a global install, and an npx line in a client configuration.
56
+ */
57
+ export declare function formatUpdateNotice(current: string, latest: string): string;
58
+ /**
59
+ * Resolve the update status. Resolves — never rejects: an unreachable registry,
60
+ * a malformed response, or a disabled check all come back as a skip.
61
+ */
62
+ export declare function checkForUpdate(options: VersionCheckOptions): Promise<VersionCheckResult>;
63
+ /**
64
+ * Start the check without blocking the caller. The returned promise is for
65
+ * tests; production callers use `void startVersionCheck(...)` and read the
66
+ * settled answer later through `getUpdateNotice()`.
67
+ */
68
+ export declare function startVersionCheck(options: VersionCheckOptions): Promise<VersionCheckResult>;
69
+ /** The settled notice, or null when up to date, skipped, or not yet answered. */
70
+ export declare function getUpdateNotice(): string | null;
71
+ /** Drops the process-wide notice. Used by tests to isolate cases. */
72
+ export declare function clearUpdateNotice(): void;