aismemory 0.7.2 → 0.7.4

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 (98) hide show
  1. package/README.md +110 -0
  2. package/dist/__tests__/agent-key-mode.test.js +60 -0
  3. package/dist/__tests__/agent-key-mode.test.js.map +1 -1
  4. package/dist/__tests__/agent-load-persistence.test.js +25 -2
  5. package/dist/__tests__/agent-load-persistence.test.js.map +1 -1
  6. package/dist/__tests__/agentmemory.test.d.ts +1 -0
  7. package/dist/__tests__/agentmemory.test.js +73 -0
  8. package/dist/__tests__/agentmemory.test.js.map +1 -0
  9. package/dist/__tests__/ais-http.test.js +73 -45
  10. package/dist/__tests__/ais-http.test.js.map +1 -1
  11. package/dist/__tests__/auto-enroll-key.test.js +10 -6
  12. package/dist/__tests__/auto-enroll-key.test.js.map +1 -1
  13. package/dist/__tests__/beacon-contract.test.d.ts +1 -0
  14. package/dist/__tests__/beacon-contract.test.js +106 -0
  15. package/dist/__tests__/beacon-contract.test.js.map +1 -0
  16. package/dist/__tests__/credential-isolation.test.d.ts +1 -0
  17. package/dist/__tests__/credential-isolation.test.js +61 -0
  18. package/dist/__tests__/credential-isolation.test.js.map +1 -0
  19. package/dist/__tests__/credential-resolution.test.d.ts +1 -0
  20. package/dist/__tests__/credential-resolution.test.js +141 -0
  21. package/dist/__tests__/credential-resolution.test.js.map +1 -0
  22. package/dist/__tests__/doctor.test.js +250 -9
  23. package/dist/__tests__/doctor.test.js.map +1 -1
  24. package/dist/__tests__/ender-receipt-auth.test.d.ts +1 -0
  25. package/dist/__tests__/ender-receipt-auth.test.js +26 -0
  26. package/dist/__tests__/ender-receipt-auth.test.js.map +1 -0
  27. package/dist/__tests__/fixtures/beacon-contract.d.ts +66 -0
  28. package/dist/__tests__/fixtures/beacon-contract.js +72 -0
  29. package/dist/__tests__/fixtures/beacon-contract.js.map +1 -0
  30. package/dist/__tests__/list-all-agents.test.js +2 -0
  31. package/dist/__tests__/list-all-agents.test.js.map +1 -1
  32. package/dist/__tests__/lost-agent.test.d.ts +1 -0
  33. package/dist/__tests__/lost-agent.test.js +108 -0
  34. package/dist/__tests__/lost-agent.test.js.map +1 -0
  35. package/dist/__tests__/mcp-init-no-auth.test.js +29 -5
  36. package/dist/__tests__/mcp-init-no-auth.test.js.map +1 -1
  37. package/dist/__tests__/memory-write-failure.test.js +5 -1
  38. package/dist/__tests__/memory-write-failure.test.js.map +1 -1
  39. package/dist/__tests__/no-registered-keys-disk-bearer-fallback.test.d.ts +1 -0
  40. package/dist/__tests__/no-registered-keys-disk-bearer-fallback.test.js +207 -0
  41. package/dist/__tests__/no-registered-keys-disk-bearer-fallback.test.js.map +1 -0
  42. package/dist/__tests__/provisional-register-mcp-remember.test.js +5 -1
  43. package/dist/__tests__/provisional-register-mcp-remember.test.js.map +1 -1
  44. package/dist/__tests__/readme-tools-parity.test.d.ts +1 -0
  45. package/dist/__tests__/readme-tools-parity.test.js +64 -0
  46. package/dist/__tests__/readme-tools-parity.test.js.map +1 -0
  47. package/dist/__tests__/reconnect-survival-e2e.test.js +80 -9
  48. package/dist/__tests__/reconnect-survival-e2e.test.js.map +1 -1
  49. package/dist/__tests__/token-manager.test.js +12 -0
  50. package/dist/__tests__/token-manager.test.js.map +1 -1
  51. package/dist/__tests__/tool-args.test.js +129 -1
  52. package/dist/__tests__/tool-args.test.js.map +1 -1
  53. package/dist/__tests__/workspace-key-mode.test.d.ts +1 -0
  54. package/dist/__tests__/workspace-key-mode.test.js +264 -0
  55. package/dist/__tests__/workspace-key-mode.test.js.map +1 -0
  56. package/dist/agent-key-mode.d.ts +4 -2
  57. package/dist/agent-key-mode.js +68 -7
  58. package/dist/agent-key-mode.js.map +1 -1
  59. package/dist/ais-http.d.ts +2 -0
  60. package/dist/ais-http.js +72 -5
  61. package/dist/ais-http.js.map +1 -1
  62. package/dist/auth-staleness.d.ts +2 -0
  63. package/dist/auth-staleness.js +5 -0
  64. package/dist/auth-staleness.js.map +1 -1
  65. package/dist/auto-handoff.d.ts +1 -1
  66. package/dist/auto-handoff.js +5 -3
  67. package/dist/auto-handoff.js.map +1 -1
  68. package/dist/cli/doctor.d.ts +4 -0
  69. package/dist/cli/doctor.js +122 -9
  70. package/dist/cli/doctor.js.map +1 -1
  71. package/dist/cli/enable-key-auth.js +6 -6
  72. package/dist/cli/enable-key-auth.js.map +1 -1
  73. package/dist/cli/orientation.d.ts +15 -0
  74. package/dist/cli/orientation.js +89 -0
  75. package/dist/cli/orientation.js.map +1 -0
  76. package/dist/harness-identity.d.ts +17 -0
  77. package/dist/harness-identity.js +105 -0
  78. package/dist/harness-identity.js.map +1 -0
  79. package/dist/hydration.d.ts +1 -1
  80. package/dist/hydration.js +3 -2
  81. package/dist/hydration.js.map +1 -1
  82. package/dist/index.js +365 -44
  83. package/dist/index.js.map +1 -1
  84. package/dist/key-auth.js +9 -9
  85. package/dist/key-auth.js.map +1 -1
  86. package/dist/oauth-credentials.d.ts +11 -0
  87. package/dist/oauth-credentials.js +31 -3
  88. package/dist/oauth-credentials.js.map +1 -1
  89. package/dist/token-manager.d.ts +3 -2
  90. package/dist/token-manager.js +7 -4
  91. package/dist/token-manager.js.map +1 -1
  92. package/dist/tool-args.d.ts +56 -0
  93. package/dist/tool-args.js +85 -0
  94. package/dist/tool-args.js.map +1 -1
  95. package/dist/workspace-key-mode.d.ts +40 -0
  96. package/dist/workspace-key-mode.js +258 -0
  97. package/dist/workspace-key-mode.js.map +1 -0
  98. package/package.json +2 -1
@@ -21,7 +21,7 @@
21
21
  */
22
22
  import { AisHttpError } from './ais-http-error.js';
23
23
  import { emitTelemetry } from './telemetry.js';
24
- import { parseEmptyToolArgs, parseRecallArgs, parseFullContextArgs, parseRememberArgs, parseInboxSendArgs, parseInboxReadArgs, } from './tool-args.js';
24
+ import { parseEmptyToolArgs, parseRecallArgs, parseFullContextArgs, parseRememberArgs, parseInboxSendArgs, parseInboxReadArgs, parseGoalCreateArgs, parseGoalListArgs, parseGoalUpdateProgressArgs, parseGoalCompleteArgs, parseInboxAckArgs, } from './tool-args.js';
25
25
  import { readInboxAndMaybeAck } from './inbox-client.js';
26
26
  /** Thrown by loadAgentApiKeyConfig when AIS_AGENT_API_KEY is set without AIS_AGENT_ID. */
27
27
  export class AgentApiKeyConfigError extends Error {
@@ -31,9 +31,10 @@ export class AgentApiKeyConfigError extends Error {
31
31
  }
32
32
  }
33
33
  /**
34
- * Read agent-API-key config from the environment.
34
+ * Read AIS_API_KEY (preferred) or the legacy AIS_AGENT_API_KEY alias.
35
+ * Only scoped ais_ak_ keys are accepted; never read AIS_SERVICE_KEY.
35
36
  *
36
- * Returns null when AIS_AGENT_API_KEY is unset — the caller falls through to
37
+ * Returns null when both key variables are unset — the caller falls through to
37
38
  * the device-flow/DID-key path. Throws AgentApiKeyConfigError when the key
38
39
  * is set but AIS_AGENT_ID is missing; the caller must print the message to
39
40
  * stderr and exit nonzero, and must NEVER fall back to the device flow or
@@ -41,7 +42,8 @@ export class AgentApiKeyConfigError extends Error {
41
42
  * mode exists to kill).
42
43
  */
43
44
  export function loadAgentApiKeyConfig(env = process.env) {
44
- const rawApiKey = env['AIS_AGENT_API_KEY'];
45
+ const keyName = env['AIS_API_KEY'] !== undefined ? 'AIS_API_KEY' : 'AIS_AGENT_API_KEY';
46
+ const rawApiKey = env[keyName];
45
47
  // Only a truly ABSENT variable selects the device-flow path. A present-but-
46
48
  // empty value is a misconfiguration (e.g. a CI secret that failed to
47
49
  // resolve) and must fail fast: silently falling through to the device flow
@@ -53,19 +55,19 @@ export function loadAgentApiKeyConfig(env = process.env) {
53
55
  // header characters, or the server answers an opaque 401).
54
56
  const apiKey = rawApiKey.trim();
55
57
  if (apiKey === '') {
56
- throw new AgentApiKeyConfigError('AIS_AGENT_API_KEY is set but empty (or whitespace-only).\n' +
58
+ throw new AgentApiKeyConfigError(`${keyName} is set but empty (or whitespace-only).\n` +
57
59
  'Refusing to start: silently falling back to the device flow could ' +
58
60
  'create a duplicate provisional agent.\n' +
59
61
  'Unset the variable to use the device flow, or set a real ais_ak_ key.');
60
62
  }
61
63
  if (!apiKey.startsWith('ais_ak_')) {
62
- throw new AgentApiKeyConfigError('AIS_AGENT_API_KEY does not look like an agent API key — expected the ' +
64
+ throw new AgentApiKeyConfigError(`${keyName} does not look like an agent API key — expected the ` +
63
65
  'ais_ak_ prefix. Service keys and JWTs do not work here; mint an ' +
64
66
  'agent-scoped API key for this agent and use that.');
65
67
  }
66
68
  const agentId = env['AIS_AGENT_ID']?.trim();
67
69
  if (!agentId) {
68
- throw new AgentApiKeyConfigError('AIS_AGENT_API_KEY is set but AIS_AGENT_ID is missing.\n' +
70
+ throw new AgentApiKeyConfigError(`${keyName} is set but AIS_AGENT_ID is missing.\n` +
69
71
  'Agent API keys are scoped to exactly one agent — set AIS_AGENT_ID to the id ' +
70
72
  'of the agent this key belongs to (the same agent it was minted for).\n' +
71
73
  'Refusing to start: falling back to the device flow or creating a new ' +
@@ -112,6 +114,26 @@ export async function aisKeyGet(aisUrl, path, apiKey, fetchImpl = globalThis.fet
112
114
  }
113
115
  return data;
114
116
  }
117
+ export async function aisKeyPatch(aisUrl, path, apiKey, body, fetchImpl = globalThis.fetch) {
118
+ const headers = {
119
+ 'Content-Type': 'application/json',
120
+ 'x-agent-api-key': apiKey,
121
+ };
122
+ let res;
123
+ try {
124
+ res = await fetchImpl(`${aisUrl}${path}`, { method: 'PATCH', headers, body: JSON.stringify(body) });
125
+ }
126
+ catch (err) {
127
+ emitTelemetry({ event: 'ais.http.failure', path, error: err instanceof Error ? err.message : String(err) });
128
+ throw err;
129
+ }
130
+ const data = await readJson(res);
131
+ if (!res.ok) {
132
+ emitTelemetry({ event: 'ais.http.failure', path, httpStatus: res.status, error: `HTTP ${res.status}` });
133
+ throw new AisHttpError(res.status, path, data);
134
+ }
135
+ return data;
136
+ }
115
137
  // ── Scoped tool dispatch ─────────────────────────────────────────────────
116
138
  /** Sentinel returned for a tool name this dispatcher doesn't recognize. */
117
139
  export const UNKNOWN_TOOL_KEY_MODE = Symbol('unknown-tool-key-mode');
@@ -205,6 +227,45 @@ export async function dispatchToolKeyMode(aisUrl, config, name, rawArgs, fetchIm
205
227
  params.set('unreadOnly', String(args.unreadOnly));
206
228
  return readInboxAndMaybeAck(args, () => aisKeyGet(aisUrl, `/v1/agents/${agentId}/inbox?${params}`, apiKey, fetchImpl), (messageIds) => aisKeyPost(aisUrl, `/v1/agents/${agentId}/inbox/ack`, apiKey, { messageIds }, fetchImpl));
207
229
  }
230
+ case 'inbox_ack': {
231
+ const args = parseInboxAckArgs(rawArgs);
232
+ return aisKeyPost(aisUrl, `/v1/agents/${agentId}/inbox/ack`, apiKey, { messageIds: args.messageIds }, fetchImpl);
233
+ }
234
+ case 'goal_create': {
235
+ const args = parseGoalCreateArgs(rawArgs);
236
+ return aisKeyPost(aisUrl, `/v1/agents/${agentId}/goals`, apiKey, {
237
+ title: args.title,
238
+ description: args.description,
239
+ ...(args.successCriteria !== undefined ? { successCriteria: args.successCriteria } : {}),
240
+ ...(args.parentGoalId !== undefined ? { parentGoalId: args.parentGoalId } : {}),
241
+ }, fetchImpl);
242
+ }
243
+ case 'goal_list': {
244
+ const args = parseGoalListArgs(rawArgs);
245
+ const params = new URLSearchParams();
246
+ if (args.status !== undefined)
247
+ params.set('status', args.status);
248
+ if (args.page !== undefined)
249
+ params.set('page', String(args.page));
250
+ params.set('limit', String(args.limit));
251
+ if (args.parentGoalId !== undefined)
252
+ params.set('parentGoalId', args.parentGoalId);
253
+ return aisKeyGet(aisUrl, `/v1/agents/${agentId}/goals?${params}`, apiKey, fetchImpl);
254
+ }
255
+ case 'goal_update_progress': {
256
+ const args = parseGoalUpdateProgressArgs(rawArgs);
257
+ return aisKeyPatch(aisUrl, `/v1/agents/${agentId}/goals/${args.goalId}`, apiKey, {
258
+ progress: args.progress,
259
+ }, fetchImpl);
260
+ }
261
+ case 'goal_complete': {
262
+ const args = parseGoalCompleteArgs(rawArgs);
263
+ return aisKeyPost(aisUrl, `/v1/agents/${agentId}/goals/${args.goalId}/complete`, apiKey, {
264
+ success: args.success,
265
+ ...(args.notes !== undefined ? { notes: args.notes } : {}),
266
+ ...(args.lessonsLearned !== undefined ? { lessonsLearned: args.lessonsLearned } : {}),
267
+ }, fetchImpl);
268
+ }
208
269
  case 'handoff':
209
270
  throw new OutOfScopeToolError('handoff', "the handoff route is outside the key's allowed scope (memory, goals, dream, full-context).");
210
271
  case 'agent_load':
@@ -1 +1 @@
1
- {"version":3,"file":"agent-key-mode.js","sourceRoot":"","sources":["../src/agent-key-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAOzD,0FAA0F;AAC1F,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAA0C,OAAO,CAAC,GAAG;IAErD,MAAM,SAAS,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC3C,4EAA4E;IAC5E,qEAAqE;IACrE,2EAA2E;IAC3E,6DAA6D;IAC7D,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAEzC,4EAA4E;IAC5E,2EAA2E;IAC3E,2DAA2D;IAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,sBAAsB,CAC9B,4DAA4D;YAC1D,oEAAoE;YACpE,yCAAyC;YACzC,uEAAuE,CAC1E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,sBAAsB,CAC9B,uEAAuE;YACrE,kEAAkE;YAClE,mDAAmD,CACtD,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,sBAAsB,CAC9B,yDAAyD;YACvD,8EAA8E;YAC9E,wEAAwE;YACxE,uEAAuE;YACvE,4DAA4D,CAC/D,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAMD,KAAK,UAAU,QAAQ,CAAC,GAAa;IACnC,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,IAAY,EACZ,MAAc,EACd,IAAa,EACb,YAAuB,UAAU,CAAC,KAAK;IAEvC,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,iBAAiB,EAAE,MAAM;KAC1B,CAAC;IACF,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,aAAa,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5G,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,aAAa,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACxG,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAc,EACd,IAAY,EACZ,MAAc,EACd,YAAuB,UAAU,CAAC,KAAK;IAEvC,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACxF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,aAAa,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5G,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,aAAa,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACxG,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4EAA4E;AAE5E,2EAA2E;AAC3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAErE;;;;;;GAMG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,IAAY,EAAE,MAAc;QACtC,KAAK,CAAC,GAAG,IAAI,mEAAmE,MAAM,EAAE,CAAC,CAAC;QAC1F,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAc,EACd,MAAyB,EACzB,IAAY,EACZ,OAAgB,EAChB,YAAuB,UAAU,CAAC,KAAK;IAEvC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAEnC,QAAQ,IAAI,EAAE,CAAC;QACf,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO,UAAU,CAAC,MAAM,EAAE,cAAc,OAAO,SAAS,EAAE,MAAM,EAAE;gBAChE,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,UAAU,EAAE,IAAI,CAAC,UAAU;aAC5B,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACxC,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACxD,CAAC;YACD,OAAO,SAAS,CAAC,MAAM,EAAE,cAAc,OAAO,WAAW,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACxF,CAAC;QAED,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;YACvC,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS;gBAAE,QAAQ,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACrG,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS;gBAAE,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;YACpG,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,cAAc,OAAO,gBAAgB,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC7E,OAAO,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACtD,CAAC;QAED,KAAK,OAAO;YACV,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,UAAU,CAAC,MAAM,EAAE,cAAc,OAAO,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;QAElF,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC5B,sEAAsE;YACtE,kEAAkE;YAClE,iEAAiE;YACjE,sEAAsE;YACtE,yEAAyE;YACzE,MAAM,SAAS,CAAC,MAAM,EAAE,cAAc,OAAO,iBAAiB,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YACnF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE;oBACJ,OAAO;oBACP,QAAQ,EAAE,eAAe;oBACzB,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC;QACJ,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACzC,OAAO,UAAU,CAAC,MAAM,EAAE,cAAc,OAAO,QAAQ,EAAE,MAAM,EAAE;gBAC/D,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtE,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtE,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1E,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACjE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAClD,OAAO,oBAAoB,CACzB,IAAI,EACJ,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,cAAc,OAAO,UAAU,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EACnF,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,OAAO,YAAY,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,EAAE,SAAS,CAAC,CACzG,CAAC;QACJ,CAAC;QAED,KAAK,SAAS;YACZ,MAAM,IAAI,mBAAmB,CAC3B,SAAS,EACT,4FAA4F,CAC7F,CAAC;QAEJ,KAAK,YAAY;YACf,MAAM,IAAI,mBAAmB,CAC3B,YAAY,EACZ,oFAAoF;gBAClF,8FAA8F,CACjG,CAAC;QAEJ;YACE,OAAO,qBAAqB,CAAC;IAC/B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"agent-key-mode.js","sourceRoot":"","sources":["../src/agent-key-mode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,2BAA2B,EAC3B,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAOzD,0FAA0F;AAC1F,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAA0C,OAAO,CAAC,GAAG;IAErD,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,mBAAmB,CAAC;IACvF,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,4EAA4E;IAC5E,qEAAqE;IACrE,2EAA2E;IAC3E,6DAA6D;IAC7D,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAEzC,4EAA4E;IAC5E,2EAA2E;IAC3E,2DAA2D;IAC3D,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAChC,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,sBAAsB,CAC9B,GAAG,OAAO,2CAA2C;YACnD,oEAAoE;YACpE,yCAAyC;YACzC,uEAAuE,CAC1E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,sBAAsB,CAC9B,GAAG,OAAO,sDAAsD;YAC9D,kEAAkE;YAClE,mDAAmD,CACtD,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,sBAAsB,CAC9B,GAAG,OAAO,wCAAwC;YAChD,8EAA8E;YAC9E,wEAAwE;YACxE,uEAAuE;YACvE,4DAA4D,CAC/D,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC;AAMD,KAAK,UAAU,QAAQ,CAAC,GAAa;IACnC,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,IAAY,EACZ,MAAc,EACd,IAAa,EACb,YAAuB,UAAU,CAAC,KAAK;IAEvC,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,iBAAiB,EAAE,MAAM;KAC1B,CAAC;IACF,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,aAAa,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5G,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,aAAa,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACxG,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAc,EACd,IAAY,EACZ,MAAc,EACd,YAAuB,UAAU,CAAC,KAAK;IAEvC,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;IACxF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,aAAa,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5G,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,aAAa,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACxG,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,IAAY,EACZ,MAAc,EACd,IAAa,EACb,YAAuB,UAAU,CAAC,KAAK;IAEvC,MAAM,OAAO,GAA2B;QACtC,cAAc,EAAE,kBAAkB;QAClC,iBAAiB,EAAE,MAAM;KAC1B,CAAC;IACF,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,aAAa,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5G,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,aAAa,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACxG,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4EAA4E;AAE5E,2EAA2E;AAC3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAErE;;;;;;GAMG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C,YAAY,IAAY,EAAE,MAAc;QACtC,KAAK,CAAC,GAAG,IAAI,mEAAmE,MAAM,EAAE,CAAC,CAAC;QAC1F,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAc,EACd,MAAyB,EACzB,IAAY,EACZ,OAAgB,EAChB,YAAuB,UAAU,CAAC,KAAK;IAEvC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAEnC,QAAQ,IAAI,EAAE,CAAC;QACf,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO,UAAU,CAAC,MAAM,EAAE,cAAc,OAAO,SAAS,EAAE,MAAM,EAAE;gBAChE,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,UAAU,EAAE,IAAI,CAAC,UAAU;aAC5B,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC;QAED,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACtE,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACxC,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACxD,CAAC;YACD,OAAO,SAAS,CAAC,MAAM,EAAE,cAAc,OAAO,WAAW,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACxF,CAAC;QAED,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;YACvC,IAAI,MAAM,CAAC,gBAAgB,KAAK,SAAS;gBAAE,QAAQ,CAAC,GAAG,CAAC,kBAAkB,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;YACrG,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS;gBAAE,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;YACpG,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,cAAc,OAAO,gBAAgB,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC7E,OAAO,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACtD,CAAC;QAED,KAAK,OAAO;YACV,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,UAAU,CAAC,MAAM,EAAE,cAAc,OAAO,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;QAElF,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC5B,sEAAsE;YACtE,kEAAkE;YAClE,iEAAiE;YACjE,sEAAsE;YACtE,yEAAyE;YACzE,MAAM,SAAS,CAAC,MAAM,EAAE,cAAc,OAAO,iBAAiB,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;YACnF,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE;oBACJ,OAAO;oBACP,QAAQ,EAAE,eAAe;oBACzB,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC;QACJ,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACzC,OAAO,UAAU,CAAC,MAAM,EAAE,cAAc,OAAO,QAAQ,EAAE,MAAM,EAAE;gBAC/D,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnE,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtE,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtE,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1E,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC;QAED,KAAK,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACjE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YAClD,OAAO,oBAAoB,CACzB,IAAI,EACJ,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,cAAc,OAAO,UAAU,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EACnF,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,OAAO,YAAY,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,EAAE,SAAS,CAAC,CACzG,CAAC;QACJ,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO,UAAU,CAAC,MAAM,EAAE,cAAc,OAAO,YAAY,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC;QACnH,CAAC;QAED,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAC1C,OAAO,UAAU,CAAC,MAAM,EAAE,cAAc,OAAO,QAAQ,EAAE,MAAM,EAAE;gBAC/D,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,GAAG,CAAC,IAAI,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxF,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAChF,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACjE,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACnE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACnF,OAAO,SAAS,CAAC,MAAM,EAAE,cAAc,OAAO,UAAU,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACvF,CAAC;QAED,KAAK,sBAAsB,CAAC,CAAC,CAAC;YAC5B,MAAM,IAAI,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;YAClD,OAAO,WAAW,CAAC,MAAM,EAAE,cAAc,OAAO,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE;gBAC/E,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC;QAED,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAC5C,OAAO,UAAU,CAAC,MAAM,EAAE,cAAc,OAAO,UAAU,IAAI,CAAC,MAAM,WAAW,EAAE,MAAM,EAAE;gBACvF,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1D,GAAG,CAAC,IAAI,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtF,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC;QAED,KAAK,SAAS;YACZ,MAAM,IAAI,mBAAmB,CAC3B,SAAS,EACT,4FAA4F,CAC7F,CAAC;QAEJ,KAAK,YAAY;YACf,MAAM,IAAI,mBAAmB,CAC3B,YAAY,EACZ,oFAAoF;gBAClF,8FAA8F,CACjG,CAAC;QAEJ;YACE,OAAO,qBAAqB,CAAC;IAC/B,CAAC;AACH,CAAC"}
@@ -2,5 +2,7 @@
2
2
  * AIS HTTP helpers — extracted from index.ts for reuse without MCP side effects.
3
3
  * CORBOT-282AE4FE
4
4
  */
5
+ export declare const DEFAULT_AIS_URL = "https://ais.agentsandswarms.ai";
5
6
  export declare function aisPost(path: string, body: unknown, token?: string): Promise<unknown>;
7
+ export declare function aisPatch(path: string, body: unknown, token?: string): Promise<unknown>;
6
8
  export declare function aisGet(path: string, token: string): Promise<unknown>;
package/dist/ais-http.js CHANGED
@@ -5,17 +5,48 @@
5
5
  import { isAuthErrorResult } from './auth-staleness.js';
6
6
  import { AisHttpError } from './ais-http-error.js';
7
7
  import { emitTelemetry } from './telemetry.js';
8
- const AIS_URL = process.env['AIS_URL'] ?? 'https://ais.agentsandswarms.ai';
8
+ const AIS_HTTP_TIMEOUT_MS = 10_000;
9
+ export const DEFAULT_AIS_URL = 'https://ais.agentsandswarms.ai';
10
+ function getAisUrl() {
11
+ const configured = process.env['AIS_URL']?.trim();
12
+ const aisUrl = configured || DEFAULT_AIS_URL;
13
+ try {
14
+ new URL(aisUrl);
15
+ }
16
+ catch {
17
+ throw new Error(`AIS_URL is not a valid URL: ${aisUrl}`);
18
+ }
19
+ return aisUrl;
20
+ }
21
+ function buildUrl(path) {
22
+ const aisUrl = getAisUrl();
23
+ const baseUrl = aisUrl.endsWith('/') ? aisUrl : `${aisUrl}/`;
24
+ return new URL(path, baseUrl).toString();
25
+ }
26
+ async function readJsonBody(res, path) {
27
+ const text = await res.text();
28
+ if (text.trim() === '')
29
+ return null;
30
+ try {
31
+ const parsed = JSON.parse(text);
32
+ return parsed;
33
+ }
34
+ catch (err) {
35
+ const message = err instanceof Error ? err.message : String(err);
36
+ throw new Error(`AIS response for ${path} was not valid JSON (HTTP ${res.status}): ${message}; body=${text.slice(0, 200)}`);
37
+ }
38
+ }
9
39
  export async function aisPost(path, body, token) {
10
40
  const headers = { 'Content-Type': 'application/json' };
11
41
  if (token)
12
42
  headers['Authorization'] = `Bearer ${token}`;
13
43
  let res;
14
44
  try {
15
- res = await fetch(`${AIS_URL}${path}`, {
45
+ res = await fetch(buildUrl(path), {
16
46
  method: 'POST',
17
47
  headers,
18
48
  body: JSON.stringify(body),
49
+ signal: AbortSignal.timeout(AIS_HTTP_TIMEOUT_MS),
19
50
  });
20
51
  }
21
52
  catch (err) {
@@ -26,7 +57,7 @@ export async function aisPost(path, body, token) {
26
57
  });
27
58
  throw err;
28
59
  }
29
- const data = await res.json().catch(() => null);
60
+ const data = await readJsonBody(res, path);
30
61
  if (!res.ok) {
31
62
  emitTelemetry({
32
63
  event: 'ais.http.failure',
@@ -43,11 +74,47 @@ export async function aisPost(path, body, token) {
43
74
  }
44
75
  return data;
45
76
  }
77
+ export async function aisPatch(path, body, token) {
78
+ const headers = { 'Content-Type': 'application/json' };
79
+ if (token)
80
+ headers['Authorization'] = `Bearer ${token}`;
81
+ let res;
82
+ try {
83
+ res = await fetch(buildUrl(path), {
84
+ method: 'PATCH',
85
+ headers,
86
+ body: JSON.stringify(body),
87
+ signal: AbortSignal.timeout(AIS_HTTP_TIMEOUT_MS),
88
+ });
89
+ }
90
+ catch (err) {
91
+ emitTelemetry({
92
+ event: 'ais.http.failure',
93
+ path,
94
+ error: err instanceof Error ? err.message : String(err),
95
+ });
96
+ throw err;
97
+ }
98
+ const data = await readJsonBody(res, path);
99
+ if (!res.ok) {
100
+ emitTelemetry({
101
+ event: 'ais.http.failure',
102
+ path,
103
+ httpStatus: res.status,
104
+ error: `HTTP ${res.status}`,
105
+ });
106
+ if (isAuthErrorResult(data))
107
+ return data;
108
+ throw new AisHttpError(res.status, path, data);
109
+ }
110
+ return data;
111
+ }
46
112
  export async function aisGet(path, token) {
47
113
  let res;
48
114
  try {
49
- res = await fetch(`${AIS_URL}${path}`, {
115
+ res = await fetch(buildUrl(path), {
50
116
  headers: { 'Authorization': `Bearer ${token}` },
117
+ signal: AbortSignal.timeout(AIS_HTTP_TIMEOUT_MS),
51
118
  });
52
119
  }
53
120
  catch (err) {
@@ -58,7 +125,7 @@ export async function aisGet(path, token) {
58
125
  });
59
126
  throw err;
60
127
  }
61
- const data = await res.json().catch(() => null);
128
+ const data = await readJsonBody(res, path);
62
129
  if (!res.ok) {
63
130
  emitTelemetry({
64
131
  event: 'ais.http.failure',
@@ -1 +1 @@
1
- {"version":3,"file":"ais-http.js","sourceRoot":"","sources":["../src/ais-http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ais-http.js","sourceRoot":"","sources":["../src/ais-http.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEnC,MAAM,CAAC,MAAM,eAAe,GAAG,gCAAgC,CAAC;AAEhE,SAAS,SAAS;IAChB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;IAClD,MAAM,MAAM,GAAG,UAAU,IAAI,eAAe,CAAC;IAC7C,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC;IAC7D,OAAO,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,GAAa,EAAE,IAAY;IACrD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,MAAM,IAAI,KAAK,CACb,oBAAoB,IAAI,6BAA6B,GAAG,CAAC,MAAM,MAAM,OAAO,UAAU,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAC3G,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAY,EAAE,IAAa,EAAE,KAAc;IACvE,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IAC/E,IAAI,KAAK;QAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;IACxD,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,mBAAmB,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,aAAa,CAAC;YACZ,KAAK,EAAE,kBAAkB;YACzB,IAAI;YACJ,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAC;QACH,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,aAAa,CAAC;YACZ,KAAK,EAAE,kBAAkB;YACzB,IAAI;YACJ,UAAU,EAAE,GAAG,CAAC,MAAM;YACtB,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE;SAC5B,CAAC,CAAC;QACH,uEAAuE;QACvE,sEAAsE;QACtE,kDAAkD;QAClD,IAAI,iBAAiB,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACzC,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,IAAa,EAAE,KAAc;IACxE,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;IAC/E,IAAI,KAAK;QAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;IACxD,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YAChC,MAAM,EAAE,OAAO;YACf,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,mBAAmB,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,aAAa,CAAC;YACZ,KAAK,EAAE,kBAAkB;YACzB,IAAI;YACJ,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAC;QACH,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,aAAa,CAAC;YACZ,KAAK,EAAE,kBAAkB;YACzB,IAAI;YACJ,UAAU,EAAE,GAAG,CAAC,MAAM;YACtB,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE;SAC5B,CAAC,CAAC;QACH,IAAI,iBAAiB,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACzC,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAY,EAAE,KAAa;IACtD,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YAChC,OAAO,EAAE,EAAE,eAAe,EAAE,UAAU,KAAK,EAAE,EAAE;YAC/C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,mBAAmB,CAAC;SACjD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,aAAa,CAAC;YACZ,KAAK,EAAE,kBAAkB;YACzB,IAAI;YACJ,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC,CAAC;QACH,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,aAAa,CAAC;YACZ,KAAK,EAAE,kBAAkB;YACzB,IAAI;YACJ,UAAU,EAAE,GAAG,CAAC,MAAM;YACtB,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE;SAC5B,CAAC,CAAC;QACH,IAAI,iBAAiB,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACzC,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -25,3 +25,5 @@ export declare function isCredsStale(expiresAt: string, nowMs: number, marginMs?
25
25
  * (TOKEN_EXPIRED or INVALID_TOKEN) — the signal to re-auth and retry.
26
26
  */
27
27
  export declare function isAuthErrorResult(result: unknown): boolean;
28
+ /** True when AIS rejected did-prove because no human key is registered for this DID. */
29
+ export declare function isNoRegisteredKeysAuthError(err: unknown): boolean;
@@ -38,4 +38,9 @@ export function isAuthErrorResult(result) {
38
38
  const code = r.error?.code;
39
39
  return code === 'TOKEN_EXPIRED' || code === 'INVALID_TOKEN';
40
40
  }
41
+ /** True when AIS rejected did-prove because no human key is registered for this DID. */
42
+ export function isNoRegisteredKeysAuthError(err) {
43
+ const message = err instanceof Error ? err.message : String(err);
44
+ return /NO_REGISTERED_KEYS?/i.test(message);
45
+ }
41
46
  //# sourceMappingURL=auth-staleness.js.map
@@ -1 +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"}
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;AAED,wFAAwF;AACxF,MAAM,UAAU,2BAA2B,CAAC,GAAY;IACtD,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjE,OAAO,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC"}
@@ -14,4 +14,4 @@ export interface HandoffPayload {
14
14
  keyLearnings: string[];
15
15
  }
16
16
  export declare function buildHandoffPayload(tracker: ActivityTracker): HandoffPayload;
17
- export declare function setupAutoHandoff(aisUrl: string, agentId: string, token: string, tracker: ActivityTracker, onBeforeExit?: () => void): void;
17
+ export declare function setupAutoHandoff(aisUrl: string, agentId: string, token: string, tracker: ActivityTracker, onBeforeExit?: () => void, beforeWrite?: () => Promise<void>): void;
@@ -45,7 +45,7 @@ export function buildHandoffPayload(tracker) {
45
45
  return { summary, keyLearnings: memories };
46
46
  }
47
47
  const HANDOFF_FETCH_TIMEOUT_MS = 5_000;
48
- export function setupAutoHandoff(aisUrl, agentId, token, tracker, onBeforeExit) {
48
+ export function setupAutoHandoff(aisUrl, agentId, token, tracker, onBeforeExit, beforeWrite) {
49
49
  let exiting = false;
50
50
  const doHandoff = async () => {
51
51
  if (exiting)
@@ -55,6 +55,8 @@ export function setupAutoHandoff(aisUrl, agentId, token, tracker, onBeforeExit)
55
55
  return;
56
56
  const payload = buildHandoffPayload(tracker);
57
57
  try {
58
+ if (beforeWrite)
59
+ await beforeWrite();
58
60
  await fetch(`${aisUrl}/v1/agents/${agentId}/handoff`, {
59
61
  method: 'POST',
60
62
  headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` },
@@ -62,8 +64,8 @@ export function setupAutoHandoff(aisUrl, agentId, token, tracker, onBeforeExit)
62
64
  signal: AbortSignal.timeout(HANDOFF_FETCH_TIMEOUT_MS),
63
65
  });
64
66
  }
65
- catch {
66
- // Best-effort — still exit if POST fails or times out
67
+ catch (error) {
68
+ process.stderr.write(`[aismemory] Auto-handoff stopped: ${error instanceof Error ? error.message : String(error)}\n`);
67
69
  }
68
70
  if (onBeforeExit)
69
71
  onBeforeExit();
@@ -1 +1 @@
1
- {"version":3,"file":"auto-handoff.js","sourceRoot":"","sources":["../src/auto-handoff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auto-handoff.js","sourceRoot":"","sources":["../src/auto-handoff.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,8 @@ export interface CheckResult {
8
8
  hint?: string;
9
9
  }
10
10
  export interface DoctorReport {
11
+ scope: 'cli-environment';
12
+ runtimeEvidence: 'unavailable';
11
13
  aisUrl: string;
12
14
  checks: CheckResult[];
13
15
  problemCount: number;
@@ -52,6 +54,8 @@ export interface DoctorOptions {
52
54
  tlsProbe?: TlsProbeFn;
53
55
  loadCreds?: (home?: string) => OAuthCredentials | null;
54
56
  home?: string;
57
+ argv?: string[];
55
58
  }
59
+ export declare function checkHarnessIdentity(baseUrl: string, options?: DoctorOptions): Promise<CheckResult>;
56
60
  export declare function runDoctor(options?: DoctorOptions): Promise<DoctorReport>;
57
61
  export declare function main(argv?: string[]): Promise<void>;
@@ -18,10 +18,17 @@
18
18
  * 0 — no FAIL checks (WARNs are still reported but don't fail the command)
19
19
  * 1 — at least one FAIL check
20
20
  */
21
+ import { pathToFileURL } from 'node:url';
22
+ import { openSync, fstatSync, readSync, closeSync, constants, realpathSync } from 'node:fs';
23
+ import { orient } from './orientation.js';
21
24
  import { lookup as dnsLookupDefault } from 'node:dns/promises';
22
25
  import { connect as tlsConnectDefault } from 'node:tls';
23
26
  import { loadOAuthCredentials, credentialsFilePath } from '../oauth-credentials.js';
24
27
  import { isCredsStale } from '../auth-staleness.js';
28
+ import { loadHarnessIdentity, verifyPinnedIdentity, IDENTITY_REPAIR } from '../harness-identity.js';
29
+ import { loadAgentApiKeyConfig, dispatchToolKeyMode, AgentApiKeyConfigError } from '../agent-key-mode.js';
30
+ import { loadWorkspaceKeyConfig, dispatchToolWorkspaceKeyMode, WorkspaceKeyConfigError } from '../workspace-key-mode.js';
31
+ import { DEFAULT_AIS_URL } from '../ais-http.js';
25
32
  /** Minimum Node major version this package requires (per @modelcontextprotocol/sdk engines). */
26
33
  const MIN_NODE_MAJOR = 18;
27
34
  const PROXY_ENV_KEYS = ['HTTPS_PROXY', 'https_proxy', 'HTTP_PROXY', 'http_proxy', 'NO_PROXY', 'no_proxy'];
@@ -149,9 +156,19 @@ export async function checkRestHealth(baseUrl, fetchImpl = fetch) {
149
156
  export async function checkMcpEndpoint(baseUrl, fetchImpl = fetch) {
150
157
  const url = `${baseUrl}/mcp`;
151
158
  try {
152
- const res = await fetchImpl(url);
153
- // Any resolved HTTP response (even 401 "auth required") proves the MCP
154
- // endpoint is reachable — only a network-level failure means "down".
159
+ const res = await fetchImpl(url, { redirect: 'manual' });
160
+ // An unauthenticated probe can expect an auth challenge, but error pages
161
+ // and redirects do not establish that the configured MCP endpoint works.
162
+ if (!res.ok && res.status !== 401 && res.status !== 403) {
163
+ return {
164
+ name: 'MCP HTTP endpoint',
165
+ status: 'FAIL',
166
+ message: `${url} responded HTTP ${res.status} — MCP endpoint health could not be confirmed.`,
167
+ hint: res.status >= 500
168
+ ? 'The MCP service reported a server error. Check service health and retry.'
169
+ : 'Check AIS_URL and the canonical /mcp route; resolve the reported HTTP error or redirect and retry.',
170
+ };
171
+ }
155
172
  const authNote = res.status === 401 || res.status === 403 ? ' (auth required, as expected without a key)' : '';
156
173
  return {
157
174
  name: 'MCP HTTP endpoint',
@@ -266,13 +283,68 @@ export function checkClockSkew(dateHeader, now = Date.now, warnThresholdMs = CLO
266
283
  message: `Local clock is within ${skewMinutes} min of the AIS server.`,
267
284
  };
268
285
  }
286
+ export async function checkHarnessIdentity(baseUrl, options = {}) {
287
+ const env = options.env ?? process.env;
288
+ let pin;
289
+ try {
290
+ const loadedPin = loadHarnessIdentity(options.argv ?? [], env, options.home);
291
+ if (!loadedPin) {
292
+ return {
293
+ name: 'Harness identity gate',
294
+ status: 'PASS',
295
+ message: 'No harness identity pin configured; legacy unpinned mode remains allowed.',
296
+ hint: 'Install and launch with a harness pin to protect against shared-default identity drift.',
297
+ };
298
+ }
299
+ pin = loadedPin;
300
+ }
301
+ catch (error) {
302
+ return { name: 'Harness identity gate', status: 'FAIL', message: errMsg(error), hint: IDENTITY_REPAIR };
303
+ }
304
+ try {
305
+ const adapterEnv = { ...env, AIS_AGENT_ID: pin.agentId };
306
+ const workspace = loadWorkspaceKeyConfig(adapterEnv);
307
+ const agentKey = workspace ? null : loadAgentApiKeyConfig(adapterEnv);
308
+ const fetchImpl = options.fetchImpl ?? fetch;
309
+ await verifyPinnedIdentity(pin, pin.agentId, async () => {
310
+ if (workspace)
311
+ return dispatchToolWorkspaceKeyMode(baseUrl, workspace, 'whoami', {}, fetchImpl);
312
+ if (agentKey)
313
+ return dispatchToolKeyMode(baseUrl, agentKey, 'whoami', {}, fetchImpl);
314
+ const creds = (options.loadCreds ?? loadOAuthCredentials)(options.home);
315
+ if (!creds || isCredsStale(creds.expiresAt, (options.now ?? Date.now)())) {
316
+ throw new Error('No current bearer available to doctor; run whoami in the restarted harness to verify its live key-auth session.');
317
+ }
318
+ const response = await fetchImpl(`${baseUrl}/v1/agents/${pin.agentId}`, {
319
+ headers: { Authorization: `Bearer ${creds.token}` },
320
+ signal: AbortSignal.timeout(10_000),
321
+ });
322
+ if (!response.ok)
323
+ throw new Error(`whoami returned HTTP ${response.status}`);
324
+ return response.json();
325
+ });
326
+ return { name: 'Harness identity gate', status: 'PASS', message: `${pin.harness} pinned to ${pin.agentId}; whoami verified in this CLI process.` };
327
+ }
328
+ catch (error) {
329
+ if (error instanceof WorkspaceKeyConfigError || error instanceof AgentApiKeyConfigError) {
330
+ return {
331
+ name: 'Harness identity gate',
332
+ status: 'FAIL',
333
+ message: errMsg(error),
334
+ hint: 'Fix the scoped key environment (AIS_WORKSPACE_KEY/AIS_AGENT_API_KEY and AIS_AGENT_ID), then rerun doctor.',
335
+ };
336
+ }
337
+ return { name: 'Harness identity gate', status: 'FAIL', message: errMsg(error), hint: IDENTITY_REPAIR };
338
+ }
339
+ }
269
340
  export async function runDoctor(options = {}) {
270
341
  const env = options.env ?? process.env;
271
- const aisUrl = options.aisUrl ?? env['AIS_URL'] ?? 'https://ais.agentsandswarms.ai';
342
+ const aisUrl = options.aisUrl ?? env['AIS_URL'] ?? DEFAULT_AIS_URL;
272
343
  const host = new URL(aisUrl).hostname;
273
344
  const fetchImpl = options.fetchImpl ?? fetch;
274
345
  const now = options.now ?? Date.now;
275
346
  const checks = [];
347
+ checks.push(await checkHarnessIdentity(aisUrl, options));
276
348
  checks.push(checkNodeVersion(options.nodeVersion));
277
349
  checks.push(await checkDnsResolution(host, options.dnsLookup));
278
350
  checks.push(await checkTlsReachability(host, options.tlsProbe));
@@ -290,6 +362,8 @@ export async function runDoctor(options = {}) {
290
362
  const problemCount = checks.filter((c) => c.status !== 'PASS').length;
291
363
  const hasFail = checks.some((c) => c.status === 'FAIL');
292
364
  return {
365
+ scope: 'cli-environment',
366
+ runtimeEvidence: 'unavailable',
293
367
  aisUrl,
294
368
  checks,
295
369
  problemCount,
@@ -301,6 +375,7 @@ export async function runDoctor(options = {}) {
301
375
  function formatText(report) {
302
376
  const lines = [];
303
377
  lines.push(`aismemory doctor — ${report.aisUrl}`);
378
+ lines.push('Scope: CLI environment only. Runtime evidence unavailable; desktop hooks and harness wiring are not verified.');
304
379
  lines.push('');
305
380
  for (const c of report.checks) {
306
381
  lines.push(`[${c.status}] ${c.name}: ${c.message}`);
@@ -314,9 +389,45 @@ function formatText(report) {
314
389
  : `doctor: ${report.problemCount} problem(s) found`);
315
390
  return lines.join('\n');
316
391
  }
392
+ /** Enforce the byte limit on the opened file, even if its path or size changes. */
393
+ function readOrientation(path) {
394
+ if (!path)
395
+ throw new Error('Orientation requires a public-safe JSON file of at most 8192 bytes.');
396
+ let descriptor;
397
+ try {
398
+ descriptor = openSync(path, constants.O_RDONLY | constants.O_NONBLOCK);
399
+ if (!fstatSync(descriptor).isFile())
400
+ throw new Error('Not a regular file.');
401
+ const bytes = Buffer.alloc(8193);
402
+ let length = 0;
403
+ while (length < bytes.length) {
404
+ const count = readSync(descriptor, bytes, length, bytes.length - length, length);
405
+ if (count === 0)
406
+ break;
407
+ length += count;
408
+ }
409
+ if (length > 8192)
410
+ throw new Error('File exceeds byte limit.');
411
+ return JSON.parse(bytes.subarray(0, length).toString('utf8'));
412
+ }
413
+ catch {
414
+ throw new Error('Cannot read orientation JSON. Use a public-safe regular JSON file of at most 8192 bytes; include no secrets.');
415
+ }
416
+ finally {
417
+ if (descriptor !== undefined)
418
+ closeSync(descriptor);
419
+ }
420
+ }
317
421
  export async function main(argv = process.argv.slice(2)) {
422
+ const orientationIndex = argv.indexOf('--orientation');
423
+ if (orientationIndex !== -1) {
424
+ const report = orient(readOrientation(argv[orientationIndex + 1]));
425
+ process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
426
+ process.exit(report.exitCode);
427
+ return;
428
+ }
318
429
  const json = argv.includes('--json');
319
- const report = await runDoctor();
430
+ const report = await runDoctor({ argv });
320
431
  if (json) {
321
432
  process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
322
433
  }
@@ -325,8 +436,10 @@ export async function main(argv = process.argv.slice(2)) {
325
436
  }
326
437
  process.exit(report.exitCode);
327
438
  }
328
- main().catch((err) => {
329
- process.stderr.write(`[aismemory doctor] Fatal: ${errMsg(err)}\n`);
330
- process.exit(1);
331
- });
439
+ if (process.argv[1] && pathToFileURL(realpathSync(process.argv[1])).href === import.meta.url) {
440
+ main().catch((err) => {
441
+ process.stderr.write(`[aismemory doctor] Fatal: ${errMsg(err)}\n`);
442
+ process.exit(1);
443
+ });
444
+ }
332
445
  //# sourceMappingURL=doctor.js.map