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.
Files changed (101) hide show
  1. package/README.md +211 -11
  2. package/dist/__tests__/agent-archive.test.d.ts +1 -0
  3. package/dist/__tests__/agent-archive.test.js +153 -0
  4. package/dist/__tests__/agent-archive.test.js.map +1 -0
  5. package/dist/__tests__/agent-key-mode.test.js +88 -7
  6. package/dist/__tests__/agent-key-mode.test.js.map +1 -1
  7. package/dist/__tests__/ais-http.test.js +32 -0
  8. package/dist/__tests__/ais-http.test.js.map +1 -1
  9. package/dist/__tests__/credential-isolation.test.js +117 -3
  10. package/dist/__tests__/credential-isolation.test.js.map +1 -1
  11. package/dist/__tests__/credential-resolution.test.js +5 -5
  12. package/dist/__tests__/credential-resolution.test.js.map +1 -1
  13. package/dist/__tests__/device-flow-gate-e2e.test.js +5 -0
  14. package/dist/__tests__/device-flow-gate-e2e.test.js.map +1 -1
  15. package/dist/__tests__/doctor.test.js +144 -79
  16. package/dist/__tests__/doctor.test.js.map +1 -1
  17. package/dist/__tests__/mcp-tools.test.d.ts +1 -0
  18. package/dist/__tests__/mcp-tools.test.js +189 -0
  19. package/dist/__tests__/mcp-tools.test.js.map +1 -0
  20. package/dist/__tests__/memory-pull.test.d.ts +1 -0
  21. package/dist/__tests__/memory-pull.test.js +380 -0
  22. package/dist/__tests__/memory-pull.test.js.map +1 -0
  23. package/dist/__tests__/memory-write-failure.test.js +4 -8
  24. package/dist/__tests__/memory-write-failure.test.js.map +1 -1
  25. package/dist/__tests__/no-registered-keys-disk-bearer-fallback.test.js +4 -7
  26. package/dist/__tests__/no-registered-keys-disk-bearer-fallback.test.js.map +1 -1
  27. package/dist/__tests__/pending-device-flow-e2e.test.d.ts +19 -0
  28. package/dist/__tests__/pending-device-flow-e2e.test.js +159 -0
  29. package/dist/__tests__/pending-device-flow-e2e.test.js.map +1 -0
  30. package/dist/__tests__/pending-device-flow.test.d.ts +15 -0
  31. package/dist/__tests__/pending-device-flow.test.js +108 -0
  32. package/dist/__tests__/pending-device-flow.test.js.map +1 -0
  33. package/dist/__tests__/provisional-register-mcp-remember.test.js +4 -8
  34. package/dist/__tests__/provisional-register-mcp-remember.test.js.map +1 -1
  35. package/dist/__tests__/readme-quickstart-default-ais-url.test.d.ts +1 -0
  36. package/dist/__tests__/readme-quickstart-default-ais-url.test.js +80 -0
  37. package/dist/__tests__/readme-quickstart-default-ais-url.test.js.map +1 -0
  38. package/dist/__tests__/reconnect-survival-e2e.test.js +3 -4
  39. package/dist/__tests__/reconnect-survival-e2e.test.js.map +1 -1
  40. package/dist/__tests__/remember-duplicate-truth.test.d.ts +13 -0
  41. package/dist/__tests__/remember-duplicate-truth.test.js +106 -0
  42. package/dist/__tests__/remember-duplicate-truth.test.js.map +1 -0
  43. package/dist/__tests__/retry-after.test.d.ts +4 -0
  44. package/dist/__tests__/retry-after.test.js +128 -0
  45. package/dist/__tests__/retry-after.test.js.map +1 -0
  46. package/dist/__tests__/startup-credential-warning-e2e.test.d.ts +1 -0
  47. package/dist/__tests__/startup-credential-warning-e2e.test.js +102 -0
  48. package/dist/__tests__/startup-credential-warning-e2e.test.js.map +1 -0
  49. package/dist/__tests__/tool-args.test.js +10 -0
  50. package/dist/__tests__/tool-args.test.js.map +1 -1
  51. package/dist/__tests__/version-check.test.d.ts +1 -0
  52. package/dist/__tests__/version-check.test.js +349 -0
  53. package/dist/__tests__/version-check.test.js.map +1 -0
  54. package/dist/agent-archive.d.ts +36 -0
  55. package/dist/agent-archive.js +69 -0
  56. package/dist/agent-archive.js.map +1 -0
  57. package/dist/agent-key-mode.d.ts +1 -1
  58. package/dist/agent-key-mode.js +56 -19
  59. package/dist/agent-key-mode.js.map +1 -1
  60. package/dist/ais-http-error.d.ts +26 -2
  61. package/dist/ais-http-error.js +52 -4
  62. package/dist/ais-http-error.js.map +1 -1
  63. package/dist/ais-http.js +46 -16
  64. package/dist/ais-http.js.map +1 -1
  65. package/dist/cli/doctor.d.ts +17 -2
  66. package/dist/cli/doctor.js +93 -14
  67. package/dist/cli/doctor.js.map +1 -1
  68. package/dist/cli/pull-memory.d.ts +17 -0
  69. package/dist/cli/pull-memory.js +141 -0
  70. package/dist/cli/pull-memory.js.map +1 -0
  71. package/dist/index.js +135 -398
  72. package/dist/index.js.map +1 -1
  73. package/dist/mcp/tools.d.ts +82 -0
  74. package/dist/mcp/tools.js +453 -0
  75. package/dist/mcp/tools.js.map +1 -0
  76. package/dist/memory-pull.d.ts +114 -0
  77. package/dist/memory-pull.js +171 -0
  78. package/dist/memory-pull.js.map +1 -0
  79. package/dist/pending-device-flow.d.ts +49 -0
  80. package/dist/pending-device-flow.js +96 -0
  81. package/dist/pending-device-flow.js.map +1 -0
  82. package/dist/retry-after.d.ts +26 -0
  83. package/dist/retry-after.js +42 -0
  84. package/dist/retry-after.js.map +1 -0
  85. package/dist/session-identity.d.ts +26 -0
  86. package/dist/session-identity.js +89 -0
  87. package/dist/session-identity.js.map +1 -0
  88. package/dist/telemetry.d.ts +1 -1
  89. package/dist/telemetry.js.map +1 -1
  90. package/dist/tool-args.d.ts +4 -0
  91. package/dist/tool-args.js +16 -0
  92. package/dist/tool-args.js.map +1 -1
  93. package/dist/version-check.d.ts +72 -0
  94. package/dist/version-check.js +237 -0
  95. package/dist/version-check.js.map +1 -0
  96. package/dist/workspace-key-mode.js +22 -6
  97. package/dist/workspace-key-mode.js.map +1 -1
  98. package/package.json +4 -3
  99. package/dist/harness-identity.d.ts +0 -17
  100. package/dist/harness-identity.js +0 -105
  101. package/dist/harness-identity.js.map +0 -1
@@ -0,0 +1,141 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `aismemory pull` — copy this agent's memories from the Agent Identity Service
4
+ * into a local JSON Lines backup file (CORBOT-31C43CBD).
5
+ *
6
+ * The counterpart of `aismemory sync`. Sync pushes local files up; this pulls
7
+ * the service's copy down, so memories written from anywhere — the Claude app,
8
+ * Codex, another machine — end up in the local backup too.
9
+ *
10
+ * Reads only the calling agent's own memories, over a route a scoped agent API
11
+ * key may already call. No server change, no widened key scope.
12
+ *
13
+ * Usage:
14
+ * AIS_AGENT_ID=... AIS_API_KEY=... npx aismemory pull
15
+ * npx aismemory pull --out ./backup.jsonl
16
+ * npx aismemory pull --page-size 50 --quiet
17
+ *
18
+ * Exit codes:
19
+ * 0 — backup written
20
+ * 1 — configuration missing, or the service refused or failed the read
21
+ */
22
+ import { realpathSync, mkdirSync, writeFileSync, renameSync, unlinkSync } from 'node:fs';
23
+ import { dirname, join, resolve } from 'node:path';
24
+ import { homedir } from 'node:os';
25
+ import { pathToFileURL } from 'node:url';
26
+ import { loadAgentApiKeyConfig, AgentApiKeyConfigError } from '../agent-key-mode.js';
27
+ import { DEFAULT_AIS_URL } from '../ais-http.js';
28
+ import { pullMemories, toJsonLines, describePullFailure, MAX_PAGE_SIZE, } from '../memory-pull.js';
29
+ const USAGE = `aismemory pull — copy this agent's memories into a local JSON Lines backup
30
+
31
+ Usage:
32
+ aismemory pull [options]
33
+
34
+ Options:
35
+ --out <path> Where to write the backup.
36
+ Default: ~/.aismemory/backups/<agent id>.jsonl
37
+ --page-size <n> Memories per request (1-${MAX_PAGE_SIZE}). Default: ${MAX_PAGE_SIZE}.
38
+ --quiet Only report the final line.
39
+ --help, -h Show this message.
40
+
41
+ Environment:
42
+ AIS_AGENT_ID The agent to pull (required).
43
+ AIS_API_KEY That agent's scoped API key (required).
44
+ AIS_URL Agent Identity Service base URL.
45
+ Default: ${DEFAULT_AIS_URL}
46
+
47
+ Only this agent's own memories are ever read.
48
+ `;
49
+ export function parseArgs(argv) {
50
+ const args = { quiet: false, help: false };
51
+ for (let i = 0; i < argv.length; i++) {
52
+ const flag = argv[i];
53
+ if (flag === '--out' && argv[i + 1]) {
54
+ args.out = argv[++i];
55
+ }
56
+ else if (flag === '--page-size' && argv[i + 1]) {
57
+ const raw = argv[++i];
58
+ const parsed = Number(raw);
59
+ if (!Number.isInteger(parsed) || parsed < 1 || parsed > MAX_PAGE_SIZE) {
60
+ throw new Error(`--page-size must be a whole number between 1 and ${MAX_PAGE_SIZE} (got "${raw}")`);
61
+ }
62
+ args.pageSize = parsed;
63
+ }
64
+ else if (flag === '--quiet') {
65
+ args.quiet = true;
66
+ }
67
+ else if (flag === '--help' || flag === '-h') {
68
+ args.help = true;
69
+ }
70
+ else {
71
+ throw new Error(`Unknown option: ${flag}. Run aismemory pull --help.`);
72
+ }
73
+ }
74
+ return args;
75
+ }
76
+ /** Default backup location for an agent. */
77
+ export function defaultBackupPath(agentId, home = homedir()) {
78
+ return join(home, '.aismemory', 'backups', `${agentId}.jsonl`);
79
+ }
80
+ /**
81
+ * Write the backup atomically: a crash or a failed pull must never leave a
82
+ * half-written file where a complete earlier backup used to be.
83
+ */
84
+ export function writeBackupFile(filePath, contents) {
85
+ mkdirSync(dirname(filePath), { recursive: true, mode: 0o700 });
86
+ const tmp = `${filePath}.tmp`;
87
+ try {
88
+ writeFileSync(tmp, contents, { mode: 0o600 });
89
+ renameSync(tmp, filePath);
90
+ }
91
+ catch (err) {
92
+ try {
93
+ unlinkSync(tmp);
94
+ }
95
+ catch {
96
+ // Nothing to clean up.
97
+ }
98
+ throw err;
99
+ }
100
+ }
101
+ export async function main(argv = process.argv.slice(2)) {
102
+ const args = parseArgs(argv);
103
+ if (args.help) {
104
+ process.stdout.write(USAGE);
105
+ return;
106
+ }
107
+ const config = loadAgentApiKeyConfig();
108
+ if (!config) {
109
+ throw new Error('AIS_API_KEY is not set. aismemory pull needs an agent API key and AIS_AGENT_ID ' +
110
+ 'so it can read that agent\'s own memories.');
111
+ }
112
+ const aisUrl = (process.env['AIS_URL']?.trim() || DEFAULT_AIS_URL).replace(/\/+$/, '');
113
+ const outPath = args.out ? resolve(args.out) : defaultBackupPath(config.agentId);
114
+ const onProgress = args.quiet
115
+ ? undefined
116
+ : (progress) => {
117
+ const of = progress.totalCount === undefined ? '' : ` of ${progress.totalCount}`;
118
+ process.stderr.write(`[aismemory pull] page ${progress.page}: ${progress.total}${of} memories\n`);
119
+ };
120
+ const result = await pullMemories(onProgress === undefined
121
+ ? { aisUrl, agentId: config.agentId, apiKey: config.apiKey, pageSize: args.pageSize }
122
+ : { aisUrl, agentId: config.agentId, apiKey: config.apiKey, pageSize: args.pageSize, onProgress });
123
+ writeBackupFile(outPath, toJsonLines(result.memories));
124
+ process.stdout.write(`Wrote ${result.memories.length} memories to ${outPath}\n`);
125
+ if (result.truncated) {
126
+ process.stderr.write('[aismemory pull] Warning: stopped at the page limit; the backup may be incomplete.\n');
127
+ }
128
+ else if (result.totalCount !== undefined && result.totalCount !== result.memories.length) {
129
+ // Not an error: memories written or deleted mid-walk move the count.
130
+ process.stderr.write(`[aismemory pull] Note: the service reported ${result.totalCount} memories and ${result.memories.length} were pulled; ` +
131
+ 'the corpus changed while the backup was running.\n');
132
+ }
133
+ }
134
+ if (process.argv[1] && pathToFileURL(realpathSync(process.argv[1])).href === import.meta.url) {
135
+ main().catch((err) => {
136
+ const message = err instanceof AgentApiKeyConfigError ? err.message : describePullFailure(err);
137
+ process.stderr.write(`[aismemory pull] Failed: ${message}\n`);
138
+ process.exit(1);
139
+ });
140
+ }
141
+ //# sourceMappingURL=pull-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull-memory.js","sourceRoot":"","sources":["../../src/cli/pull-memory.ts"],"names":[],"mappings":"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"}