aismemory 0.7.5 → 0.8.2

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 (133) hide show
  1. package/README.md +247 -7
  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 +121 -6
  6. package/dist/__tests__/agent-key-mode.test.js.map +1 -1
  7. package/dist/__tests__/agent-load-persistence.test.js +22 -6
  8. package/dist/__tests__/agent-load-persistence.test.js.map +1 -1
  9. package/dist/__tests__/ais-http.test.js +23 -3
  10. package/dist/__tests__/ais-http.test.js.map +1 -1
  11. package/dist/__tests__/auto-handoff.test.js +56 -0
  12. package/dist/__tests__/auto-handoff.test.js.map +1 -1
  13. package/dist/__tests__/bond-link-survives-exit.test.d.ts +1 -0
  14. package/dist/__tests__/bond-link-survives-exit.test.js +177 -0
  15. package/dist/__tests__/bond-link-survives-exit.test.js.map +1 -0
  16. package/dist/__tests__/credential-resolution.test.js +56 -8
  17. package/dist/__tests__/credential-resolution.test.js.map +1 -1
  18. package/dist/__tests__/credential-whoami.test.d.ts +8 -0
  19. package/dist/__tests__/credential-whoami.test.js +93 -0
  20. package/dist/__tests__/credential-whoami.test.js.map +1 -0
  21. package/dist/__tests__/device-flow-gate-e2e.test.js +6 -4
  22. package/dist/__tests__/device-flow-gate-e2e.test.js.map +1 -1
  23. package/dist/__tests__/doctor.test.js +176 -85
  24. package/dist/__tests__/doctor.test.js.map +1 -1
  25. package/dist/__tests__/full-context-view-forwarding.test.d.ts +1 -0
  26. package/dist/__tests__/full-context-view-forwarding.test.js +80 -0
  27. package/dist/__tests__/full-context-view-forwarding.test.js.map +1 -0
  28. package/dist/__tests__/hydration.test.js +56 -1
  29. package/dist/__tests__/hydration.test.js.map +1 -1
  30. package/dist/__tests__/install.test.d.ts +1 -0
  31. package/dist/__tests__/install.test.js +126 -0
  32. package/dist/__tests__/install.test.js.map +1 -0
  33. package/dist/__tests__/integration.test.js +1 -0
  34. package/dist/__tests__/integration.test.js.map +1 -1
  35. package/dist/__tests__/lost-agent.test.js +51 -0
  36. package/dist/__tests__/lost-agent.test.js.map +1 -1
  37. package/dist/__tests__/mcp-tools.test.js +210 -3
  38. package/dist/__tests__/mcp-tools.test.js.map +1 -1
  39. package/dist/__tests__/memory-write-failure.test.js +4 -8
  40. package/dist/__tests__/memory-write-failure.test.js.map +1 -1
  41. package/dist/__tests__/no-registered-keys-disk-bearer-fallback.test.js +4 -7
  42. package/dist/__tests__/no-registered-keys-disk-bearer-fallback.test.js.map +1 -1
  43. package/dist/__tests__/pending-device-flow-e2e.test.js +22 -1
  44. package/dist/__tests__/pending-device-flow-e2e.test.js.map +1 -1
  45. package/dist/__tests__/pending-device-flow-resume.test.d.ts +1 -0
  46. package/dist/__tests__/pending-device-flow-resume.test.js +104 -0
  47. package/dist/__tests__/pending-device-flow-resume.test.js.map +1 -0
  48. package/dist/__tests__/prompt-resource.test.js +1 -0
  49. package/dist/__tests__/prompt-resource.test.js.map +1 -1
  50. package/dist/__tests__/provisional-register-mcp-remember.test.js +4 -8
  51. package/dist/__tests__/provisional-register-mcp-remember.test.js.map +1 -1
  52. package/dist/__tests__/reconnect-survival-e2e.test.js +3 -4
  53. package/dist/__tests__/reconnect-survival-e2e.test.js.map +1 -1
  54. package/dist/__tests__/refresh.test.js +24 -2
  55. package/dist/__tests__/refresh.test.js.map +1 -1
  56. package/dist/__tests__/request-timeout.test.d.ts +1 -0
  57. package/dist/__tests__/request-timeout.test.js +40 -0
  58. package/dist/__tests__/request-timeout.test.js.map +1 -0
  59. package/dist/__tests__/resolve-agent-preference-e2e.test.js +15 -3
  60. package/dist/__tests__/resolve-agent-preference-e2e.test.js.map +1 -1
  61. package/dist/__tests__/retry-after.test.d.ts +4 -0
  62. package/dist/__tests__/retry-after.test.js +134 -0
  63. package/dist/__tests__/retry-after.test.js.map +1 -0
  64. package/dist/__tests__/run-pass-mode.test.d.ts +1 -0
  65. package/dist/__tests__/run-pass-mode.test.js +130 -0
  66. package/dist/__tests__/run-pass-mode.test.js.map +1 -0
  67. package/dist/__tests__/session-identity.test.d.ts +1 -0
  68. package/dist/__tests__/session-identity.test.js +213 -0
  69. package/dist/__tests__/session-identity.test.js.map +1 -0
  70. package/dist/__tests__/version-check.test.js +1 -1
  71. package/dist/__tests__/workspace-key-mode.test.js +194 -16
  72. package/dist/__tests__/workspace-key-mode.test.js.map +1 -1
  73. package/dist/agent-archive.d.ts +36 -0
  74. package/dist/agent-archive.js +69 -0
  75. package/dist/agent-archive.js.map +1 -0
  76. package/dist/agent-key-mode.js +86 -29
  77. package/dist/agent-key-mode.js.map +1 -1
  78. package/dist/ais-http-error.d.ts +7 -2
  79. package/dist/ais-http-error.js +18 -5
  80. package/dist/ais-http-error.js.map +1 -1
  81. package/dist/ais-http.d.ts +2 -0
  82. package/dist/ais-http.js +41 -19
  83. package/dist/ais-http.js.map +1 -1
  84. package/dist/auto-handoff.js +33 -1
  85. package/dist/auto-handoff.js.map +1 -1
  86. package/dist/cli/doctor.d.ts +5 -2
  87. package/dist/cli/doctor.js +72 -15
  88. package/dist/cli/doctor.js.map +1 -1
  89. package/dist/cli/install.d.ts +6 -0
  90. package/dist/cli/install.js +52 -0
  91. package/dist/cli/install.js.map +1 -0
  92. package/dist/cli/orientation.d.ts +2 -0
  93. package/dist/cli/orientation.js +31 -1
  94. package/dist/cli/orientation.js.map +1 -1
  95. package/dist/credential-whoami.d.ts +50 -0
  96. package/dist/credential-whoami.js +91 -0
  97. package/dist/credential-whoami.js.map +1 -0
  98. package/dist/hydration.js +8 -0
  99. package/dist/hydration.js.map +1 -1
  100. package/dist/index.js +213 -50
  101. package/dist/index.js.map +1 -1
  102. package/dist/mcp/tools.d.ts +18 -4
  103. package/dist/mcp/tools.js +107 -12
  104. package/dist/mcp/tools.js.map +1 -1
  105. package/dist/pending-device-flow.d.ts +31 -0
  106. package/dist/pending-device-flow.js +38 -0
  107. package/dist/pending-device-flow.js.map +1 -1
  108. package/dist/refresh.js +5 -1
  109. package/dist/refresh.js.map +1 -1
  110. package/dist/request-timeout.d.ts +26 -0
  111. package/dist/request-timeout.js +49 -0
  112. package/dist/request-timeout.js.map +1 -0
  113. package/dist/retry-after.d.ts +26 -0
  114. package/dist/retry-after.js +42 -0
  115. package/dist/retry-after.js.map +1 -0
  116. package/dist/run-pass-mode.d.ts +16 -0
  117. package/dist/run-pass-mode.js +274 -0
  118. package/dist/run-pass-mode.js.map +1 -0
  119. package/dist/session-identity.d.ts +40 -0
  120. package/dist/session-identity.js +179 -0
  121. package/dist/session-identity.js.map +1 -0
  122. package/dist/telemetry.d.ts +1 -1
  123. package/dist/telemetry.js.map +1 -1
  124. package/dist/tool-args.d.ts +13 -1
  125. package/dist/tool-args.js +27 -1
  126. package/dist/tool-args.js.map +1 -1
  127. package/dist/types.d.ts +32 -0
  128. package/dist/workspace-key-mode.js +100 -26
  129. package/dist/workspace-key-mode.js.map +1 -1
  130. package/package.json +4 -6
  131. package/dist/harness-identity.d.ts +0 -17
  132. package/dist/harness-identity.js +0 -105
  133. package/dist/harness-identity.js.map +0 -1
@@ -77,6 +77,13 @@ export function loadPendingDeviceFlow(home = homedir(), now = Date.now()) {
77
77
  agentId: typeof parsed.agentId === 'string' ? parsed.agentId : '',
78
78
  provisionalTenantId: typeof parsed.provisionalTenantId === 'string' ? parsed.provisionalTenantId : '',
79
79
  startedAt: typeof parsed.startedAt === 'string' ? parsed.startedAt : '',
80
+ ...(typeof parsed.deviceCode === 'string' ? { deviceCode: parsed.deviceCode } : {}),
81
+ ...(typeof parsed.userCode === 'string' ? { userCode: parsed.userCode } : {}),
82
+ ...(typeof parsed.verificationUriComplete === 'string'
83
+ ? { verificationUriComplete: parsed.verificationUriComplete }
84
+ : {}),
85
+ ...(typeof parsed.interval === 'number' ? { interval: parsed.interval } : {}),
86
+ ...(typeof parsed.codeExpiresAt === 'string' ? { codeExpiresAt: parsed.codeExpiresAt } : {}),
80
87
  };
81
88
  }
82
89
  catch {
@@ -93,4 +100,35 @@ export function clearPendingDeviceFlow(home = homedir()) {
93
100
  // reuse attempt, which degrades to minting.
94
101
  }
95
102
  }
103
+ /**
104
+ * A device code that is still redeemable: the human can open the bond link
105
+ * that was already printed and it will work.
106
+ *
107
+ * `MIN_RESUMABLE_REMAINING_MS` keeps a code that is about to expire out of
108
+ * the resume path — re-surfacing a link with four seconds of life left is
109
+ * worse for the human than minting a fresh one.
110
+ */
111
+ const MIN_RESUMABLE_REMAINING_MS = 60_000;
112
+ /**
113
+ * True when `flow` carries a device code that has not expired yet, so the
114
+ * caller should resume polling it instead of minting a new one.
115
+ */
116
+ export function isResumableDeviceFlow(flow, now = Date.now()) {
117
+ if (!flow)
118
+ return false;
119
+ if (typeof flow.deviceCode !== 'string' || flow.deviceCode.length === 0)
120
+ return false;
121
+ if (typeof flow.userCode !== 'string' || flow.userCode.length === 0)
122
+ return false;
123
+ if (typeof flow.verificationUriComplete !== 'string' ||
124
+ flow.verificationUriComplete.length === 0) {
125
+ return false;
126
+ }
127
+ if (typeof flow.codeExpiresAt !== 'string')
128
+ return false;
129
+ const expiresAt = Date.parse(flow.codeExpiresAt);
130
+ if (!Number.isFinite(expiresAt))
131
+ return false;
132
+ return expiresAt - now >= MIN_RESUMABLE_REMAINING_MS;
133
+ }
96
134
  //# sourceMappingURL=pending-device-flow.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pending-device-flow.js","sourceRoot":"","sources":["../src/pending-device-flow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pending-device-flow.js","sourceRoot":"","sources":["../src/pending-device-flow.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChG,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAkC7D;;;;GAIG;AACH,MAAM,uBAAuB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAExD;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe,OAAO,EAAE;IAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,EAAE,0BAA0B,CAAC,CAAC;AAC9E,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,qBAAqB,CAAC,IAAuB,EAAE,OAAe,OAAO,EAAE;IACrF,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,uEAAuE;QACvE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;QACtE,sEAAsE;QACtE,8BAA8B;IAChC,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAe,OAAO,EAAE,EACxB,MAAc,IAAI,CAAC,GAAG,EAAE;IAExB,MAAM,IAAI,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC;QACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAA+B,CAAC;QACrF,IAAI,OAAO,MAAM,CAAC,gBAAgB,KAAK,QAAQ,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC5F,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,GAAG,SAAS,GAAG,uBAAuB,EAAE,CAAC;YAC5E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,OAAO,EAAE,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACjE,mBAAmB,EACjB,OAAO,MAAM,CAAC,mBAAmB,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE;YAClF,SAAS,EAAE,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE;YACvE,GAAG,CAAC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnF,GAAG,CAAC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,GAAG,CAAC,OAAO,MAAM,CAAC,uBAAuB,KAAK,QAAQ;gBACpD,CAAC,CAAC,EAAE,uBAAuB,EAAE,MAAM,CAAC,uBAAuB,EAAE;gBAC7D,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,GAAG,CAAC,OAAO,MAAM,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7F,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,sBAAsB,CAAC,OAAe,OAAO,EAAE;IAC7D,IAAI,CAAC;QACH,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;QACtE,4CAA4C;IAC9C,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAU1C;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAA8B,EAC9B,MAAc,IAAI,CAAC,GAAG,EAAE;IAExB,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtF,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAClF,IACE,OAAO,IAAI,CAAC,uBAAuB,KAAK,QAAQ;QAChD,IAAI,CAAC,uBAAuB,CAAC,MAAM,KAAK,CAAC,EACzC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACzD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,SAAS,GAAG,GAAG,IAAI,0BAA0B,CAAC;AACvD,CAAC"}
package/dist/refresh.js CHANGED
@@ -1,9 +1,13 @@
1
+ import { getAisRequestTimeoutMs } from './request-timeout.js';
1
2
  let refreshInterval = null;
2
3
  export function startRefreshTimer(aisUrl, agentId, token, onUpdate, intervalMs = 5 * 60 * 1000) {
3
4
  stopRefreshTimer();
4
5
  refreshInterval = setInterval(async () => {
5
6
  try {
6
- const res = await fetch(`${aisUrl}/v1/agents/${agentId}/memory?limit=20&minImportance=0.5`, { headers: { Authorization: `Bearer ${token}` } });
7
+ const res = await fetch(`${aisUrl}/v1/agents/${agentId}/memory?limit=20&minImportance=0.5`, {
8
+ headers: { Authorization: `Bearer ${token}` },
9
+ signal: AbortSignal.timeout(getAisRequestTimeoutMs()),
10
+ });
7
11
  if (!res.ok)
8
12
  return;
9
13
  const json = await res.json();
@@ -1 +1 @@
1
- {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAEA,IAAI,eAAe,GAA0C,IAAI,CAAC;AAElE,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,OAAe,EACf,KAAa,EACb,QAA2C,EAC3C,aAAqB,CAAC,GAAG,EAAE,GAAG,IAAI;IAElC,gBAAgB,EAAE,CAAC;IACnB,eAAe,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,MAAM,cAAc,OAAO,oCAAoC,EAClE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,EAAE,CAClD,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO;YACpB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;gBACxC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;IACH,CAAC,EAAE,UAAU,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,eAAe,EAAE,CAAC;QACpB,aAAa,CAAC,eAAe,CAAC,CAAC;QAC/B,eAAe,GAAG,IAAI,CAAC;IACzB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,IAAI,eAAe,GAA0C,IAAI,CAAC;AAElE,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,OAAe,EACf,KAAa,EACb,QAA2C,EAC3C,aAAqB,CAAC,GAAG,EAAE,GAAG,IAAI;IAElC,gBAAgB,EAAE,CAAC;IACnB,eAAe,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACvC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,MAAM,cAAc,OAAO,oCAAoC,EAClE;gBACE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;gBAC7C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC;aACtD,CACF,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO;YACpB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;gBACxC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;IACH,CAAC,EAAE,UAAU,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,IAAI,eAAe,EAAE,CAAC;QACpB,aAAa,CAAC,eAAe,CAAC,CAAC;QAC/B,eAAe,GAAG,IAAI,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Shared client-side request timeout for every HTTP call the aismemory MCP
3
+ * server makes to AIS (GitHub issue #6635). A stalled AIS call must fail fast
4
+ * with a clear error instead of hanging the agent process for tens of
5
+ * minutes — that hang previously froze an entire floor session for 6 hours.
6
+ */
7
+ /** Default timeout for an AIS request, in milliseconds. */
8
+ export declare const DEFAULT_AIS_REQUEST_TIMEOUT_MS = 20000;
9
+ /**
10
+ * Resolve the AIS request timeout from AIS_MCP_REQUEST_TIMEOUT_MS. Falls back
11
+ * to the default for anything unset, blank, non-numeric, or non-positive — a
12
+ * malformed override must degrade to a safe timeout, never disable it.
13
+ */
14
+ export declare function getAisRequestTimeoutMs(env?: Record<string, string | undefined>): number;
15
+ /** True when `err` is the abort produced by an `AbortSignal.timeout()` firing. */
16
+ export declare function isAisRequestTimeout(err: unknown): boolean;
17
+ export declare class AisRequestTimeoutError extends Error {
18
+ constructor(path: string, timeoutMs: number);
19
+ }
20
+ /**
21
+ * Replace a raw timeout abort with a clear, path- and duration-specific
22
+ * error so it surfaces as an actionable MCP tool error (`isError`) instead of
23
+ * an opaque "operation was aborted" message. Every other error passes through
24
+ * unchanged.
25
+ */
26
+ export declare function toAisRequestError(err: unknown, path: string, timeoutMs: number): unknown;
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Shared client-side request timeout for every HTTP call the aismemory MCP
3
+ * server makes to AIS (GitHub issue #6635). A stalled AIS call must fail fast
4
+ * with a clear error instead of hanging the agent process for tens of
5
+ * minutes — that hang previously froze an entire floor session for 6 hours.
6
+ */
7
+ /** Default timeout for an AIS request, in milliseconds. */
8
+ export const DEFAULT_AIS_REQUEST_TIMEOUT_MS = 20_000;
9
+ const ENV_VAR = 'AIS_MCP_REQUEST_TIMEOUT_MS';
10
+ /**
11
+ * Resolve the AIS request timeout from AIS_MCP_REQUEST_TIMEOUT_MS. Falls back
12
+ * to the default for anything unset, blank, non-numeric, or non-positive — a
13
+ * malformed override must degrade to a safe timeout, never disable it.
14
+ */
15
+ export function getAisRequestTimeoutMs(env = process.env) {
16
+ const raw = env[ENV_VAR]?.trim();
17
+ if (!raw)
18
+ return DEFAULT_AIS_REQUEST_TIMEOUT_MS;
19
+ const parsed = Number(raw);
20
+ if (!Number.isFinite(parsed) || parsed <= 0) {
21
+ process.stderr.write(`[aismemory] ${ENV_VAR}="${raw}" is not a positive number of milliseconds; ` +
22
+ `using the default ${DEFAULT_AIS_REQUEST_TIMEOUT_MS}ms.\n`);
23
+ return DEFAULT_AIS_REQUEST_TIMEOUT_MS;
24
+ }
25
+ return parsed;
26
+ }
27
+ /** True when `err` is the abort produced by an `AbortSignal.timeout()` firing. */
28
+ export function isAisRequestTimeout(err) {
29
+ return err instanceof DOMException && err.name === 'TimeoutError';
30
+ }
31
+ export class AisRequestTimeoutError extends Error {
32
+ constructor(path, timeoutMs) {
33
+ super(`AIS request to ${path} timed out after ${timeoutMs}ms`);
34
+ this.name = 'AisRequestTimeoutError';
35
+ }
36
+ }
37
+ /**
38
+ * Replace a raw timeout abort with a clear, path- and duration-specific
39
+ * error so it surfaces as an actionable MCP tool error (`isError`) instead of
40
+ * an opaque "operation was aborted" message. Every other error passes through
41
+ * unchanged.
42
+ */
43
+ export function toAisRequestError(err, path, timeoutMs) {
44
+ if (isAisRequestTimeout(err)) {
45
+ return new AisRequestTimeoutError(path, timeoutMs);
46
+ }
47
+ return err;
48
+ }
49
+ //# sourceMappingURL=request-timeout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-timeout.js","sourceRoot":"","sources":["../src/request-timeout.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,2DAA2D;AAC3D,MAAM,CAAC,MAAM,8BAA8B,GAAG,MAAM,CAAC;AAErD,MAAM,OAAO,GAAG,4BAA4B,CAAC;AAE7C;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAA0C,OAAO,CAAC,GAAG;IAErD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;IACjC,IAAI,CAAC,GAAG;QAAE,OAAO,8BAA8B,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,eAAe,OAAO,KAAK,GAAG,8CAA8C;YAC1E,qBAAqB,8BAA8B,OAAO,CAC7D,CAAC;QACF,OAAO,8BAA8B,CAAC;IACxC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,OAAO,GAAG,YAAY,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,CAAC;AACpE,CAAC;AAED,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,IAAY,EAAE,SAAiB;QACzC,KAAK,CAAC,kBAAkB,IAAI,oBAAoB,SAAS,IAAI,CAAC,CAAC;QAC/D,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY,EAAE,IAAY,EAAE,SAAiB;IAC7E,IAAI,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,sBAAsB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Retry-After handling (Jaire C9, CORBOT-D452451A).
3
+ *
4
+ * AIS sends `Retry-After` on every 429 and 503. A read that is told to wait a
5
+ * few seconds waits and tries once more; a longer wait is not slept through
6
+ * inside a tool call — the error says, in plain words, how long to wait.
7
+ */
8
+ /** Longest server-requested wait a GET sleeps through before its one retry. */
9
+ export declare const MAX_HONOURED_RETRY_AFTER_SECONDS = 5;
10
+ /** Statuses whose `Retry-After` means "back off, then the same call can work". */
11
+ export declare const RETRY_AFTER_STATUSES: ReadonlySet<number>;
12
+ /**
13
+ * Seconds to wait, from a `Retry-After` value (delta-seconds or HTTP-date).
14
+ * Null when the header is absent or unreadable.
15
+ */
16
+ export declare function parseRetryAfterSeconds(value: string | null | undefined, nowMs?: number): number | null;
17
+ /** The server's requested wait on a 429/503, or null when there is none. */
18
+ export declare function retryAfterOf(res: {
19
+ status: number;
20
+ headers?: {
21
+ get(name: string): string | null;
22
+ };
23
+ }): number | null;
24
+ /** True when a GET should sleep `seconds` and try once more. */
25
+ export declare function shouldHonourRetryAfter(seconds: number | null): seconds is number;
26
+ export declare function sleepSeconds(seconds: number): Promise<void>;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Retry-After handling (Jaire C9, CORBOT-D452451A).
3
+ *
4
+ * AIS sends `Retry-After` on every 429 and 503. A read that is told to wait a
5
+ * few seconds waits and tries once more; a longer wait is not slept through
6
+ * inside a tool call — the error says, in plain words, how long to wait.
7
+ */
8
+ /** Longest server-requested wait a GET sleeps through before its one retry. */
9
+ export const MAX_HONOURED_RETRY_AFTER_SECONDS = 5;
10
+ /** Statuses whose `Retry-After` means "back off, then the same call can work". */
11
+ export const RETRY_AFTER_STATUSES = new Set([429, 503]);
12
+ /**
13
+ * Seconds to wait, from a `Retry-After` value (delta-seconds or HTTP-date).
14
+ * Null when the header is absent or unreadable.
15
+ */
16
+ export function parseRetryAfterSeconds(value, nowMs = Date.now()) {
17
+ if (value === null || value === undefined)
18
+ return null;
19
+ const trimmed = value.trim();
20
+ if (/^\d+$/.test(trimmed))
21
+ return Number(trimmed);
22
+ if (!/[A-Za-z]/.test(trimmed))
23
+ return null;
24
+ const at = Date.parse(trimmed);
25
+ if (Number.isNaN(at))
26
+ return null;
27
+ return Math.max(0, Math.ceil((at - nowMs) / 1000));
28
+ }
29
+ /** The server's requested wait on a 429/503, or null when there is none. */
30
+ export function retryAfterOf(res) {
31
+ if (!RETRY_AFTER_STATUSES.has(res.status))
32
+ return null;
33
+ return parseRetryAfterSeconds(res.headers?.get('retry-after'));
34
+ }
35
+ /** True when a GET should sleep `seconds` and try once more. */
36
+ export function shouldHonourRetryAfter(seconds) {
37
+ return seconds !== null && seconds <= MAX_HONOURED_RETRY_AFTER_SECONDS;
38
+ }
39
+ export function sleepSeconds(seconds) {
40
+ return new Promise((resolve) => setTimeout(resolve, seconds * 1000));
41
+ }
42
+ //# sourceMappingURL=retry-after.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-after.js","sourceRoot":"","sources":["../src/retry-after.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC;AAElD,kFAAkF;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAwB,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAE7E;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAgC,EAAE,QAAgB,IAAI,CAAC,GAAG,EAAE;IACjG,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACvD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,YAAY,CAAC,GAAuE;IAClG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,OAAO,sBAAsB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,sBAAsB,CAAC,OAAsB;IAC3D,OAAO,OAAO,KAAK,IAAI,IAAI,OAAO,IAAI,gCAAgC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface RunPassConfig {
2
+ runPassFile: string;
3
+ agentId: string;
4
+ }
5
+ export declare class RunPassConfigError extends Error {
6
+ constructor(message: string);
7
+ }
8
+ type FetchImpl = typeof globalThis.fetch;
9
+ export declare function loadRunPassConfig(env?: Record<string, string | undefined>): RunPassConfig | null;
10
+ export declare function readRunPassFile(runPassFile: string): Promise<string>;
11
+ export declare function runPassPost(aisUrl: string, path: string, runPassFile: string, body: unknown, fetchImpl?: FetchImpl): Promise<unknown>;
12
+ export declare function runPassGet(aisUrl: string, path: string, runPassFile: string, fetchImpl?: FetchImpl): Promise<unknown>;
13
+ export declare function runPassPatch(aisUrl: string, path: string, runPassFile: string, body: unknown, fetchImpl?: FetchImpl): Promise<unknown>;
14
+ export declare const UNKNOWN_TOOL_RUN_PASS_MODE: unique symbol;
15
+ export declare function dispatchToolRunPassMode(aisUrl: string, config: RunPassConfig, name: string, rawArgs: unknown, fetchImpl?: FetchImpl): Promise<unknown | typeof UNKNOWN_TOOL_RUN_PASS_MODE>;
16
+ export {};
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Run-pass auth mode for the aismemory MCP client (CORBOT-662A4B3A).
3
+ *
4
+ * A launcher writes the current short-lived pass to AIS_RUN_PASS_FILE and may
5
+ * rotate that file while this process is running. Every request re-reads the
6
+ * file and sends exactly one credential header: x-run-pass.
7
+ */
8
+ import { readFile } from 'node:fs/promises';
9
+ import { AisHttpError, duplicateMemoryResult } from './ais-http-error.js';
10
+ import { getAisRequestTimeoutMs, toAisRequestError } from './request-timeout.js';
11
+ import { emitTelemetry } from './telemetry.js';
12
+ import { OutOfScopeToolError } from './agent-key-mode.js';
13
+ import { readInboxAndMaybeAck } from './inbox-client.js';
14
+ import { orient } from './cli/orientation.js';
15
+ import { AGENT_ARCHIVE_KEY_MODE_DETAIL } from './agent-archive.js';
16
+ import { fetchCredentialWhoami } from './credential-whoami.js';
17
+ import { parseEmptyToolArgs, parseRecallArgs, parseFullContextArgs, parseRememberArgs, parseGoalCreateArgs, parseGoalListArgs, parseGoalUpdateProgressArgs, parseGoalCompleteArgs, parseInboxSendArgs, parseInboxReadArgs, parseInboxAckArgs, parseHandoffArgs, } from './tool-args.js';
18
+ const RUN_PASS_PATTERN = /^ais_rp_[A-Za-z0-9_-]{43}$/;
19
+ export class RunPassConfigError extends Error {
20
+ constructor(message) {
21
+ super(message);
22
+ this.name = 'RunPassConfigError';
23
+ }
24
+ }
25
+ async function readJson(res) {
26
+ return res.json().catch(() => null);
27
+ }
28
+ export function loadRunPassConfig(env = process.env) {
29
+ const rawPath = env['AIS_RUN_PASS_FILE'];
30
+ if (rawPath === undefined)
31
+ return null;
32
+ const runPassFile = rawPath.trim();
33
+ if (runPassFile === '') {
34
+ throw new RunPassConfigError('AIS_RUN_PASS_FILE is set but empty. Refusing to start run-pass mode.');
35
+ }
36
+ const agentId = env['AIS_AGENT_ID']?.trim();
37
+ if (!agentId) {
38
+ throw new RunPassConfigError('AIS_RUN_PASS_FILE is set but AIS_AGENT_ID is missing. ' +
39
+ 'Run-pass mode needs the one agent this pass is scoped to.');
40
+ }
41
+ return { runPassFile, agentId };
42
+ }
43
+ export async function readRunPassFile(runPassFile) {
44
+ let raw;
45
+ try {
46
+ raw = await readFile(runPassFile, 'utf8');
47
+ }
48
+ catch (error) {
49
+ const reason = error instanceof Error ? error.message : 'unknown read error';
50
+ throw new RunPassConfigError(`Refusing AIS request: cannot read AIS_RUN_PASS_FILE at ${runPassFile}: ${reason}`);
51
+ }
52
+ const runPass = raw.trim();
53
+ if (runPass.length === 0) {
54
+ throw new RunPassConfigError(`Refusing AIS request: AIS_RUN_PASS_FILE at ${runPassFile} is empty.`);
55
+ }
56
+ if (!RUN_PASS_PATTERN.test(runPass)) {
57
+ throw new RunPassConfigError(`Refusing AIS request: AIS_RUN_PASS_FILE at ${runPassFile} does not contain a valid ais_rp_ run pass.`);
58
+ }
59
+ return runPass;
60
+ }
61
+ async function runPassHeaders(runPassFile, includeContentType) {
62
+ const runPass = await readRunPassFile(runPassFile);
63
+ return {
64
+ ...(includeContentType ? { 'Content-Type': 'application/json' } : {}),
65
+ 'x-run-pass': runPass,
66
+ };
67
+ }
68
+ export async function runPassPost(aisUrl, path, runPassFile, body, fetchImpl = globalThis.fetch) {
69
+ const headers = await runPassHeaders(runPassFile, true);
70
+ const timeoutMs = getAisRequestTimeoutMs();
71
+ let res;
72
+ try {
73
+ res = await fetchImpl(`${aisUrl}${path}`, {
74
+ method: 'POST',
75
+ headers,
76
+ body: JSON.stringify(body),
77
+ signal: AbortSignal.timeout(timeoutMs),
78
+ });
79
+ }
80
+ catch (err) {
81
+ const wrapped = toAisRequestError(err, path, timeoutMs);
82
+ emitTelemetry({ event: 'ais.http.failure', path, error: wrapped instanceof Error ? wrapped.message : String(wrapped) });
83
+ throw wrapped;
84
+ }
85
+ const data = await readJson(res);
86
+ if (!res.ok) {
87
+ emitTelemetry({ event: 'ais.http.failure', path, httpStatus: res.status, error: `HTTP ${res.status}` });
88
+ throw new AisHttpError(res.status, path, data);
89
+ }
90
+ return data;
91
+ }
92
+ export async function runPassGet(aisUrl, path, runPassFile, fetchImpl = globalThis.fetch) {
93
+ const headers = await runPassHeaders(runPassFile, false);
94
+ const timeoutMs = getAisRequestTimeoutMs();
95
+ let res;
96
+ try {
97
+ res = await fetchImpl(`${aisUrl}${path}`, {
98
+ headers,
99
+ signal: AbortSignal.timeout(timeoutMs),
100
+ });
101
+ }
102
+ catch (err) {
103
+ const wrapped = toAisRequestError(err, path, timeoutMs);
104
+ emitTelemetry({ event: 'ais.http.failure', path, error: wrapped instanceof Error ? wrapped.message : String(wrapped) });
105
+ throw wrapped;
106
+ }
107
+ const data = await readJson(res);
108
+ if (!res.ok) {
109
+ emitTelemetry({ event: 'ais.http.failure', path, httpStatus: res.status, error: `HTTP ${res.status}` });
110
+ throw new AisHttpError(res.status, path, data);
111
+ }
112
+ return data;
113
+ }
114
+ export async function runPassPatch(aisUrl, path, runPassFile, body, fetchImpl = globalThis.fetch) {
115
+ const headers = await runPassHeaders(runPassFile, true);
116
+ const timeoutMs = getAisRequestTimeoutMs();
117
+ let res;
118
+ try {
119
+ res = await fetchImpl(`${aisUrl}${path}`, {
120
+ method: 'PATCH',
121
+ headers,
122
+ body: JSON.stringify(body),
123
+ signal: AbortSignal.timeout(timeoutMs),
124
+ });
125
+ }
126
+ catch (err) {
127
+ const wrapped = toAisRequestError(err, path, timeoutMs);
128
+ emitTelemetry({ event: 'ais.http.failure', path, error: wrapped instanceof Error ? wrapped.message : String(wrapped) });
129
+ throw wrapped;
130
+ }
131
+ const data = await readJson(res);
132
+ if (!res.ok) {
133
+ emitTelemetry({ event: 'ais.http.failure', path, httpStatus: res.status, error: `HTTP ${res.status}` });
134
+ throw new AisHttpError(res.status, path, data);
135
+ }
136
+ return data;
137
+ }
138
+ export const UNKNOWN_TOOL_RUN_PASS_MODE = Symbol('unknown-tool-run-pass-mode');
139
+ export async function dispatchToolRunPassMode(aisUrl, config, name, rawArgs, fetchImpl = globalThis.fetch) {
140
+ const { agentId, runPassFile } = config;
141
+ switch (name) {
142
+ case 'remember': {
143
+ const args = parseRememberArgs(rawArgs);
144
+ try {
145
+ return await runPassPost(aisUrl, `/v1/agents/${agentId}/memory`, runPassFile, {
146
+ content: args.content,
147
+ type: args.type,
148
+ importance: args.importance,
149
+ ...(args.tags !== undefined && { tags: args.tags }),
150
+ }, fetchImpl);
151
+ }
152
+ catch (err) {
153
+ const duplicate = duplicateMemoryResult(err);
154
+ if (duplicate)
155
+ return duplicate;
156
+ throw err;
157
+ }
158
+ }
159
+ case 'recall': {
160
+ const args = parseRecallArgs(rawArgs);
161
+ const params = new URLSearchParams();
162
+ params.set('query', args.query);
163
+ if (args.limit !== undefined)
164
+ params.set('limit', String(args.limit));
165
+ if (args.type !== undefined)
166
+ params.set('types', args.type);
167
+ if (args.tags !== undefined && args.tags.length > 0)
168
+ params.set('tags', args.tags.join(','));
169
+ if (args.principalAgentId !== undefined)
170
+ params.set('principalAgentId', args.principalAgentId);
171
+ return runPassGet(aisUrl, `/v1/agents/${agentId}/memory?${params}`, runPassFile, fetchImpl);
172
+ }
173
+ case 'full_context': {
174
+ const fcArgs = parseFullContextArgs(rawArgs);
175
+ const fcParams = new URLSearchParams();
176
+ if (fcArgs.principalAgentId !== undefined)
177
+ fcParams.set('principalAgentId', fcArgs.principalAgentId);
178
+ if (fcArgs.memoriesLimit !== undefined)
179
+ fcParams.set('memoriesLimit', String(fcArgs.memoriesLimit));
180
+ if (fcArgs.view !== undefined)
181
+ fcParams.set('view', fcArgs.view);
182
+ if (fcArgs.maxTokens !== undefined)
183
+ fcParams.set('maxTokens', String(fcArgs.maxTokens));
184
+ const fcQs = fcParams.toString();
185
+ return runPassGet(aisUrl, `/v1/agents/${agentId}/full-context${fcQs ? `?${fcQs}` : ''}`, runPassFile, fetchImpl);
186
+ }
187
+ case 'dream':
188
+ parseEmptyToolArgs(rawArgs);
189
+ return runPassPost(aisUrl, `/v1/agents/${agentId}/dream`, runPassFile, {}, fetchImpl);
190
+ case 'whoami':
191
+ parseEmptyToolArgs(rawArgs);
192
+ return fetchCredentialWhoami(agentId, 'run-pass', () => runPassGet(aisUrl, `/v1/agents/${agentId}/whoami`, runPassFile, fetchImpl), () => runPassGet(aisUrl, `/v1/agents/${agentId}/memory?limit=1`, runPassFile, fetchImpl));
193
+ case 'orientation_check':
194
+ return orient(rawArgs);
195
+ case 'agent_load':
196
+ throw new OutOfScopeToolError(name, 'Run passes are scoped to one agent for one run; start a new run pass for another agent.');
197
+ case 'goal_create': {
198
+ const args = parseGoalCreateArgs(rawArgs);
199
+ return runPassPost(aisUrl, `/v1/agents/${agentId}/goals`, runPassFile, {
200
+ title: args.title,
201
+ description: args.description,
202
+ ...(args.successCriteria !== undefined ? { successCriteria: args.successCriteria } : {}),
203
+ ...(args.parentGoalId !== undefined ? { parentGoalId: args.parentGoalId } : {}),
204
+ }, fetchImpl);
205
+ }
206
+ case 'goal_list': {
207
+ const args = parseGoalListArgs(rawArgs);
208
+ const params = new URLSearchParams();
209
+ if (args.status !== undefined)
210
+ params.set('status', args.status);
211
+ if (args.page !== undefined)
212
+ params.set('page', String(args.page));
213
+ params.set('limit', String(args.limit));
214
+ if (args.parentGoalId !== undefined)
215
+ params.set('parentGoalId', args.parentGoalId);
216
+ return runPassGet(aisUrl, `/v1/agents/${agentId}/goals?${params}`, runPassFile, fetchImpl);
217
+ }
218
+ case 'goal_update_progress': {
219
+ const args = parseGoalUpdateProgressArgs(rawArgs);
220
+ return runPassPatch(aisUrl, `/v1/agents/${agentId}/goals/${args.goalId}`, runPassFile, {
221
+ progress: args.progress,
222
+ }, fetchImpl);
223
+ }
224
+ case 'goal_complete': {
225
+ const args = parseGoalCompleteArgs(rawArgs);
226
+ return runPassPost(aisUrl, `/v1/agents/${agentId}/goals/${args.goalId}/complete`, runPassFile, {
227
+ success: args.success,
228
+ ...(args.notes !== undefined ? { notes: args.notes } : {}),
229
+ ...(args.lessonsLearned !== undefined ? { lessonsLearned: args.lessonsLearned } : {}),
230
+ }, fetchImpl);
231
+ }
232
+ case 'inbox_send': {
233
+ const args = parseInboxSendArgs(rawArgs);
234
+ return runPassPost(aisUrl, `/v1/agents/${agentId}/inbox`, runPassFile, {
235
+ recipientAgentId: args.recipientAgentId,
236
+ kind: args.kind,
237
+ body: args.body,
238
+ ...(args.threadId !== undefined ? { threadId: args.threadId } : {}),
239
+ ...(args.taskId !== undefined ? { taskId: args.taskId } : {}),
240
+ ...(args.inReplyTo !== undefined ? { inReplyTo: args.inReplyTo } : {}),
241
+ ...(args.messageId !== undefined ? { messageId: args.messageId } : {}),
242
+ ...(args.ttlSeconds !== undefined ? { ttlSeconds: args.ttlSeconds } : {}),
243
+ }, fetchImpl);
244
+ }
245
+ case 'inbox_read': {
246
+ const args = parseInboxReadArgs(rawArgs);
247
+ const params = new URLSearchParams();
248
+ if (args.cursor !== undefined)
249
+ params.set('cursor', args.cursor);
250
+ params.set('limit', String(args.limit));
251
+ params.set('unreadOnly', String(args.unreadOnly));
252
+ return readInboxAndMaybeAck(args, () => runPassGet(aisUrl, `/v1/agents/${agentId}/inbox?${params}`, runPassFile, fetchImpl), (messageIds) => runPassPost(aisUrl, `/v1/agents/${agentId}/inbox/ack`, runPassFile, { messageIds }, fetchImpl));
253
+ }
254
+ case 'inbox_ack': {
255
+ const args = parseInboxAckArgs(rawArgs);
256
+ return runPassPost(aisUrl, `/v1/agents/${agentId}/inbox/ack`, runPassFile, { messageIds: args.messageIds }, fetchImpl);
257
+ }
258
+ case 'handoff': {
259
+ const args = parseHandoffArgs(rawArgs);
260
+ return runPassPost(aisUrl, `/v1/agents/${agentId}/handoff`, runPassFile, {
261
+ ...(args.summary !== undefined ? { summary: args.summary } : {}),
262
+ ...(args.keyLearnings !== undefined ? { keyLearnings: args.keyLearnings } : {}),
263
+ ...(args.docPath !== undefined ? { docPath: args.docPath } : {}),
264
+ ...(args.docPrUrl !== undefined ? { docPrUrl: args.docPrUrl } : {}),
265
+ }, fetchImpl);
266
+ }
267
+ case 'agent_archive':
268
+ case 'agent_delete':
269
+ throw new OutOfScopeToolError(name, AGENT_ARCHIVE_KEY_MODE_DETAIL);
270
+ default:
271
+ return UNKNOWN_TOOL_RUN_PASS_MODE;
272
+ }
273
+ }
274
+ //# sourceMappingURL=run-pass-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-pass-mode.js","sourceRoot":"","sources":["../src/run-pass-mode.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,2BAA2B,EAC3B,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAExB,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAOtD,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAID,KAAK,UAAU,QAAQ,CAAC,GAAa;IACnC,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAA0C,OAAO,CAAC,GAAG;IAErD,MAAM,OAAO,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACzC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAEvC,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,WAAW,KAAK,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,kBAAkB,CAAC,sEAAsE,CAAC,CAAC;IACvG,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,kBAAkB,CAC1B,wDAAwD;YACtD,2DAA2D,CAC9D,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAC7E,MAAM,IAAI,kBAAkB,CAAC,0DAA0D,WAAW,KAAK,MAAM,EAAE,CAAC,CAAC;IACnH,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,kBAAkB,CAAC,8CAA8C,WAAW,YAAY,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,kBAAkB,CAC1B,8CAA8C,WAAW,6CAA6C,CACvG,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,WAAmB,EAAE,kBAA2B;IAC5E,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IACnD,OAAO;QACL,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrE,YAAY,EAAE,OAAO;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,IAAY,EACZ,WAAmB,EACnB,IAAa,EACb,YAAuB,UAAU,CAAC,KAAK;IAEvC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,sBAAsB,EAAE,CAAC;IAC3C,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE;YACxC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACxD,aAAa,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxH,MAAM,OAAO,CAAC;IAChB,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,UAAU,CAC9B,MAAc,EACd,IAAY,EACZ,WAAmB,EACnB,YAAuB,UAAU,CAAC,KAAK;IAEvC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,sBAAsB,EAAE,CAAC;IAC3C,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE;YACxC,OAAO;YACP,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACxD,aAAa,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxH,MAAM,OAAO,CAAC;IAChB,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,YAAY,CAChC,MAAc,EACd,IAAY,EACZ,WAAmB,EACnB,IAAa,EACb,YAAuB,UAAU,CAAC,KAAK;IAEvC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,sBAAsB,EAAE,CAAC;IAC3C,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,EAAE;YACxC,MAAM,EAAE,OAAO;YACf,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACxD,aAAa,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxH,MAAM,OAAO,CAAC;IAChB,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,MAAM,0BAA0B,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;AAE/E,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAc,EACd,MAAqB,EACrB,IAAY,EACZ,OAAgB,EAChB,YAAuB,UAAU,CAAC,KAAK;IAEvC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAExC,QAAQ,IAAI,EAAE,CAAC;QACf,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,CAAC;gBACH,OAAO,MAAM,WAAW,CAAC,MAAM,EAAE,cAAc,OAAO,SAAS,EAAE,WAAW,EAAE;oBAC5E,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,UAAU,EAAE,IAAI,CAAC,UAAU;oBAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;iBACpD,EAAE,SAAS,CAAC,CAAC;YAChB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,SAAS,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;gBAC7C,IAAI,SAAS;oBAAE,OAAO,SAAS,CAAC;gBAChC,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,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,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7F,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/F,OAAO,UAAU,CAAC,MAAM,EAAE,cAAc,OAAO,WAAW,MAAM,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAC9F,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,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;gBAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACjE,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;gBAAE,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACxF,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACjC,OAAO,UAAU,CAAC,MAAM,EAAE,cAAc,OAAO,gBAAgB,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QACnH,CAAC;QAED,KAAK,OAAO;YACV,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,WAAW,CAAC,MAAM,EAAE,cAAc,OAAO,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;QAExF,KAAK,QAAQ;YACX,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,qBAAqB,CAC1B,OAAO,EACP,UAAU,EACV,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,OAAO,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,EAChF,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,OAAO,iBAAiB,EAAE,WAAW,EAAE,SAAS,CAAC,CACzF,CAAC;QAEJ,KAAK,mBAAmB;YACtB,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;QAEzB,KAAK,YAAY;YACf,MAAM,IAAI,mBAAmB,CAAC,IAAI,EAAE,yFAAyF,CAAC,CAAC;QAEjI,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAC1C,OAAO,WAAW,CAAC,MAAM,EAAE,cAAc,OAAO,QAAQ,EAAE,WAAW,EAAE;gBACrE,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,UAAU,CAAC,MAAM,EAAE,cAAc,OAAO,UAAU,MAAM,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAC7F,CAAC;QAED,KAAK,sBAAsB,CAAC,CAAC,CAAC;YAC5B,MAAM,IAAI,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;YAClD,OAAO,YAAY,CAAC,MAAM,EAAE,cAAc,OAAO,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE;gBACrF,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,WAAW,CAAC,MAAM,EAAE,cAAc,OAAO,UAAU,IAAI,CAAC,MAAM,WAAW,EAAE,WAAW,EAAE;gBAC7F,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,YAAY,CAAC,CAAC,CAAC;YAClB,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;YACzC,OAAO,WAAW,CAAC,MAAM,EAAE,cAAc,OAAO,QAAQ,EAAE,WAAW,EAAE;gBACrE,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,UAAU,CAAC,MAAM,EAAE,cAAc,OAAO,UAAU,MAAM,EAAE,EAAE,WAAW,EAAE,SAAS,CAAC,EACzF,CAAC,UAAU,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,OAAO,YAAY,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,EAAE,SAAS,CAAC,CAC/G,CAAC;QACJ,CAAC;QAED,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO,WAAW,CAAC,MAAM,EAAE,cAAc,OAAO,YAAY,EAAE,WAAW,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC;QACzH,CAAC;QAED,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACvC,OAAO,WAAW,CAAC,MAAM,EAAE,cAAc,OAAO,UAAU,EAAE,WAAW,EAAE;gBACvE,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/E,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChE,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpE,EAAE,SAAS,CAAC,CAAC;QAChB,CAAC;QAED,KAAK,eAAe,CAAC;QACrB,KAAK,cAAc;YACjB,MAAM,IAAI,mBAAmB,CAAC,IAAI,EAAE,6BAA6B,CAAC,CAAC;QAErE;YACE,OAAO,0BAA0B,CAAC;IACpC,CAAC;AACH,CAAC"}
@@ -0,0 +1,40 @@
1
+ import { z } from 'zod';
2
+ declare const sessionIdentitySchema: z.ZodObject<{
3
+ version: z.ZodLiteral<1>;
4
+ source: z.ZodEnum<{
5
+ agent_load: "agent_load";
6
+ env: "env";
7
+ }>;
8
+ agentId: z.ZodString;
9
+ }, z.core.$strict>;
10
+ export type SessionIdentity = z.infer<typeof sessionIdentitySchema>;
11
+ export declare const IDENTITY_REPAIR = "Set AIS_AGENT_ID for THIS session only \u2014 export it in the shell that launches aismemory, or set it in the env block of this session's own MCP config \u2014 then restart the session and run aismemory doctor. Switch agents inside a session with agent_load. Never pin a machine, install or harness to one agent; other sessions on this machine run as other agents.";
12
+ export declare const RECENT_IDENTITY_CONFIRMATION_TTL_MS: number;
13
+ export declare const WHOAMI_RETRY_BACKOFF_MS: readonly [250, 500];
14
+ type Clock = () => number;
15
+ type Sleep = (ms: number) => Promise<void>;
16
+ export interface VerifyPinnedIdentityOptions {
17
+ /** Identifies the credential without storing the secret itself. */
18
+ credentialKey: string;
19
+ /** Switch and doctor checks must ask AIS and may not accept cached proof. */
20
+ freshOnly?: boolean;
21
+ clock?: Clock;
22
+ sleep?: Sleep;
23
+ }
24
+ export declare function identityCredentialFingerprint(kind: string, credential: string): string;
25
+ export declare function clearPinnedIdentityConfirmation(pin: SessionIdentity | null, credentialKey?: string): void;
26
+ /**
27
+ * Lists leftover per-harness manifest files from the removed machine-wide pin.
28
+ * They are read by nothing; doctor only reports them so a human can delete
29
+ * them deliberately. Never deletes anything.
30
+ */
31
+ export declare function legacyHarnessManifests(home?: string): string[];
32
+ /** Reads this process's own identity. No file, no shared state, no machine-wide pin. */
33
+ export declare function loadSessionIdentity(env?: NodeJS.ProcessEnv): SessionIdentity | null;
34
+ /** The identity this session holds after a successful in-session agent_load switch. */
35
+ export declare function switchedTo(previous: SessionIdentity, agentId: string): SessionIdentity;
36
+ export declare function assertPinnedAgent(pin: SessionIdentity | null, agentId: string): void;
37
+ /** Verify the same whoami response exposed by the selected auth adapter, before every mutation. */
38
+ export declare function verifyPinnedIdentity(pin: SessionIdentity | null, agentId: string, whoami: () => Promise<unknown>, options: VerifyPinnedIdentityOptions): Promise<void>;
39
+ export declare function requiresIdentityGate(name: string, args: Record<string, unknown>): boolean;
40
+ export {};