@jini-ai/http-kit 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +107 -0
  3. package/dist/active-context.d.ts +99 -0
  4. package/dist/active-context.d.ts.map +1 -0
  5. package/dist/active-context.js +77 -0
  6. package/dist/active-context.js.map +1 -0
  7. package/dist/adapter.d.ts +36 -0
  8. package/dist/adapter.d.ts.map +1 -0
  9. package/dist/adapter.js +92 -0
  10. package/dist/adapter.js.map +1 -0
  11. package/dist/agents.d.ts +55 -0
  12. package/dist/agents.d.ts.map +1 -0
  13. package/dist/agents.js +23 -0
  14. package/dist/agents.js.map +1 -0
  15. package/dist/api-security-middleware.d.ts +146 -0
  16. package/dist/api-security-middleware.d.ts.map +1 -0
  17. package/dist/api-security-middleware.js +276 -0
  18. package/dist/api-security-middleware.js.map +1 -0
  19. package/dist/attachments.d.ts +317 -0
  20. package/dist/attachments.d.ts.map +1 -0
  21. package/dist/attachments.js +664 -0
  22. package/dist/attachments.js.map +1 -0
  23. package/dist/cancel-owned-runs.d.ts +44 -0
  24. package/dist/cancel-owned-runs.d.ts.map +1 -0
  25. package/dist/cancel-owned-runs.js +35 -0
  26. package/dist/cancel-owned-runs.js.map +1 -0
  27. package/dist/compat.d.ts +22 -0
  28. package/dist/compat.d.ts.map +1 -0
  29. package/dist/compat.js +17 -0
  30. package/dist/compat.js.map +1 -0
  31. package/dist/component-catalog.d.ts +74 -0
  32. package/dist/component-catalog.d.ts.map +1 -0
  33. package/dist/component-catalog.js +74 -0
  34. package/dist/component-catalog.js.map +1 -0
  35. package/dist/connectors.d.ts +165 -0
  36. package/dist/connectors.d.ts.map +1 -0
  37. package/dist/connectors.js +474 -0
  38. package/dist/connectors.js.map +1 -0
  39. package/dist/daemon-status.d.ts +72 -0
  40. package/dist/daemon-status.d.ts.map +1 -0
  41. package/dist/daemon-status.js +60 -0
  42. package/dist/daemon-status.js.map +1 -0
  43. package/dist/db-ops.d.ts +116 -0
  44. package/dist/db-ops.d.ts.map +1 -0
  45. package/dist/db-ops.js +191 -0
  46. package/dist/db-ops.js.map +1 -0
  47. package/dist/delegated-tools.d.ts +46 -0
  48. package/dist/delegated-tools.d.ts.map +1 -0
  49. package/dist/delegated-tools.js +155 -0
  50. package/dist/delegated-tools.js.map +1 -0
  51. package/dist/express/run-stream.d.ts +15 -0
  52. package/dist/express/run-stream.d.ts.map +1 -0
  53. package/dist/express/run-stream.js +11 -0
  54. package/dist/express/run-stream.js.map +1 -0
  55. package/dist/express-index.d.ts +32 -0
  56. package/dist/express-index.d.ts.map +1 -0
  57. package/dist/express-index.js +14 -0
  58. package/dist/express-index.js.map +1 -0
  59. package/dist/fastify/adapter.d.ts +31 -0
  60. package/dist/fastify/adapter.d.ts.map +1 -0
  61. package/dist/fastify/adapter.js +64 -0
  62. package/dist/fastify/adapter.js.map +1 -0
  63. package/dist/fastify/agents.d.ts +13 -0
  64. package/dist/fastify/agents.d.ts.map +1 -0
  65. package/dist/fastify/agents.js +7 -0
  66. package/dist/fastify/agents.js.map +1 -0
  67. package/dist/fastify/api-security-middleware.d.ts +64 -0
  68. package/dist/fastify/api-security-middleware.d.ts.map +1 -0
  69. package/dist/fastify/api-security-middleware.js +139 -0
  70. package/dist/fastify/api-security-middleware.js.map +1 -0
  71. package/dist/fastify/compat.d.ts +22 -0
  72. package/dist/fastify/compat.d.ts.map +1 -0
  73. package/dist/fastify/compat.js +16 -0
  74. package/dist/fastify/compat.js.map +1 -0
  75. package/dist/fastify/daemon-status.d.ts +22 -0
  76. package/dist/fastify/daemon-status.d.ts.map +1 -0
  77. package/dist/fastify/daemon-status.js +9 -0
  78. package/dist/fastify/daemon-status.js.map +1 -0
  79. package/dist/fastify/host-tools.d.ts +13 -0
  80. package/dist/fastify/host-tools.d.ts.map +1 -0
  81. package/dist/fastify/host-tools.js +8 -0
  82. package/dist/fastify/host-tools.js.map +1 -0
  83. package/dist/fastify/index.d.ts +36 -0
  84. package/dist/fastify/index.d.ts.map +1 -0
  85. package/dist/fastify/index.js +18 -0
  86. package/dist/fastify/index.js.map +1 -0
  87. package/dist/fastify/local-daemon-request.d.ts +43 -0
  88. package/dist/fastify/local-daemon-request.d.ts.map +1 -0
  89. package/dist/fastify/local-daemon-request.js +155 -0
  90. package/dist/fastify/local-daemon-request.js.map +1 -0
  91. package/dist/fastify/origin.d.ts +21 -0
  92. package/dist/fastify/origin.d.ts.map +1 -0
  93. package/dist/fastify/origin.js +14 -0
  94. package/dist/fastify/origin.js.map +1 -0
  95. package/dist/fastify/request.d.ts +20 -0
  96. package/dist/fastify/request.d.ts.map +1 -0
  97. package/dist/fastify/request.js +25 -0
  98. package/dist/fastify/request.js.map +1 -0
  99. package/dist/fastify/response.d.ts +20 -0
  100. package/dist/fastify/response.d.ts.map +1 -0
  101. package/dist/fastify/response.js +41 -0
  102. package/dist/fastify/response.js.map +1 -0
  103. package/dist/fastify/route-registration-guard.d.ts +70 -0
  104. package/dist/fastify/route-registration-guard.d.ts.map +1 -0
  105. package/dist/fastify/route-registration-guard.js +69 -0
  106. package/dist/fastify/route-registration-guard.js.map +1 -0
  107. package/dist/fastify/run-stream.d.ts +18 -0
  108. package/dist/fastify/run-stream.d.ts.map +1 -0
  109. package/dist/fastify/run-stream.js +10 -0
  110. package/dist/fastify/run-stream.js.map +1 -0
  111. package/dist/fastify/runs.d.ts +17 -0
  112. package/dist/fastify/runs.d.ts.map +1 -0
  113. package/dist/fastify/runs.js +33 -0
  114. package/dist/fastify/runs.js.map +1 -0
  115. package/dist/frontend-control.d.ts +131 -0
  116. package/dist/frontend-control.d.ts.map +1 -0
  117. package/dist/frontend-control.js +77 -0
  118. package/dist/frontend-control.js.map +1 -0
  119. package/dist/frontend-sessions.d.ts +100 -0
  120. package/dist/frontend-sessions.d.ts.map +1 -0
  121. package/dist/frontend-sessions.js +180 -0
  122. package/dist/frontend-sessions.js.map +1 -0
  123. package/dist/health.d.ts +91 -0
  124. package/dist/health.d.ts.map +1 -0
  125. package/dist/health.js +53 -0
  126. package/dist/health.js.map +1 -0
  127. package/dist/host-tools.d.ts +174 -0
  128. package/dist/host-tools.d.ts.map +1 -0
  129. package/dist/host-tools.js +338 -0
  130. package/dist/host-tools.js.map +1 -0
  131. package/dist/index.d.ts +86 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +40 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/local-daemon-request.d.ts +44 -0
  136. package/dist/local-daemon-request.d.ts.map +1 -0
  137. package/dist/local-daemon-request.js +145 -0
  138. package/dist/local-daemon-request.js.map +1 -0
  139. package/dist/media.d.ts +131 -0
  140. package/dist/media.d.ts.map +1 -0
  141. package/dist/media.js +352 -0
  142. package/dist/media.js.map +1 -0
  143. package/dist/memory.d.ts +230 -0
  144. package/dist/memory.d.ts.map +1 -0
  145. package/dist/memory.js +331 -0
  146. package/dist/memory.js.map +1 -0
  147. package/dist/model-proxy.d.ts +45 -0
  148. package/dist/model-proxy.d.ts.map +1 -0
  149. package/dist/model-proxy.js +619 -0
  150. package/dist/model-proxy.js.map +1 -0
  151. package/dist/origin-validation.d.ts +64 -0
  152. package/dist/origin-validation.d.ts.map +1 -0
  153. package/dist/origin-validation.js +226 -0
  154. package/dist/origin-validation.js.map +1 -0
  155. package/dist/origin.d.ts +32 -0
  156. package/dist/origin.d.ts.map +1 -0
  157. package/dist/origin.js +14 -0
  158. package/dist/origin.js.map +1 -0
  159. package/dist/pack-http.d.ts +30 -0
  160. package/dist/pack-http.d.ts.map +1 -0
  161. package/dist/pack-http.js +12 -0
  162. package/dist/pack-http.js.map +1 -0
  163. package/dist/raw-sse.d.ts +44 -0
  164. package/dist/raw-sse.d.ts.map +1 -0
  165. package/dist/raw-sse.js +93 -0
  166. package/dist/raw-sse.js.map +1 -0
  167. package/dist/remote-run-events.d.ts +66 -0
  168. package/dist/remote-run-events.d.ts.map +1 -0
  169. package/dist/remote-run-events.js +230 -0
  170. package/dist/remote-run-events.js.map +1 -0
  171. package/dist/request.d.ts +19 -0
  172. package/dist/request.d.ts.map +1 -0
  173. package/dist/request.js +25 -0
  174. package/dist/request.js.map +1 -0
  175. package/dist/research.d.ts +42 -0
  176. package/dist/research.d.ts.map +1 -0
  177. package/dist/research.js +316 -0
  178. package/dist/research.js.map +1 -0
  179. package/dist/response.d.ts +14 -0
  180. package/dist/response.d.ts.map +1 -0
  181. package/dist/response.js +45 -0
  182. package/dist/response.js.map +1 -0
  183. package/dist/route-manifest.d.ts +31 -0
  184. package/dist/route-manifest.d.ts.map +1 -0
  185. package/dist/route-manifest.js +103 -0
  186. package/dist/route-manifest.js.map +1 -0
  187. package/dist/route-registration-guard.d.ts +65 -0
  188. package/dist/route-registration-guard.d.ts.map +1 -0
  189. package/dist/route-registration-guard.js +71 -0
  190. package/dist/route-registration-guard.js.map +1 -0
  191. package/dist/routines.d.ts +114 -0
  192. package/dist/routines.d.ts.map +1 -0
  193. package/dist/routines.js +320 -0
  194. package/dist/routines.js.map +1 -0
  195. package/dist/run-stream.d.ts +60 -0
  196. package/dist/run-stream.d.ts.map +1 -0
  197. package/dist/run-stream.js +108 -0
  198. package/dist/run-stream.js.map +1 -0
  199. package/dist/runs.d.ts +79 -0
  200. package/dist/runs.d.ts.map +1 -0
  201. package/dist/runs.js +232 -0
  202. package/dist/runs.js.map +1 -0
  203. package/dist/sse.d.ts +139 -0
  204. package/dist/sse.d.ts.map +1 -0
  205. package/dist/sse.js +157 -0
  206. package/dist/sse.js.map +1 -0
  207. package/dist/terminals.d.ts +125 -0
  208. package/dist/terminals.d.ts.map +1 -0
  209. package/dist/terminals.js +349 -0
  210. package/dist/terminals.js.map +1 -0
  211. package/dist/tool-catalog.d.ts +68 -0
  212. package/dist/tool-catalog.d.ts.map +1 -0
  213. package/dist/tool-catalog.js +68 -0
  214. package/dist/tool-catalog.js.map +1 -0
  215. package/dist/types.d.ts +58 -0
  216. package/dist/types.d.ts.map +1 -0
  217. package/dist/types.js +5 -0
  218. package/dist/types.js.map +1 -0
  219. package/dist/workspace-root.d.ts +69 -0
  220. package/dist/workspace-root.d.ts.map +1 -0
  221. package/dist/workspace-root.js +63 -0
  222. package/dist/workspace-root.js.map +1 -0
  223. package/dist/xai.d.ts +86 -0
  224. package/dist/xai.d.ts.map +1 -0
  225. package/dist/xai.js +668 -0
  226. package/dist/xai.js.map +1 -0
  227. package/package.json +58 -0
package/dist/memory.js ADDED
@@ -0,0 +1,331 @@
1
+ import { createApiError } from '@jini-ai/protocol';
2
+ import { defineJsonRoute, mountJsonRoute } from './adapter.js';
3
+ import { guardSameOrigin } from './origin.js';
4
+ import { validationError } from './request.js';
5
+ import { sendApiError, statusForError } from './response.js';
6
+ import { createSseChannel } from './sse.js';
7
+ import { err, ok } from './types.js';
8
+ function isRecord(value) {
9
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
10
+ }
11
+ function errorMessage(error) {
12
+ return error instanceof Error ? error.message : String(error);
13
+ }
14
+ function parseIdParam(input) {
15
+ const id = input.params.id;
16
+ return typeof id === 'string' && id.length > 0 ? ok(id) : err(validationError('id must be a non-empty path parameter'));
17
+ }
18
+ export const memoryOverviewRoute = defineJsonRoute({
19
+ method: 'get',
20
+ path: '/api/memory',
21
+ parse: () => ok(undefined),
22
+ handle: async (_input, deps) => {
23
+ const [config, index, entries] = await Promise.all([
24
+ deps.notes.readConfig(deps.dataDir),
25
+ deps.notes.readIndex(deps.dataDir),
26
+ deps.notes.listEntries(deps.dataDir),
27
+ ]);
28
+ return ok({ enabled: config.enabled, rootDir: deps.notes.dir(deps.dataDir), index, entries });
29
+ },
30
+ });
31
+ export const memoryTreeRoute = defineJsonRoute({
32
+ method: 'get',
33
+ path: '/api/memory/tree',
34
+ parse: () => ok(undefined),
35
+ handle: async (_input, deps) => {
36
+ const [config, tree] = await Promise.all([deps.notes.readConfig(deps.dataDir), deps.notes.buildTree(deps.dataDir)]);
37
+ return ok({ enabled: config.enabled, rootDir: deps.notes.dir(deps.dataDir), tree });
38
+ },
39
+ });
40
+ function parseUpdateTreeNode(input) {
41
+ const parsedId = parseIdParam(input);
42
+ if (!parsedId.ok)
43
+ return parsedId;
44
+ if (!isRecord(input.body))
45
+ return err(validationError('body must be a JSON object'));
46
+ const patch = {};
47
+ for (const key of ['name', 'description', 'type', 'body']) {
48
+ const value = input.body[key];
49
+ if (value === undefined)
50
+ continue;
51
+ if (typeof value !== 'string')
52
+ return err(validationError(`${key} must be a string when provided`));
53
+ patch[key] = value;
54
+ }
55
+ return ok({ id: parsedId.value, patch });
56
+ }
57
+ export const memoryUpdateTreeNodeRoute = defineJsonRoute({
58
+ method: 'patch',
59
+ path: '/api/memory/tree/:id',
60
+ requireSameOrigin: true,
61
+ parse: parseUpdateTreeNode,
62
+ handle: async ({ id, patch }, deps) => {
63
+ try {
64
+ const entry = await deps.notes.updateTreeNode(deps.dataDir, id, patch);
65
+ const tree = await deps.notes.buildTree(deps.dataDir);
66
+ return ok({ entry, tree });
67
+ }
68
+ catch (error) {
69
+ const message = errorMessage(error);
70
+ return err(createApiError(message === 'note not found' ? 'NOT_FOUND' : 'BAD_REQUEST', message));
71
+ }
72
+ },
73
+ });
74
+ /**
75
+ * Requires `index` to be present and a string — it is not defaulted.
76
+ *
77
+ * Coercing anything else to `''` meant a malformed PUT *succeeded* and wrote an empty document over
78
+ * the caller's entire memory index: a misspelled field (`{ notes: "…" }`), a client that sent the
79
+ * value as a number, or a body that failed to serialize all landed on the same destructive path and
80
+ * returned 200. Clearing the index is still supported, because it is a real thing to want — it just
81
+ * has to be asked for explicitly with `{ index: "" }`, which no typo and no serialization accident
82
+ * produces by chance.
83
+ */
84
+ function parseIndexBody(input) {
85
+ if (!isRecord(input.body))
86
+ return err(validationError('body must be a JSON object'));
87
+ const index = input.body.index;
88
+ if (typeof index !== 'string') {
89
+ return err(validationError('index must be a string — send an explicit empty string to clear it', [
90
+ { path: 'index', message: 'required string' },
91
+ ]));
92
+ }
93
+ return ok(index);
94
+ }
95
+ export const memoryWriteIndexRoute = defineJsonRoute({
96
+ method: 'put',
97
+ path: '/api/memory/index',
98
+ requireSameOrigin: true,
99
+ parse: parseIndexBody,
100
+ handle: async (index, deps) => {
101
+ try {
102
+ await deps.notes.writeIndex(deps.dataDir, index);
103
+ return ok({ index });
104
+ }
105
+ catch (error) {
106
+ return err(createApiError('BAD_REQUEST', errorMessage(error)));
107
+ }
108
+ },
109
+ });
110
+ function parseConfigPatch(input) {
111
+ if (!isRecord(input.body))
112
+ return err(validationError('body must be a JSON object'));
113
+ if (input.body.enabled === undefined)
114
+ return ok({});
115
+ if (typeof input.body.enabled !== 'boolean')
116
+ return err(validationError('enabled must be a boolean when provided'));
117
+ return ok({ enabled: input.body.enabled });
118
+ }
119
+ export const memoryWriteConfigRoute = defineJsonRoute({
120
+ method: 'patch',
121
+ path: '/api/memory/config',
122
+ requireSameOrigin: true,
123
+ parse: parseConfigPatch,
124
+ handle: async (patch, deps) => {
125
+ try {
126
+ const next = await deps.notes.writeConfig(deps.dataDir, patch);
127
+ return ok({ enabled: next.enabled });
128
+ }
129
+ catch (error) {
130
+ return err(createApiError('BAD_REQUEST', errorMessage(error)));
131
+ }
132
+ },
133
+ });
134
+ export const memoryListExtractionsRoute = defineJsonRoute({
135
+ method: 'get',
136
+ path: '/api/memory/extractions',
137
+ parse: () => ok(undefined),
138
+ handle: async (_input, deps) => ok({ extractions: deps.extractions.list() }),
139
+ });
140
+ export const memoryClearExtractionsRoute = defineJsonRoute({
141
+ method: 'delete',
142
+ path: '/api/memory/extractions',
143
+ requireSameOrigin: true,
144
+ parse: () => ok(undefined),
145
+ handle: async (_input, deps) => ok({ removed: deps.extractions.clear() }),
146
+ });
147
+ export const memoryRemoveExtractionRoute = defineJsonRoute({
148
+ method: 'delete',
149
+ path: '/api/memory/extractions/:id',
150
+ requireSameOrigin: true,
151
+ parse: parseIdParam,
152
+ handle: async (id, deps) => ok({ removed: deps.extractions.remove(id) }),
153
+ });
154
+ export const memoryListVerificationsRoute = defineJsonRoute({
155
+ method: 'get',
156
+ path: '/api/memory/verifications',
157
+ parse: () => ok(undefined),
158
+ handle: async (_input, deps) => ok({ verifications: deps.verifications.list() }),
159
+ });
160
+ export const memoryClearVerificationsRoute = defineJsonRoute({
161
+ method: 'delete',
162
+ path: '/api/memory/verifications',
163
+ requireSameOrigin: true,
164
+ parse: () => ok(undefined),
165
+ handle: async (_input, deps) => ok({ removed: deps.verifications.clear() }),
166
+ });
167
+ export const memoryRemoveVerificationRoute = defineJsonRoute({
168
+ method: 'delete',
169
+ path: '/api/memory/verifications/:id',
170
+ requireSameOrigin: true,
171
+ parse: parseIdParam,
172
+ handle: async (id, deps) => ok({ removed: deps.verifications.remove(id) }),
173
+ });
174
+ function parseEntryInput(input) {
175
+ if (!isRecord(input.body))
176
+ return err(validationError('body must be a JSON object'));
177
+ const { name, type } = input.body;
178
+ if (typeof name !== 'string' || name.length === 0) {
179
+ return err(validationError('name is required', [{ path: 'name', message: 'required non-empty string' }]));
180
+ }
181
+ if (typeof type !== 'string' || type.length === 0) {
182
+ return err(validationError('type is required', [{ path: 'type', message: 'required non-empty string' }]));
183
+ }
184
+ const description = input.body.description;
185
+ if (description !== undefined && typeof description !== 'string') {
186
+ return err(validationError('description must be a string when provided'));
187
+ }
188
+ const body = input.body.body;
189
+ if (body !== undefined && typeof body !== 'string') {
190
+ return err(validationError('body must be a string when provided'));
191
+ }
192
+ return ok({
193
+ name,
194
+ type,
195
+ ...(description === undefined ? {} : { description }),
196
+ ...(body === undefined ? {} : { body }),
197
+ });
198
+ }
199
+ export const memoryCreateEntryRoute = defineJsonRoute({
200
+ method: 'post',
201
+ path: '/api/memory',
202
+ requireSameOrigin: true,
203
+ parse: parseEntryInput,
204
+ handle: async (input, deps) => {
205
+ try {
206
+ const entry = await deps.notes.upsertEntry(deps.dataDir, input);
207
+ return ok({ entry });
208
+ }
209
+ catch (error) {
210
+ return err(createApiError('BAD_REQUEST', errorMessage(error)));
211
+ }
212
+ },
213
+ successStatus: 201,
214
+ });
215
+ export const memoryReadEntryRoute = defineJsonRoute({
216
+ method: 'get',
217
+ path: '/api/memory/:id',
218
+ parse: parseIdParam,
219
+ handle: async (id, deps) => {
220
+ const entry = await deps.notes.readEntry(deps.dataDir, id);
221
+ return entry === null ? err(createApiError('NOT_FOUND', 'memory not found')) : ok({ entry });
222
+ },
223
+ });
224
+ function parseUpdateEntry(input) {
225
+ const parsedId = parseIdParam(input);
226
+ if (!parsedId.ok)
227
+ return parsedId;
228
+ const parsedInput = parseEntryInput(input);
229
+ if (!parsedInput.ok)
230
+ return parsedInput;
231
+ return ok({ id: parsedId.value, input: parsedInput.value });
232
+ }
233
+ export const memoryUpdateEntryRoute = defineJsonRoute({
234
+ method: 'put',
235
+ path: '/api/memory/:id',
236
+ requireSameOrigin: true,
237
+ parse: parseUpdateEntry,
238
+ handle: async ({ id, input }, deps) => {
239
+ try {
240
+ const entry = await deps.notes.upsertEntry(deps.dataDir, { ...input, id });
241
+ return ok({ entry });
242
+ }
243
+ catch (error) {
244
+ return err(createApiError('BAD_REQUEST', errorMessage(error)));
245
+ }
246
+ },
247
+ });
248
+ export const memoryDeleteEntryRoute = defineJsonRoute({
249
+ method: 'delete',
250
+ path: '/api/memory/:id',
251
+ requireSameOrigin: true,
252
+ parse: parseIdParam,
253
+ handle: async (id, deps) => {
254
+ try {
255
+ await deps.notes.deleteEntry(deps.dataDir, id);
256
+ return ok({ ok: true });
257
+ }
258
+ catch (error) {
259
+ return err(createApiError('BAD_REQUEST', errorMessage(error)));
260
+ }
261
+ },
262
+ });
263
+ /**
264
+ * `GET /api/memory/events` — one SSE connection multiplexing three channels
265
+ * (matching OD's own reasoning: "so the browser opens one connection instead
266
+ * of two/three"): `connected` (once, on open), `change` (relayed from
267
+ * `deps.notes.events`), `extraction` (relayed from `deps.extractions.events`,
268
+ * whose underlying event name is `'attempt'` — see `@jini-ai/memory`'s
269
+ * `extraction-log.ts`), and `verify` (relayed from `deps.verifications.events`).
270
+ * Uses `sse.ts`'s generic channel rather than OD's bespoke `createSseResponse`;
271
+ * no Last-Event-ID replay (unlike `runs.ts`) since none of the three
272
+ * underlying emitters buffer history for reconnect — this mirrors the OD
273
+ * origin's own behavior (a live tail only, no replay).
274
+ *
275
+ * Bypasses `mountJsonRoute` (raw `app.get`, for the SSE response shape), so it does not get
276
+ * `requireSameOrigin` for free the way the JSON routes below do — the guard is applied here
277
+ * directly, before the SSE channel is opened, so a cross-origin request never gets a stream.
278
+ */
279
+ export function registerMemoryEventStream(app, deps, adapter) {
280
+ app.get('/api/memory/events', (req, res) => {
281
+ const origin = guardSameOrigin(req, adapter);
282
+ if (!origin.ok) {
283
+ sendApiError(res, statusForError(origin.error), origin.error);
284
+ return;
285
+ }
286
+ let seq = 0;
287
+ const channel = createSseChannel(res);
288
+ const emit = (kind, data) => {
289
+ channel.enqueue({ opaqueCursor: String(seq++), kind, data });
290
+ };
291
+ const onChange = (event) => emit('change', event);
292
+ const onExtraction = (event) => emit('extraction', event);
293
+ const onVerify = (event) => emit('verify', event);
294
+ deps.notes.events.on('change', onChange);
295
+ deps.extractions.events.on('attempt', onExtraction);
296
+ deps.verifications.events.on('verify', onVerify);
297
+ channel.onClose(() => {
298
+ deps.notes.events.off('change', onChange);
299
+ deps.extractions.events.off('attempt', onExtraction);
300
+ deps.verifications.events.off('verify', onVerify);
301
+ });
302
+ channel.open();
303
+ emit('connected', { at: Date.now() });
304
+ });
305
+ }
306
+ /**
307
+ * Mounts every ported memory route. Static sub-resources (`/tree`,
308
+ * `/index`, `/config`, `/events`, `/extractions`, `/verifications`) are
309
+ * mounted BEFORE the `/api/memory/:id` catch-all routes, preserving OD's own
310
+ * ordering discipline ("so an `index`/`config`/`extract` slug can't shadow
311
+ * the real handlers") — Express matches routes in registration order.
312
+ */
313
+ export function registerMemoryRoutes(app, deps, adapter) {
314
+ mountJsonRoute(app, memoryOverviewRoute, deps, adapter);
315
+ mountJsonRoute(app, memoryTreeRoute, deps, adapter);
316
+ mountJsonRoute(app, memoryUpdateTreeNodeRoute, deps, adapter);
317
+ mountJsonRoute(app, memoryWriteIndexRoute, deps, adapter);
318
+ mountJsonRoute(app, memoryWriteConfigRoute, deps, adapter);
319
+ registerMemoryEventStream(app, deps, adapter);
320
+ mountJsonRoute(app, memoryListExtractionsRoute, deps, adapter);
321
+ mountJsonRoute(app, memoryClearExtractionsRoute, deps, adapter);
322
+ mountJsonRoute(app, memoryRemoveExtractionRoute, deps, adapter);
323
+ mountJsonRoute(app, memoryListVerificationsRoute, deps, adapter);
324
+ mountJsonRoute(app, memoryClearVerificationsRoute, deps, adapter);
325
+ mountJsonRoute(app, memoryRemoveVerificationRoute, deps, adapter);
326
+ mountJsonRoute(app, memoryCreateEntryRoute, deps, adapter);
327
+ mountJsonRoute(app, memoryReadEntryRoute, deps, adapter);
328
+ mountJsonRoute(app, memoryUpdateEntryRoute, deps, adapter);
329
+ mountJsonRoute(app, memoryDeleteEntryRoute, deps, adapter);
330
+ }
331
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { Express } from 'express';
2
+ import { type AnthropicToolExecutor, type AzureToolExecutor, type GoogleToolExecutor, type OllamaToolExecutor, type OpenAiToolExecutor, type DnsLookupFn, type PinnedFetch } from '@jini-ai/agent-runtime';
3
+ import type { AdapterContext } from './adapter.js';
4
+ /** Diagnostic detail for an internal-error response this route deliberately does not disclose to the client (SEC-005, matching `runs.ts#RunInternalErrorContext`). Only reached if a turn-runner's promise itself rejects — every turn-runner already converts every provider/network failure into an `'error'`+`'end'` event pair internally, so this is a genuinely unexpected-exception path (e.g. a caller-supplied `executeTool` throwing). */
5
+ export interface ModelProxyInternalErrorContext {
6
+ readonly provider: 'anthropic' | 'openai' | 'azure' | 'google' | 'ollama';
7
+ readonly correlationId: string;
8
+ readonly error: unknown;
9
+ }
10
+ export interface ModelProxyHttpDeps {
11
+ /** Host-owned tool execution for the Anthropic proxy route. Omit to stream `tool_use` events without running a server-side tool loop (see module doc). */
12
+ readonly anthropicExecuteTool?: AnthropicToolExecutor;
13
+ /** Host-owned tool execution for the OpenAI proxy route. Same default-unset behavior as `anthropicExecuteTool`. */
14
+ readonly openaiExecuteTool?: OpenAiToolExecutor;
15
+ /** Host-owned tool execution for the Azure OpenAI proxy route. Same default-unset behavior as `anthropicExecuteTool`. */
16
+ readonly azureExecuteTool?: AzureToolExecutor;
17
+ /** Host-owned tool execution for the Google (Gemini) proxy route. Same default-unset behavior as `anthropicExecuteTool`. */
18
+ readonly googleExecuteTool?: GoogleToolExecutor;
19
+ /** Host-owned tool execution for the Ollama proxy route. Same default-unset behavior as `anthropicExecuteTool`. */
20
+ readonly ollamaExecuteTool?: OllamaToolExecutor;
21
+ /** Host-owned sink for the real exception behind a generic internal-error SSE event (SEC-005). Defaults to `console.error`. */
22
+ readonly onInternalError?: (context: ModelProxyInternalErrorContext) => void;
23
+ /**
24
+ * Injectable HTTP transport, forwarded verbatim to every provider turn-runner as its own
25
+ * `fetchImpl` option (`@jini-ai/agent-runtime`'s `AnthropicTurnOptions.fetchImpl`, etc.), which
26
+ * itself defaults to that package's SSRF-guarded, DNS-pinned `pinnedFetch`. This is the
27
+ * dependency-injection seam `__tests__/model-proxy.test.ts` uses to supply a fake transport
28
+ * directly, instead of module-mocking `@jini-ai/agent-runtime`'s `connection-guard.ts` (or, worse,
29
+ * its compiled `dist/` output, since this package only ever imports that package's single public
30
+ * barrel). Defaults to unset, i.e. every route keeps using the real, guarded transport — **never
31
+ * set this in production wiring**; doing so bypasses the SSRF guard entirely for whatever
32
+ * transport is supplied.
33
+ */
34
+ readonly fetchImpl?: PinnedFetch;
35
+ /**
36
+ * Injectable DNS resolver, forwarded verbatim to every provider turn-runner as its own
37
+ * `dnsLookup` option, which itself defaults to `@jini-ai/agent-runtime`'s `node:dns`-backed
38
+ * `defaultDnsLookup`. Same test-only override rationale as `fetchImpl` — pairs with it so a test
39
+ * never needs to mock `node:dns` either.
40
+ */
41
+ readonly dnsLookup?: DnsLookupFn;
42
+ }
43
+ /** Mounts `POST /api/proxy/{anthropic,openai,azure,google,ollama}/stream` and the generic `POST /api/proxy/:provider/stream` catch-all. */
44
+ export declare function registerModelProxyRoutes(app: Express, deps: ModelProxyHttpDeps, adapter: AdapterContext): void;
45
+ //# sourceMappingURL=model-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-proxy.d.ts","sourceRoot":"","sources":["../src/model-proxy.ts"],"names":[],"mappings":"AAqFA,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AAC1D,OAAO,EASL,KAAK,qBAAqB,EAM1B,KAAK,iBAAiB,EAMtB,KAAK,kBAAkB,EAMvB,KAAK,kBAAkB,EAMvB,KAAK,kBAAkB,EAGvB,KAAK,WAAW,EAChB,KAAK,WAAW,EACjB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAUnD,obAAob;AACpb,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC1E,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAOD,MAAM,WAAW,kBAAkB;IACjC,0JAA0J;IAC1J,QAAQ,CAAC,oBAAoB,CAAC,EAAE,qBAAqB,CAAC;IACtD,mHAAmH;IACnH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;IAChD,yHAAyH;IACzH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;IAC9C,4HAA4H;IAC5H,QAAQ,CAAC,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;IAChD,mHAAmH;IACnH,QAAQ,CAAC,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;IAChD,+HAA+H;IAC/H,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,8BAA8B,KAAK,IAAI,CAAC;IAC7E;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;IACjC;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;CAClC;AAkhBD,2IAA2I;AAC3I,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAyJ9G"}