@undefineds.co/linx 0.2.17 → 0.2.18

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 (117) hide show
  1. package/README.md +3 -6
  2. package/dist/generated/version.js +1 -1
  3. package/dist/generated/version.js.map +1 -1
  4. package/dist/index.js +256 -143
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/account-api.js +1 -1
  7. package/dist/lib/account-api.js.map +1 -1
  8. package/dist/lib/account-session.js +1 -1
  9. package/dist/lib/account-session.js.map +1 -1
  10. package/dist/lib/ai-command.js +186 -367
  11. package/dist/lib/ai-command.js.map +1 -1
  12. package/dist/lib/chat-api.js +177 -19
  13. package/dist/lib/chat-api.js.map +1 -1
  14. package/dist/lib/codex-plugin/bridge.js.map +1 -1
  15. package/dist/lib/codex-plugin/codex-native-proxy.js.map +1 -1
  16. package/dist/lib/codex-plugin/index.js.map +1 -1
  17. package/dist/lib/codex-plugin/runner.js.map +1 -1
  18. package/dist/lib/credentials-store.js +7 -1
  19. package/dist/lib/credentials-store.js.map +1 -1
  20. package/dist/lib/default-model.js +1 -0
  21. package/dist/lib/default-model.js.map +1 -1
  22. package/dist/lib/login-command.js +33 -10
  23. package/dist/lib/login-command.js.map +1 -1
  24. package/dist/lib/models.js +2 -27
  25. package/dist/lib/models.js.map +1 -1
  26. package/dist/lib/node-warning-filter.js +34 -0
  27. package/dist/lib/node-warning-filter.js.map +1 -0
  28. package/dist/lib/oidc-auth.js +130 -18
  29. package/dist/lib/oidc-auth.js.map +1 -1
  30. package/dist/lib/oidc-session-storage.js.map +1 -1
  31. package/dist/lib/pi-adapter/auth.js +47 -11
  32. package/dist/lib/pi-adapter/auth.js.map +1 -1
  33. package/dist/lib/pi-adapter/branding.js +764 -76
  34. package/dist/lib/pi-adapter/branding.js.map +1 -1
  35. package/dist/lib/pi-adapter/index.js.map +1 -1
  36. package/dist/lib/pi-adapter/interactive.js +179 -5
  37. package/dist/lib/pi-adapter/interactive.js.map +1 -1
  38. package/dist/lib/pi-adapter/pod-approval.js +8 -0
  39. package/dist/lib/pi-adapter/pod-approval.js.map +1 -0
  40. package/dist/lib/pi-adapter/pod-mirror-mapping.js +189 -0
  41. package/dist/lib/pi-adapter/pod-mirror-mapping.js.map +1 -0
  42. package/dist/lib/pi-adapter/pod-mirror.js +416 -0
  43. package/dist/lib/pi-adapter/pod-mirror.js.map +1 -0
  44. package/dist/lib/pi-adapter/pod-tools.js +104 -0
  45. package/dist/lib/pi-adapter/pod-tools.js.map +1 -0
  46. package/dist/lib/pi-adapter/runtime.js +327 -28
  47. package/dist/lib/pi-adapter/runtime.js.map +1 -1
  48. package/dist/lib/pi-adapter/session.js +608 -0
  49. package/dist/lib/pi-adapter/session.js.map +1 -0
  50. package/dist/lib/pi-adapter/stream.js +154 -4
  51. package/dist/lib/pi-adapter/stream.js.map +1 -1
  52. package/dist/lib/pi-adapter/theme.js.map +1 -1
  53. package/dist/lib/pi-adapter/web-fetch.js +154 -0
  54. package/dist/lib/pi-adapter/web-fetch.js.map +1 -0
  55. package/dist/lib/pod-chat-store.js +40 -30
  56. package/dist/lib/pod-chat-store.js.map +1 -1
  57. package/dist/lib/pod-data-session.js +110 -0
  58. package/dist/lib/pod-data-session.js.map +1 -0
  59. package/dist/lib/profile-identity.js +16 -60
  60. package/dist/lib/profile-identity.js.map +1 -1
  61. package/dist/lib/prompt.js.map +1 -1
  62. package/dist/lib/runtime-target.js +1 -1
  63. package/dist/lib/runtime-target.js.map +1 -1
  64. package/dist/lib/solid-auth.js.map +1 -1
  65. package/dist/lib/thread-utils.js.map +1 -1
  66. package/dist/lib/watch/archive.js +1 -1
  67. package/dist/lib/watch/archive.js.map +1 -1
  68. package/dist/lib/watch/auth.js +1 -1
  69. package/dist/lib/watch/auth.js.map +1 -1
  70. package/dist/lib/watch/codex-composer.js.map +1 -1
  71. package/dist/lib/watch/codex-footer.js.map +1 -1
  72. package/dist/lib/watch/codex-overlay.js.map +1 -1
  73. package/dist/lib/watch/codex-request-form.js +1 -1
  74. package/dist/lib/watch/codex-request-form.js.map +1 -1
  75. package/dist/lib/watch/codex-request-input.js.map +1 -1
  76. package/dist/lib/watch/display.js.map +1 -1
  77. package/dist/lib/watch/format.js.map +1 -1
  78. package/dist/lib/watch/hooks/claude.js +4 -0
  79. package/dist/lib/watch/hooks/claude.js.map +1 -1
  80. package/dist/lib/watch/hooks/codebuddy.js +4 -0
  81. package/dist/lib/watch/hooks/codebuddy.js.map +1 -1
  82. package/dist/lib/watch/hooks/codex.js +4 -0
  83. package/dist/lib/watch/hooks/codex.js.map +1 -1
  84. package/dist/lib/watch/hooks/index.js.map +1 -1
  85. package/dist/lib/watch/hooks/shared.js +0 -1
  86. package/dist/lib/watch/hooks/shared.js.map +1 -1
  87. package/dist/lib/watch/index.js.map +1 -1
  88. package/dist/lib/watch/pod-ai.js +29 -37
  89. package/dist/lib/watch/pod-ai.js.map +1 -1
  90. package/dist/lib/watch/pod-approval.js +822 -220
  91. package/dist/lib/watch/pod-approval.js.map +1 -1
  92. package/dist/lib/watch/pod-persistence.js +214 -106
  93. package/dist/lib/watch/pod-persistence.js.map +1 -1
  94. package/dist/lib/watch/runner.js +243 -38
  95. package/dist/lib/watch/runner.js.map +1 -1
  96. package/dist/lib/watch/secretary.js +238 -0
  97. package/dist/lib/watch/secretary.js.map +1 -0
  98. package/dist/lib/watch/types.js.map +1 -1
  99. package/dist/watch-cli.js +8 -34
  100. package/dist/watch-cli.js.map +1 -1
  101. package/package.json +3 -9
  102. package/vendor/agent-runtime/dist/acp.d.ts +27 -0
  103. package/vendor/agent-runtime/dist/acp.js +86 -0
  104. package/vendor/agent-runtime/dist/companion-model.d.ts +7 -0
  105. package/vendor/agent-runtime/dist/companion-model.js +12 -0
  106. package/vendor/agent-runtime/dist/index.d.ts +3 -0
  107. package/vendor/agent-runtime/dist/index.js +3 -0
  108. package/vendor/agent-runtime/dist/turn-controller.d.ts +69 -0
  109. package/vendor/agent-runtime/dist/turn-controller.js +129 -0
  110. package/vendor/agent-runtime/package.json +11 -0
  111. package/vendor/client/dist/client/index.d.ts +0 -118
  112. package/vendor/client/dist/client/index.js +0 -260
  113. package/vendor/client/dist/index.d.ts +0 -1
  114. package/vendor/client/dist/index.js +0 -1
  115. package/vendor/client/dist/watch/index.d.ts +0 -226
  116. package/vendor/client/dist/watch/index.js +0 -1114
  117. package/vendor/client/package.json +0 -9
@@ -0,0 +1,416 @@
1
+ import { DEFAULT_LINX_CLOUD_MODEL_ID } from '../default-model.js';
2
+ import { getDefaultPodDataSession } from '../pod-data-session.js';
3
+ import { agentTable, auditResource, chatTable, drizzle, initSolidTables, messageTable, sessionTable, solidSchema, threadTable, } from '../models.js';
4
+ export { buildPodMessageRow } from './pod-mirror-mapping.js';
5
+ import { DEFAULT_SECRETARY_CHAT_ID, PI_AGENT_ID, buildPodMessageRow as buildPodMessageRowFromMapping, buildThreadTitle, buildToolAuditId, calculateTokenUsage, pathToWorkspaceUri, } from './pod-mirror-mapping.js';
6
+ const PI_POLICY_VERSION = 'linx-pi-pod-mirror/v1';
7
+ export class LinxPiPodMirror {
8
+ options;
9
+ contextPromise = null;
10
+ queue = Promise.resolve();
11
+ seenMessageIds = new Set();
12
+ messageResourceUrls = new Set();
13
+ runtimePromise;
14
+ closed = false;
15
+ constructor(options) {
16
+ this.options = options;
17
+ this.runtimePromise = createDefaultRuntime(options.runtime);
18
+ }
19
+ handleEvent(event) {
20
+ if (this.closed || !isRecord(event)) {
21
+ return;
22
+ }
23
+ if (event.type === 'message_end') {
24
+ this.enqueue(async () => {
25
+ const message = event.message;
26
+ const entry = this.resolveLatestEntryForMessage(message);
27
+ if (!entry || this.seenMessageIds.has(entry.id)) {
28
+ return;
29
+ }
30
+ this.seenMessageIds.add(entry.id);
31
+ await this.persistEntry(entry);
32
+ });
33
+ return;
34
+ }
35
+ if (event.type === 'tool_execution_start') {
36
+ this.enqueue(() => this.persistToolAudit('tool_execution_started', event));
37
+ return;
38
+ }
39
+ if (event.type === 'tool_execution_end') {
40
+ this.enqueue(() => this.persistToolAudit(event.isError ? 'tool_execution_failed' : 'tool_execution_completed', event));
41
+ return;
42
+ }
43
+ if (event.type === 'agent_end') {
44
+ this.enqueue(() => this.persistUnseenMessageEntries());
45
+ }
46
+ }
47
+ async flush() {
48
+ await this.queue;
49
+ }
50
+ async close() {
51
+ if (this.closed) {
52
+ return;
53
+ }
54
+ this.closed = true;
55
+ this.enqueue(async () => {
56
+ const context = await this.getContext();
57
+ if (!context) {
58
+ return;
59
+ }
60
+ await persistRuntimeSession(context, this.options, resolvePiResourceRefs(context, this.options), 'completed', this.messageResourceUrls);
61
+ });
62
+ await this.queue;
63
+ }
64
+ enqueue(task) {
65
+ this.queue = this.queue
66
+ .then(task, task)
67
+ .catch((error) => {
68
+ this.options.onError?.(error);
69
+ });
70
+ }
71
+ resolveLatestEntryForMessage(message) {
72
+ if (!message) {
73
+ return null;
74
+ }
75
+ const entries = [...this.options.sessionManager.getEntries()].reverse();
76
+ const timestamp = typeof message.timestamp === 'number'
77
+ ? message.timestamp
78
+ : null;
79
+ for (const entry of entries) {
80
+ if (entry.type !== 'message') {
81
+ continue;
82
+ }
83
+ if (entry.message === message) {
84
+ return entry;
85
+ }
86
+ if (timestamp !== null
87
+ && typeof entry.message.timestamp === 'number'
88
+ && entry.message.timestamp === timestamp
89
+ && entry.message.role === message.role) {
90
+ return entry;
91
+ }
92
+ }
93
+ return null;
94
+ }
95
+ async persistEntry(entry) {
96
+ const context = await this.getContext();
97
+ if (!context || entry.type !== 'message') {
98
+ return;
99
+ }
100
+ const refs = resolvePiResourceRefs(context, this.options);
101
+ await ensurePiConversationRoot(context, this.options, refs);
102
+ await persistRuntimeSession(context, this.options, refs, 'active', this.messageResourceUrls);
103
+ const row = buildPodMessageRowFromMapping(context.webId, this.options, entry);
104
+ if (!row) {
105
+ return;
106
+ }
107
+ const resourceUrl = await persistMessage(context, normalizePodMessageRow(context, row, refs));
108
+ this.messageResourceUrls.add(resourceUrl);
109
+ await persistRuntimeSession(context, this.options, refs, 'active', this.messageResourceUrls);
110
+ await touchPiConversation(context, this.options, refs, row.content);
111
+ }
112
+ async persistUnseenMessageEntries() {
113
+ for (const entry of this.options.sessionManager.getEntries()) {
114
+ if (entry.type !== 'message' || this.seenMessageIds.has(entry.id)) {
115
+ continue;
116
+ }
117
+ this.seenMessageIds.add(entry.id);
118
+ await this.persistEntry(entry);
119
+ }
120
+ }
121
+ async persistToolAudit(action, event) {
122
+ const context = await this.getContext();
123
+ if (!context) {
124
+ return;
125
+ }
126
+ const toolCallId = typeof event.toolCallId === 'string' && event.toolCallId
127
+ ? event.toolCallId
128
+ : crypto.randomUUID();
129
+ const refs = resolvePiResourceRefs(context, this.options);
130
+ await ensurePiConversationRoot(context, this.options, refs);
131
+ await persistRuntimeSession(context, this.options, refs, 'active', this.messageResourceUrls);
132
+ const id = buildToolAuditId(this.options.sessionManager.getSessionId(), toolCallId, action);
133
+ const createdAt = new Date();
134
+ await upsertByLocator(context.db, auditResource, { id, createdAt }, {
135
+ id,
136
+ action,
137
+ actor: refs.agentUri,
138
+ actorRole: 'assistant',
139
+ onBehalfOf: context.webId,
140
+ session: refs.sessionUri,
141
+ entry: refs.threadUri,
142
+ toolCallId,
143
+ ...(typeof event.toolName === 'string' && event.toolName ? { toolName: event.toolName } : {}),
144
+ policyVersion: PI_POLICY_VERSION,
145
+ createdAt,
146
+ }, {
147
+ action,
148
+ actor: refs.agentUri,
149
+ actorRole: 'assistant',
150
+ onBehalfOf: context.webId,
151
+ session: refs.sessionUri,
152
+ entry: refs.threadUri,
153
+ toolCallId,
154
+ ...(typeof event.toolName === 'string' && event.toolName ? { toolName: event.toolName } : {}),
155
+ policyVersion: PI_POLICY_VERSION,
156
+ });
157
+ }
158
+ async getContext() {
159
+ if (!this.contextPromise) {
160
+ this.contextPromise = this.createContext().catch((error) => {
161
+ this.options.onError?.(error);
162
+ return null;
163
+ });
164
+ }
165
+ return this.contextPromise;
166
+ }
167
+ async createContext() {
168
+ const runtime = await this.runtimePromise;
169
+ const session = await runtime.getPodDataSession();
170
+ if (!session) {
171
+ return null;
172
+ }
173
+ const db = runtime.createDb?.(session) ?? createPodMirrorDb(session);
174
+ await initSolidTables(db, [
175
+ chatTable,
176
+ threadTable,
177
+ messageTable,
178
+ sessionTable,
179
+ agentTable,
180
+ auditResource,
181
+ ]).catch((error) => {
182
+ this.options.onError?.(error);
183
+ });
184
+ return {
185
+ db,
186
+ webId: session.webId,
187
+ };
188
+ }
189
+ }
190
+ async function ensurePiConversationRoot(context, options, refs) {
191
+ const now = new Date();
192
+ const threadId = options.sessionManager.getSessionId();
193
+ await upsertByLocator(context.db, chatTable, { id: DEFAULT_SECRETARY_CHAT_ID }, {
194
+ id: DEFAULT_SECRETARY_CHAT_ID,
195
+ title: 'AI Secretary',
196
+ participants: [context.webId, refs.agentUri],
197
+ metadata: {
198
+ kind: 'ai-secretary',
199
+ surface: 'cli',
200
+ agent: refs.agentUri,
201
+ },
202
+ lastActiveAt: now,
203
+ createdAt: now,
204
+ updatedAt: now,
205
+ }, {
206
+ title: 'AI Secretary',
207
+ participants: [context.webId, refs.agentUri],
208
+ metadata: {
209
+ kind: 'ai-secretary',
210
+ surface: 'cli',
211
+ agent: refs.agentUri,
212
+ },
213
+ lastActiveAt: now,
214
+ updatedAt: now,
215
+ });
216
+ await upsertByLocator(context.db, threadTable, { id: threadId, chat: refs.chatUri }, {
217
+ id: threadId,
218
+ chat: refs.chatUri,
219
+ title: buildThreadTitle(options.sessionManager),
220
+ workspace: pathToWorkspaceUri(options.cwd),
221
+ metadata: buildThreadMetadata(options),
222
+ createdAt: getSessionCreatedAt(options.sessionManager),
223
+ updatedAt: now,
224
+ }, {
225
+ title: buildThreadTitle(options.sessionManager),
226
+ workspace: pathToWorkspaceUri(options.cwd),
227
+ metadata: buildThreadMetadata(options),
228
+ updatedAt: now,
229
+ });
230
+ await upsertByLocator(context.db, agentTable, { id: PI_AGENT_ID }, {
231
+ id: PI_AGENT_ID,
232
+ name: 'LinX CLI Assistant',
233
+ provider: 'undefineds',
234
+ model: DEFAULT_LINX_CLOUD_MODEL_ID,
235
+ createdAt: now,
236
+ updatedAt: now,
237
+ }, {
238
+ name: 'LinX CLI Assistant',
239
+ provider: 'undefineds',
240
+ model: DEFAULT_LINX_CLOUD_MODEL_ID,
241
+ updatedAt: now,
242
+ });
243
+ }
244
+ async function persistRuntimeSession(context, options, refs, status = 'active', messageResourceUrls = new Set()) {
245
+ const now = new Date();
246
+ const threadId = options.sessionManager.getSessionId();
247
+ const runtimeSessionId = threadId;
248
+ const createdAt = getSessionCreatedAt(options.sessionManager);
249
+ const metadata = {
250
+ cwd: options.cwd,
251
+ sessionFile: options.sessionManager.getSessionFile(),
252
+ runtime: 'pi',
253
+ runtimeSessionId,
254
+ surface: 'cli',
255
+ threadUri: refs.threadUri,
256
+ messageResources: [...messageResourceUrls],
257
+ };
258
+ const row = {
259
+ id: runtimeSessionId,
260
+ ownerWebId: context.webId,
261
+ chat: refs.chatUri,
262
+ thread: refs.threadUri,
263
+ sessionType: 'direct',
264
+ status,
265
+ tool: 'linx',
266
+ tokenUsage: calculateTokenUsage(options.sessionManager.getEntries()),
267
+ policyVersion: PI_POLICY_VERSION,
268
+ metadata,
269
+ createdAt,
270
+ updatedAt: now,
271
+ };
272
+ await upsertByLocator(context.db, sessionTable, { id: runtimeSessionId, createdAt }, row, {
273
+ status,
274
+ tokenUsage: row.tokenUsage,
275
+ metadata,
276
+ updatedAt: now,
277
+ });
278
+ }
279
+ async function persistMessage(context, row) {
280
+ const insert = {
281
+ id: row.id,
282
+ chat: row.chat,
283
+ thread: row.thread,
284
+ maker: row.maker,
285
+ role: row.role,
286
+ content: row.content,
287
+ ...(row.richContent ? { richContent: row.richContent } : {}),
288
+ status: row.status,
289
+ createdAt: row.createdAt,
290
+ updatedAt: row.updatedAt,
291
+ };
292
+ await upsertByLocator(context.db, messageTable, { id: row.id, chat: row.chat, createdAt: row.createdAt }, insert, {
293
+ maker: row.maker,
294
+ role: row.role,
295
+ content: row.content,
296
+ richContent: row.richContent,
297
+ status: row.status,
298
+ updatedAt: row.updatedAt,
299
+ });
300
+ return context.db.resolveLocatorIri(messageTable, { id: row.id, chat: row.chat, createdAt: row.createdAt }).split('#')[0];
301
+ }
302
+ async function touchPiConversation(context, options, refs, preview) {
303
+ const now = new Date();
304
+ const threadId = options.sessionManager.getSessionId();
305
+ await context.db.updateByLocator(chatTable, { id: DEFAULT_SECRETARY_CHAT_ID }, {
306
+ lastMessagePreview: preview.slice(0, 100),
307
+ lastActiveAt: now,
308
+ updatedAt: now,
309
+ });
310
+ await context.db.updateByLocator(threadTable, { id: threadId, chat: refs.chatUri }, {
311
+ title: buildThreadTitle(options.sessionManager),
312
+ workspace: pathToWorkspaceUri(options.cwd),
313
+ metadata: buildThreadMetadata(options),
314
+ updatedAt: now,
315
+ });
316
+ }
317
+ function createPodMirrorDb(session) {
318
+ const solidSession = session.solidSession ?? {
319
+ info: {
320
+ isLoggedIn: true,
321
+ webId: session.webId,
322
+ },
323
+ fetch: session.fetch,
324
+ logout: async () => { },
325
+ };
326
+ return drizzle(solidSession, {
327
+ logger: false,
328
+ disableInteropDiscovery: true,
329
+ schema: solidSchema,
330
+ });
331
+ }
332
+ function resolvePiResourceRefs(context, options) {
333
+ const sessionId = options.sessionManager.getSessionId();
334
+ const createdAt = getSessionCreatedAt(options.sessionManager);
335
+ const chatUri = context.db.resolveLocatorIri(chatTable, { id: DEFAULT_SECRETARY_CHAT_ID });
336
+ return {
337
+ agentUri: context.db.resolveLocatorIri(agentTable, { id: PI_AGENT_ID }),
338
+ chatUri,
339
+ sessionUri: context.db.resolveLocatorIri(sessionTable, { id: sessionId, createdAt }),
340
+ threadUri: context.db.resolveLocatorIri(threadTable, { id: sessionId, chat: chatUri }),
341
+ };
342
+ }
343
+ function normalizePodMessageRow(context, row, refs) {
344
+ return {
345
+ ...row,
346
+ chat: refs.chatUri,
347
+ thread: refs.threadUri,
348
+ maker: row.role === 'user' ? context.webId : refs.agentUri,
349
+ };
350
+ }
351
+ async function upsertByLocator(db, table, locator, insert, update) {
352
+ const existing = await db.findByLocator(table, locator);
353
+ if (!existing) {
354
+ await db.insert(table).values(insert).execute();
355
+ return;
356
+ }
357
+ await db.updateByLocator(table, locator, update);
358
+ }
359
+ function getSessionCreatedAt(sessionManager) {
360
+ const firstEntryDate = sessionManager.getEntries()
361
+ .map((entry) => toDate(entry.timestamp))
362
+ .find((date) => date instanceof Date);
363
+ if (firstEntryDate) {
364
+ return firstEntryDate;
365
+ }
366
+ return parseTimestampFromUuidLikeId(sessionManager.getSessionId()) ?? new Date();
367
+ }
368
+ function parseTimestampFromUuidLikeId(id) {
369
+ const prefix = id.replace(/-/g, '').slice(0, 12);
370
+ if (!/^[\da-f]{12}$/i.test(prefix)) {
371
+ return null;
372
+ }
373
+ const millis = Number.parseInt(prefix, 16);
374
+ if (!Number.isFinite(millis) || millis <= 0) {
375
+ return null;
376
+ }
377
+ const date = new Date(millis);
378
+ return Number.isNaN(date.getTime()) ? null : date;
379
+ }
380
+ function toDate(value) {
381
+ if (value instanceof Date && !Number.isNaN(value.getTime())) {
382
+ return value;
383
+ }
384
+ if (typeof value === 'number' || typeof value === 'string') {
385
+ const date = new Date(value);
386
+ return Number.isNaN(date.getTime()) ? null : date;
387
+ }
388
+ return null;
389
+ }
390
+ async function createDefaultRuntime(overrides) {
391
+ if (isCompletePodMirrorRuntime(overrides)) {
392
+ return overrides;
393
+ }
394
+ return {
395
+ getPodDataSession: getDefaultPodDataSession,
396
+ ...overrides,
397
+ };
398
+ }
399
+ function isCompletePodMirrorRuntime(runtime) {
400
+ return Boolean(runtime
401
+ && runtime.getPodDataSession);
402
+ }
403
+ function buildThreadMetadata(options) {
404
+ return {
405
+ source: 'linx-cli',
406
+ runtime: 'pi',
407
+ runtimeSessionId: options.sessionManager.getSessionId(),
408
+ surface: 'cli',
409
+ cwd: options.cwd,
410
+ sessionFile: options.sessionManager.getSessionFile(),
411
+ };
412
+ }
413
+ function isRecord(value) {
414
+ return typeof value === 'object' && value !== null;
415
+ }
416
+ //# sourceMappingURL=pod-mirror.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pod-mirror.js","sourceRoot":"","sources":["../../../src/lib/pi-adapter/pod-mirror.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAA;AACjE,OAAO,EAAE,wBAAwB,EAAuB,MAAM,wBAAwB,CAAA;AACtF,OAAO,EACL,UAAU,EACV,aAAa,EACb,SAAS,EACT,OAAO,EACP,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,GAOZ,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EACL,yBAAyB,EACzB,WAAW,EACX,kBAAkB,IAAI,6BAA6B,EACnD,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,yBAAyB,CAAA;AAEhC,MAAM,iBAAiB,GAAG,uBAAuB,CAAA;AA0BjD,MAAM,OAAO,eAAe;IAQG;IAPrB,cAAc,GAA4C,IAAI,CAAA;IAC9D,KAAK,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAA;IAC/B,cAAc,GAAG,IAAI,GAAG,EAAU,CAAA;IAClC,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAA;IACvC,cAAc,CAA2B;IAClD,MAAM,GAAG,KAAK,CAAA;IAEtB,YAA6B,OAA+B;QAA/B,YAAO,GAAP,OAAO,CAAwB;QAC1D,IAAI,CAAC,cAAc,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7D,CAAC;IAED,WAAW,CAAC,KAAc;QACxB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpC,OAAM;QACR,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACjC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;gBACtB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAmC,CAAA;gBACzD,MAAM,KAAK,GAAG,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAA;gBACxD,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;oBAChD,OAAM;gBACR,CAAC;gBACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;gBACjC,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;YAChC,CAAC,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC,CAAA;YAC1E,OAAM;QACR,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CACtC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,0BAA0B,EACpE,KAAK,CACN,CAAC,CAAA;YACF,OAAM;QACR,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC,CAAA;QACxD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,KAAK,CAAA;IAClB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAM;QACR,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YACtB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;YACvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAM;YACR,CAAC;YAED,MAAM,qBAAqB,CACzB,OAAO,EACP,IAAI,CAAC,OAAO,EACZ,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,EAC5C,WAAW,EACX,IAAI,CAAC,mBAAmB,CACzB,CAAA;QACH,CAAC,CAAC,CAAA;QACF,MAAM,IAAI,CAAC,KAAK,CAAA;IAClB,CAAC;IAEO,OAAO,CAAC,IAAyB;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;aACpB,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;aAChB,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;QAC/B,CAAC,CAAC,CAAA;IACN,CAAC;IAEO,4BAA4B,CAAC,OAAiC;QACpE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAA;QACvE,MAAM,SAAS,GAAG,OAAQ,OAAmC,CAAC,SAAS,KAAK,QAAQ;YAClF,CAAC,CAAE,OAAiC,CAAC,SAAS;YAC9C,CAAC,CAAC,IAAI,CAAA;QACR,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC7B,SAAQ;YACV,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBAC9B,OAAO,KAAK,CAAA;YACd,CAAC;YACD,IACE,SAAS,KAAK,IAAI;mBACf,OAAQ,KAAK,CAAC,OAAmC,CAAC,SAAS,KAAK,QAAQ;mBACvE,KAAK,CAAC,OAAiC,CAAC,SAAS,KAAK,SAAS;mBAC/D,KAAK,CAAC,OAA8B,CAAC,IAAI,KAAM,OAA8B,CAAC,IAAI,EACtF,CAAC;gBACD,OAAO,KAAK,CAAA;YACd,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,KAAmB;QAC5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACvC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACzC,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QACzD,MAAM,wBAAwB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QAC3D,MAAM,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAE5F,MAAM,GAAG,GAAG,6BAA6B,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC7E,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAM;QACR,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,sBAAsB,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;QAC7F,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACzC,MAAM,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAC5F,MAAM,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACrE,CAAC;IAEO,KAAK,CAAC,2BAA2B;QACvC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC;YAC7D,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;gBAClE,SAAQ;YACV,CAAC;YACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YACjC,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,KAA8B;QAC3E,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QACvC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAM;QACR,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU;YACzE,CAAC,CAAC,KAAK,CAAC,UAAU;YAClB,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAA;QACvB,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QACzD,MAAM,wBAAwB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QAC3D,MAAM,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAE5F,MAAM,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,CAAA;QAC3F,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAA;QAC5B,MAAM,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;YAClE,EAAE;YACF,MAAM;YACN,KAAK,EAAE,IAAI,CAAC,QAAQ;YACpB,SAAS,EAAE,WAAW;YACtB,UAAU,EAAE,OAAO,CAAC,KAAK;YACzB,OAAO,EAAE,IAAI,CAAC,UAAU;YACxB,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,UAAU;YACV,GAAG,CAAC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7F,aAAa,EAAE,iBAAiB;YAChC,SAAS;SACY,EAAE;YACvB,MAAM;YACN,KAAK,EAAE,IAAI,CAAC,QAAQ;YACpB,SAAS,EAAE,WAAW;YACtB,UAAU,EAAE,OAAO,CAAC,KAAK;YACzB,OAAO,EAAE,IAAI,CAAC,UAAU;YACxB,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,UAAU;YACV,GAAG,CAAC,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7F,aAAa,EAAE,iBAAiB;SACjC,CAAC,CAAA;IACJ,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACzD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;gBAC7B,OAAO,IAAI,CAAA;YACb,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,cAAc,CAAA;IAC5B,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAA;QACzC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAA;QACjD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAA;QACb,CAAC;QAED,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAA;QACpE,MAAM,eAAe,CAAC,EAAE,EAAE;YACxB,SAAS;YACT,WAAW;YACX,YAAY;YACZ,YAAY;YACZ,UAAU;YACV,aAAa;SACd,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;QAC/B,CAAC,CAAC,CAAA;QAEF,OAAO;YACL,EAAE;YACF,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAA;IACH,CAAC;CACF;AAED,KAAK,UAAU,wBAAwB,CACrC,OAAyB,EACzB,OAA+B,EAC/B,IAAoB;IAEpB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,YAAY,EAAE,CAAA;IAEtD,MAAM,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,yBAAyB,EAAE,EAAE;QAC9E,EAAE,EAAE,yBAAyB;QAC7B,KAAK,EAAE,cAAc;QACrB,YAAY,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC;QAC5C,QAAQ,EAAE;YACR,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,CAAC,QAAQ;SACrB;QACD,YAAY,EAAE,GAAG;QACjB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACM,EAAE;QACtB,KAAK,EAAE,cAAc;QACrB,YAAY,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC;QAC5C,QAAQ,EAAE;YACR,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,IAAI,CAAC,QAAQ;SACrB;QACD,YAAY,EAAE,GAAG;QACjB,SAAS,EAAE,GAAG;KACf,CAAC,CAAA;IAEF,MAAM,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE;QACnF,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,IAAI,CAAC,OAAO;QAClB,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,cAAc,CAAC;QAC/C,SAAS,EAAE,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC;QAC1C,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC;QACtC,SAAS,EAAE,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAC;QACtD,SAAS,EAAE,GAAG;KACQ,EAAE;QACxB,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,cAAc,CAAC;QAC/C,SAAS,EAAE,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC;QAC1C,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC;QACtC,SAAS,EAAE,GAAG;KACf,CAAC,CAAA;IAEF,MAAM,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE;QACjE,EAAE,EAAE,WAAW;QACf,IAAI,EAAE,oBAAoB;QAC1B,QAAQ,EAAE,YAAY;QACtB,KAAK,EAAE,2BAA2B;QAClC,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;KACf,EAAE;QACD,IAAI,EAAE,oBAAoB;QAC1B,QAAQ,EAAE,YAAY;QACtB,KAAK,EAAE,2BAA2B;QAClC,SAAS,EAAE,GAAG;KACf,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,OAAyB,EACzB,OAA+B,EAC/B,IAAoB,EACpB,SAAiC,QAAQ,EACzC,sBAAmC,IAAI,GAAG,EAAE;IAE5C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,YAAY,EAAE,CAAA;IACtD,MAAM,gBAAgB,GAAG,QAAQ,CAAA;IACjC,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7D,MAAM,QAAQ,GAAG;QACf,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,WAAW,EAAE,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE;QACpD,OAAO,EAAE,IAAI;QACb,gBAAgB;QAChB,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,gBAAgB,EAAE,CAAC,GAAG,mBAAmB,CAAC;KAC3C,CAAA;IAED,MAAM,GAAG,GAAG;QACV,EAAE,EAAE,gBAAgB;QACpB,UAAU,EAAE,OAAO,CAAC,KAAK;QACzB,IAAI,EAAE,IAAI,CAAC,OAAO;QAClB,MAAM,EAAE,IAAI,CAAC,SAAS;QACtB,WAAW,EAAE,QAAQ;QACrB,MAAM;QACN,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;QACpE,aAAa,EAAE,iBAAiB;QAChC,QAAQ;QACR,SAAS;QACT,SAAS,EAAE,GAAG;KACS,CAAA;IAEzB,MAAM,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE,GAAG,EAAE;QACxF,MAAM;QACN,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,QAAQ;QACR,SAAS,EAAE,GAAG;KACf,CAAC,CAAA;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,OAAyB,EACzB,GAAkE;IAElE,MAAM,MAAM,GAAG;QACb,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,GAAG,CAAC,SAAS;KACD,CAAA;IACzB,MAAM,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE;QAChH,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,SAAS,EAAE,GAAG,CAAC,SAAS;KACzB,CAAC,CAAA;IACF,OAAO,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AAC3H,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,OAAyB,EACzB,OAA+B,EAC/B,IAAoB,EACpB,OAAe;IAEf,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,YAAY,EAAE,CAAA;IACtD,MAAM,OAAO,CAAC,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,yBAAyB,EAAE,EAAE;QAC7E,kBAAkB,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QACzC,YAAY,EAAE,GAAG;QACjB,SAAS,EAAE,GAAG;KACf,CAAC,CAAA;IACF,MAAM,OAAO,CAAC,EAAE,CAAC,eAAe,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE;QAClF,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,cAAc,CAAC;QAC/C,SAAS,EAAE,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC;QAC1C,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC;QACtC,SAAS,EAAE,GAAG;KACf,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAuB;IAChD,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI;QAC3C,IAAI,EAAE;YACJ,UAAU,EAAE,IAAI;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB;QACD,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;KACvB,CAAA;IAED,OAAO,OAAO,CAAC,YAAY,EAAE;QAC3B,MAAM,EAAE,KAAK;QACb,uBAAuB,EAAE,IAAI;QAC7B,MAAM,EAAE,WAAW;KACpB,CAA6B,CAAA;AAChC,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAyB,EAAE,OAA+B;IACvF,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,YAAY,EAAE,CAAA;IACvD,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IAC7D,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,yBAAyB,EAAE,CAAC,CAAA;IAC1F,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC;QACvE,OAAO;QACP,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;QACpF,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;KACvF,CAAA;AACH,CAAC;AAID,SAAS,sBAAsB,CAC7B,OAAyB,EACzB,GAAwB,EACxB,IAAoB;IAEpB,OAAO;QACL,GAAG,GAAG;QACN,IAAI,EAAE,IAAI,CAAC,OAAO;QAClB,MAAM,EAAE,IAAI,CAAC,SAAS;QACtB,KAAK,EAAE,GAAG,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ;KAC3D,CAAA;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,EAAiB,EACjB,KAAwD,EACxD,OAAgC,EAChC,MAA+B,EAC/B,MAA+B;IAE/B,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAA;QAC/C,OAAM;IACR,CAAC;IAED,MAAM,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;AAClD,CAAC;AAED,SAAS,mBAAmB,CAAC,cAA8B;IACzD,MAAM,cAAc,GAAG,cAAc,CAAC,UAAU,EAAE;SAC/C,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAE,KAAiC,CAAC,SAAS,CAAC,CAAC;SACpE,IAAI,CAAC,CAAC,IAAI,EAAgB,EAAE,CAAC,IAAI,YAAY,IAAI,CAAC,CAAA;IACrD,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,OAAO,4BAA4B,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC,IAAI,IAAI,IAAI,EAAE,CAAA;AAClF,CAAC;AAED,SAAS,4BAA4B,CAAC,EAAU;IAC9C,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAChD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAA;IAC7B,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;AACnD,CAAC;AAED,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC5D,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAA;QAC5B,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;IACnD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,SAAgD;IAClF,IAAI,0BAA0B,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1C,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,OAAO;QACL,iBAAiB,EAAE,wBAAwB;QAC3C,GAAG,SAAS;KACb,CAAA;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,OAA8C;IAChF,OAAO,OAAO,CACZ,OAAO;WACJ,OAAO,CAAC,iBAAiB,CAC7B,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,OAA+B;IAC1D,OAAO;QACL,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,IAAI;QACb,gBAAgB,EAAE,OAAO,CAAC,cAAc,CAAC,YAAY,EAAE;QACvD,OAAO,EAAE,KAAK;QACd,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,WAAW,EAAE,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE;KACrD,CAAA;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAA;AACpD,CAAC"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Pod Read/Write tools — LLM-facing tools for Pod filesystem access.
3
+ *
4
+ * These tools provide the LLM with the same familiar read/write interface
5
+ * as local files, but routed through the authenticated Pod HTTP API.
6
+ *
7
+ * The LLM should prefer these over local read/write when the path starts
8
+ * with a Pod root (e.g., /alice/). For local files, use read/write.
9
+ */
10
+ import { Type } from '@sinclair/typebox';
11
+ import { getDefaultPodDataSession } from '../pod-data-session.js';
12
+ // ── Parameter Schemas ──────────────────────────────────────────────────────
13
+ const PodReadParams = Type.Object({
14
+ path: Type.String({ description: 'Pod resource path (e.g., /alice/settings/credentials.ttl)' }),
15
+ });
16
+ const PodWriteParams = Type.Object({
17
+ path: Type.String({ description: 'Pod resource path (e.g., /alice/settings/credentials.ttl)' }),
18
+ content: Type.String({ description: 'Content to write' }),
19
+ contentType: Type.Optional(Type.String({ description: 'Content-Type header. Default: text/turtle for .ttl, text/markdown for .md, application/json for .json' })),
20
+ });
21
+ // ── Content-Type inference ──────────────────────────────────────────────────
22
+ function inferContentType(path) {
23
+ if (path.endsWith('.ttl'))
24
+ return 'text/turtle';
25
+ if (path.endsWith('.md'))
26
+ return 'text/markdown';
27
+ if (path.endsWith('.json'))
28
+ return 'application/json';
29
+ if (path.endsWith('.html'))
30
+ return 'text/html';
31
+ return 'text/plain';
32
+ }
33
+ // ── Tool Definitions ────────────────────────────────────────────────────────
34
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
35
+ export const podReadTool = {
36
+ name: 'pod_read',
37
+ label: 'Pod Read',
38
+ description: [
39
+ 'Read a file from the user\'s Pod. Use this for any path under the Pod root (e.g., /alice/...).',
40
+ 'For local files, use the regular read tool instead.',
41
+ ].join('\n'),
42
+ parameters: PodReadParams,
43
+ async execute(_callId, params) {
44
+ const path = params.path.trim();
45
+ if (!path)
46
+ return { content: [{ type: 'text', text: 'Error: path is required' }], isError: true };
47
+ const pod = await getDefaultPodDataSession();
48
+ if (!pod)
49
+ return { content: [{ type: 'text', text: 'Error: not connected to Pod' }], isError: true };
50
+ try {
51
+ const res = await pod.fetch(path);
52
+ if (!res.ok) {
53
+ const body = await res.text().catch(() => '');
54
+ return { content: [{ type: 'text', text: `Pod read failed: HTTP ${res.status} — ${body.slice(0, 500)}` }], isError: true };
55
+ }
56
+ const text = await res.text();
57
+ return { content: [{ type: 'text', text }] };
58
+ }
59
+ catch (e) {
60
+ return { content: [{ type: 'text', text: `Pod read error: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
61
+ }
62
+ },
63
+ };
64
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
65
+ export const podWriteTool = {
66
+ name: 'pod_write',
67
+ label: 'Pod Write',
68
+ description: [
69
+ 'Write content to a file in the user\'s Pod. Use this for any path under the Pod root (e.g., /alice/...).',
70
+ 'Content-Type is inferred from the file extension (.ttl → text/turtle, .md → text/markdown, .json → application/json).',
71
+ 'For local files, use the regular write tool instead.',
72
+ ].join('\n'),
73
+ parameters: PodWriteParams,
74
+ async execute(_callId, params) {
75
+ const path = params.path.trim();
76
+ if (!path)
77
+ return { content: [{ type: 'text', text: 'Error: path is required' }], isError: true };
78
+ const pod = await getDefaultPodDataSession();
79
+ if (!pod)
80
+ return { content: [{ type: 'text', text: 'Error: not connected to Pod' }], isError: true };
81
+ const ct = params.contentType?.trim() || inferContentType(path);
82
+ try {
83
+ const res = await pod.fetch(path, {
84
+ method: 'PUT',
85
+ headers: { 'Content-Type': ct },
86
+ body: params.content,
87
+ });
88
+ if (!res.ok) {
89
+ const body = await res.text().catch(() => '');
90
+ return { content: [{ type: 'text', text: `Pod write failed: HTTP ${res.status} — ${body.slice(0, 500)}` }], isError: true };
91
+ }
92
+ return { content: [{ type: 'text', text: `Written: ${path}` }] };
93
+ }
94
+ catch (e) {
95
+ return { content: [{ type: 'text', text: `Pod write error: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
96
+ }
97
+ },
98
+ };
99
+ // ── Pi Extension ────────────────────────────────────────────────────────────
100
+ export default function (pi) {
101
+ pi.registerTool(podReadTool);
102
+ pi.registerTool(podWriteTool);
103
+ }
104
+ //# sourceMappingURL=pod-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pod-tools.js","sourceRoot":"","sources":["../../../src/lib/pi-adapter/pod-tools.ts"],"names":[],"mappings":"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"}