@undefineds.co/linx 0.2.19 → 0.2.24
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.
- package/README.md +23 -21
- package/dist/index.js +93 -142
- package/dist/index.js.map +1 -1
- package/dist/lib/ai-command.js +34 -30
- package/dist/lib/ai-command.js.map +1 -1
- package/dist/lib/auto-mode/archive.js +235 -0
- package/dist/lib/auto-mode/archive.js.map +1 -0
- package/dist/lib/{watch → auto-mode}/auth.js +6 -6
- package/dist/lib/auto-mode/auth.js.map +1 -0
- package/dist/lib/{watch → auto-mode}/codex-composer.js +1 -1
- package/dist/lib/auto-mode/codex-composer.js.map +1 -0
- package/dist/lib/auto-mode/codex-footer.js.map +1 -0
- package/dist/lib/auto-mode/codex-overlay.js.map +1 -0
- package/dist/lib/{watch → auto-mode}/codex-request-form.js +2 -2
- package/dist/lib/auto-mode/codex-request-form.js.map +1 -0
- package/dist/lib/auto-mode/codex-request-input.js.map +1 -0
- package/dist/lib/{watch → auto-mode}/display.js +63 -57
- package/dist/lib/auto-mode/display.js.map +1 -0
- package/dist/lib/{watch → auto-mode}/format.js +24 -16
- package/dist/lib/auto-mode/format.js.map +1 -0
- package/dist/lib/{watch → auto-mode}/hooks/claude.js +3 -2
- package/dist/lib/auto-mode/hooks/claude.js.map +1 -0
- package/dist/lib/{watch → auto-mode}/hooks/codebuddy.js +3 -2
- package/dist/lib/auto-mode/hooks/codebuddy.js.map +1 -0
- package/dist/lib/auto-mode/hooks/codex.js +18 -0
- package/dist/lib/auto-mode/hooks/codex.js.map +1 -0
- package/dist/lib/auto-mode/hooks/index.js +27 -0
- package/dist/lib/auto-mode/hooks/index.js.map +1 -0
- package/dist/lib/auto-mode/hooks/shared.js.map +1 -0
- package/dist/lib/auto-mode/index.js.map +1 -0
- package/dist/lib/auto-mode/pod-ai.js +116 -0
- package/dist/lib/auto-mode/pod-ai.js.map +1 -0
- package/dist/lib/{watch → auto-mode}/pod-approval.js +495 -325
- package/dist/lib/auto-mode/pod-approval.js.map +1 -0
- package/dist/lib/auto-mode/pod-persistence.js +412 -0
- package/dist/lib/auto-mode/pod-persistence.js.map +1 -0
- package/dist/lib/{watch → auto-mode}/runner.js +280 -193
- package/dist/lib/auto-mode/runner.js.map +1 -0
- package/dist/lib/{watch → auto-mode}/secretary.js +8 -8
- package/dist/lib/auto-mode/secretary.js.map +1 -0
- package/dist/lib/{watch → auto-mode}/types.js.map +1 -1
- package/dist/lib/auto-mode-command.js +114 -0
- package/dist/lib/auto-mode-command.js.map +1 -0
- package/dist/lib/codex-plugin/bridge.js +11 -12
- package/dist/lib/codex-plugin/bridge.js.map +1 -1
- package/dist/lib/codex-plugin/codex-native-proxy.js +11 -12
- package/dist/lib/codex-plugin/codex-native-proxy.js.map +1 -1
- package/dist/lib/linx-tui-contract.js +26 -0
- package/dist/lib/linx-tui-contract.js.map +1 -0
- package/dist/lib/login-command.js +9 -3
- package/dist/lib/login-command.js.map +1 -1
- package/dist/lib/models.js +2 -2
- package/dist/lib/models.js.map +1 -1
- package/dist/lib/oidc-auth.js +83 -104
- package/dist/lib/oidc-auth.js.map +1 -1
- package/dist/lib/oidc-session-storage.js +7 -1
- package/dist/lib/oidc-session-storage.js.map +1 -1
- package/dist/lib/pi-adapter/auth.js +9 -15
- package/dist/lib/pi-adapter/auth.js.map +1 -1
- package/dist/lib/pi-adapter/branding.js +14 -44
- package/dist/lib/pi-adapter/branding.js.map +1 -1
- package/dist/lib/pi-adapter/interactive.js +19 -23
- package/dist/lib/pi-adapter/interactive.js.map +1 -1
- package/dist/lib/pi-adapter/pod-approval.js +239 -1
- package/dist/lib/pi-adapter/pod-approval.js.map +1 -1
- package/dist/lib/pi-adapter/pod-mirror.js +64 -59
- package/dist/lib/pi-adapter/pod-mirror.js.map +1 -1
- package/dist/lib/pi-adapter/pod-native.js +479 -0
- package/dist/lib/pi-adapter/pod-native.js.map +1 -0
- package/dist/lib/pi-adapter/pod-tools.js +76 -40
- package/dist/lib/pi-adapter/pod-tools.js.map +1 -1
- package/dist/lib/pi-adapter/runtime.js +11 -66
- package/dist/lib/pi-adapter/runtime.js.map +1 -1
- package/dist/lib/pi-adapter/session.js +276 -33
- package/dist/lib/pi-adapter/session.js.map +1 -1
- package/dist/lib/pi-adapter/stream.js.map +1 -1
- package/dist/lib/pi-adapter/web-fetch.js +47 -30
- package/dist/lib/pi-adapter/web-fetch.js.map +1 -1
- package/dist/lib/pod-chat-store.js +36 -38
- package/dist/lib/pod-chat-store.js.map +1 -1
- package/dist/lib/pod-data-session.js +97 -30
- package/dist/lib/pod-data-session.js.map +1 -1
- package/package.json +3 -3
- package/vendor/agent-runtime/dist/auto-mode.d.ts +287 -0
- package/vendor/agent-runtime/dist/auto-mode.js +1498 -0
- package/vendor/agent-runtime/dist/index.d.ts +2 -0
- package/vendor/agent-runtime/dist/index.js +2 -0
- package/vendor/agent-runtime/dist/runtime.d.ts +47 -0
- package/vendor/agent-runtime/dist/runtime.js +36 -0
- package/vendor/agent-runtime/dist/turn-controller.d.ts +4 -4
- package/vendor/agent-runtime/dist/turn-controller.js +7 -7
- package/vendor/agent-runtime/package.json +2 -0
- package/dist/lib/watch/archive.js +0 -110
- package/dist/lib/watch/archive.js.map +0 -1
- package/dist/lib/watch/auth.js.map +0 -1
- package/dist/lib/watch/codex-composer.js.map +0 -1
- package/dist/lib/watch/codex-footer.js.map +0 -1
- package/dist/lib/watch/codex-overlay.js.map +0 -1
- package/dist/lib/watch/codex-request-form.js.map +0 -1
- package/dist/lib/watch/codex-request-input.js.map +0 -1
- package/dist/lib/watch/display.js.map +0 -1
- package/dist/lib/watch/format.js.map +0 -1
- package/dist/lib/watch/hooks/claude.js.map +0 -1
- package/dist/lib/watch/hooks/codebuddy.js.map +0 -1
- package/dist/lib/watch/hooks/codex.js +0 -17
- package/dist/lib/watch/hooks/codex.js.map +0 -1
- package/dist/lib/watch/hooks/index.js +0 -24
- package/dist/lib/watch/hooks/index.js.map +0 -1
- package/dist/lib/watch/hooks/shared.js.map +0 -1
- package/dist/lib/watch/index.js.map +0 -1
- package/dist/lib/watch/pod-ai.js +0 -160
- package/dist/lib/watch/pod-ai.js.map +0 -1
- package/dist/lib/watch/pod-approval.js.map +0 -1
- package/dist/lib/watch/pod-persistence.js +0 -334
- package/dist/lib/watch/pod-persistence.js.map +0 -1
- package/dist/lib/watch/runner.js.map +0 -1
- package/dist/lib/watch/secretary.js.map +0 -1
- package/dist/watch-cli.js +0 -116
- package/dist/watch-cli.js.map +0 -1
- /package/dist/lib/{watch → auto-mode}/codex-footer.js +0 -0
- /package/dist/lib/{watch → auto-mode}/codex-overlay.js +0 -0
- /package/dist/lib/{watch → auto-mode}/codex-request-input.js +0 -0
- /package/dist/lib/{watch → auto-mode}/hooks/shared.js +0 -0
- /package/dist/lib/{watch → auto-mode}/index.js +0 -0
- /package/dist/lib/{watch → auto-mode}/types.js +0 -0
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
import { Parser, Writer } from 'n3';
|
|
2
|
+
export const RDF_TYPE = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type';
|
|
3
|
+
export const XSD_DATE_TIME = 'http://www.w3.org/2001/XMLSchema#dateTime';
|
|
4
|
+
export const DCT_CREATED = 'http://purl.org/dc/terms/created';
|
|
5
|
+
export const DCT_MODIFIED = 'http://purl.org/dc/terms/modified';
|
|
6
|
+
export const DCT_TITLE = 'http://purl.org/dc/terms/title';
|
|
7
|
+
export const FOAF_MAKER = 'http://xmlns.com/foaf/0.1/maker';
|
|
8
|
+
export const SIOC_CONTENT = 'http://rdfs.org/sioc/ns#content';
|
|
9
|
+
export const SIOC_RICH_CONTENT = 'http://rdfs.org/sioc/ns#richContent';
|
|
10
|
+
export const SIOC_HAS_MEMBER = 'http://rdfs.org/sioc/ns#has_member';
|
|
11
|
+
export const MEETING_LONG_CHAT = 'http://www.w3.org/ns/pim/meeting#LongChat';
|
|
12
|
+
export const MEETING_MESSAGE = 'http://www.w3.org/ns/pim/meeting#Message';
|
|
13
|
+
export const SIOC_THREAD = 'http://rdfs.org/sioc/ns#Thread';
|
|
14
|
+
export const WF_MESSAGE = 'http://www.w3.org/2005/01/wf/flow-1.0#message';
|
|
15
|
+
export const UDFS_AGENT = 'https://undefineds.co/ns#Agent';
|
|
16
|
+
export const UDFS_AUDIT_ENTRY = 'https://undefineds.co/ns#AuditEntry';
|
|
17
|
+
export const UDFS_APPROVAL_REQUEST = 'https://undefineds.co/ns#ApprovalRequest';
|
|
18
|
+
export const UDFS_AUTONOMY_GRANT = 'https://undefineds.co/ns#AutonomyGrant';
|
|
19
|
+
export const UDFS_SESSION = 'https://undefineds.co/ns#Session';
|
|
20
|
+
export const UDFS_ACTION = 'https://undefineds.co/ns#action';
|
|
21
|
+
export const UDFS_ACTOR = 'https://undefineds.co/ns#actor';
|
|
22
|
+
export const UDFS_ACTOR_ROLE = 'https://undefineds.co/ns#actorRole';
|
|
23
|
+
export const UDFS_APPROVAL = 'https://undefineds.co/ns#approval';
|
|
24
|
+
export const UDFS_CHAT_TYPE = 'https://undefineds.co/ns#chatType';
|
|
25
|
+
export const UDFS_CONTEXT = 'https://undefineds.co/ns#context';
|
|
26
|
+
export const UDFS_ENTRY = 'https://undefineds.co/ns#entry';
|
|
27
|
+
export const UDFS_CONVERSATION = 'https://undefineds.co/ns#conversation';
|
|
28
|
+
export const UDFS_CONVERSATION_TITLE = 'https://undefineds.co/ns#conversationTitle';
|
|
29
|
+
export const UDFS_CONVERSATION_TYPE = 'https://undefineds.co/ns#conversationType';
|
|
30
|
+
export const UDFS_HAS_THREAD = 'https://undefineds.co/ns#hasThread';
|
|
31
|
+
export const UDFS_IN_THREAD = 'https://undefineds.co/ns#inThread';
|
|
32
|
+
export const UDFS_LAST_ACTIVE_AT = 'https://undefineds.co/ns#lastActiveAt';
|
|
33
|
+
export const UDFS_MESSAGE_STATUS = 'https://undefineds.co/ns#messageStatus';
|
|
34
|
+
export const UDFS_MESSAGE_TYPE = 'https://undefineds.co/ns#messageType';
|
|
35
|
+
export const UDFS_METADATA = 'https://undefineds.co/ns#metadata';
|
|
36
|
+
export const UDFS_MODEL = 'https://undefineds.co/ns#model';
|
|
37
|
+
export const UDFS_ON_BEHALF_OF = 'https://undefineds.co/ns#onBehalfOf';
|
|
38
|
+
export const UDFS_ASSIGNED_TO = 'https://undefineds.co/ns#assignedTo';
|
|
39
|
+
export const UDFS_DECISION_BY = 'https://undefineds.co/ns#decisionBy';
|
|
40
|
+
export const UDFS_DECISION_ROLE = 'https://undefineds.co/ns#decisionRole';
|
|
41
|
+
export const UDFS_EFFECT = 'https://undefineds.co/ns#effect';
|
|
42
|
+
export const UDFS_POLICY_VERSION = 'https://undefineds.co/ns#policyVersion';
|
|
43
|
+
export const UDFS_PROVIDER = 'https://undefineds.co/ns#provider';
|
|
44
|
+
export const UDFS_REASON = 'https://undefineds.co/ns#reason';
|
|
45
|
+
export const UDFS_RESOLVED_AT = 'https://undefineds.co/ns#resolvedAt';
|
|
46
|
+
export const UDFS_REVOKED_AT = 'https://undefineds.co/ns#revokedAt';
|
|
47
|
+
export const UDFS_RISK = 'https://undefineds.co/ns#risk';
|
|
48
|
+
export const UDFS_RISK_CEILING = 'https://undefineds.co/ns#riskCeiling';
|
|
49
|
+
export const UDFS_SESSION_STATUS = 'https://undefineds.co/ns#sessionStatus';
|
|
50
|
+
export const UDFS_SESSION_TOOL = 'https://undefineds.co/ns#sessionTool';
|
|
51
|
+
export const UDFS_STATUS = 'https://undefineds.co/ns#status';
|
|
52
|
+
export const UDFS_TOKEN_USAGE = 'https://undefineds.co/ns#tokenUsage';
|
|
53
|
+
export const UDFS_TOOL_CALL_ID = 'https://undefineds.co/ns#toolCallId';
|
|
54
|
+
export const UDFS_TOOL_NAME = 'https://undefineds.co/ns#toolName';
|
|
55
|
+
export const UDFS_WORKSPACE = 'https://undefineds.co/ns#workspace';
|
|
56
|
+
export const ODRL_ACTION = 'http://www.w3.org/ns/odrl/2/action';
|
|
57
|
+
export const ODRL_POLICY = 'http://www.w3.org/ns/odrl/2/Policy';
|
|
58
|
+
export const ODRL_TARGET = 'http://www.w3.org/ns/odrl/2/target';
|
|
59
|
+
export const AS_ANNOUNCE = 'https://www.w3.org/ns/activitystreams#Announce';
|
|
60
|
+
export const AS_ACTOR = 'https://www.w3.org/ns/activitystreams#actor';
|
|
61
|
+
export const AS_OBJECT = 'https://www.w3.org/ns/activitystreams#object';
|
|
62
|
+
const MANAGED_BEGIN = '# linx-managed-subject:';
|
|
63
|
+
const MANAGED_END = '# /linx-managed-subject';
|
|
64
|
+
export function podBaseUrlFromWebId(webId) {
|
|
65
|
+
return webId.replace('/profile/card#me', '').replace(/\/$/, '');
|
|
66
|
+
}
|
|
67
|
+
export function buildSessionDocumentUrl(webId, createdAt) {
|
|
68
|
+
const yyyy = String(createdAt.getUTCFullYear());
|
|
69
|
+
const mm = String(createdAt.getUTCMonth() + 1).padStart(2, '0');
|
|
70
|
+
const dd = String(createdAt.getUTCDate()).padStart(2, '0');
|
|
71
|
+
return `${podBaseUrlFromWebId(webId)}/.data/sessions/${yyyy}/${mm}/${dd}/`;
|
|
72
|
+
}
|
|
73
|
+
export function buildSessionResourceUrl(webId, sessionId, createdAt = new Date()) {
|
|
74
|
+
return `${buildSessionDocumentUrl(webId, createdAt)}${encodeURIComponent(sessionId)}.ttl`;
|
|
75
|
+
}
|
|
76
|
+
export function buildAuditDocumentUrl(webId, createdAt) {
|
|
77
|
+
const yyyy = String(createdAt.getUTCFullYear());
|
|
78
|
+
const mm = String(createdAt.getUTCMonth() + 1).padStart(2, '0');
|
|
79
|
+
const dd = String(createdAt.getUTCDate()).padStart(2, '0');
|
|
80
|
+
return `${podBaseUrlFromWebId(webId)}/.data/audits/${yyyy}/${mm}/${dd}.ttl`;
|
|
81
|
+
}
|
|
82
|
+
export function buildAuditResourceUrl(webId, auditId, createdAt) {
|
|
83
|
+
return `${buildAuditDocumentUrl(webId, createdAt)}#${encodeURIComponent(auditId)}`;
|
|
84
|
+
}
|
|
85
|
+
export function buildApprovalDocumentUrl(webId, createdAt) {
|
|
86
|
+
const yyyy = String(createdAt.getUTCFullYear());
|
|
87
|
+
const mm = String(createdAt.getUTCMonth() + 1).padStart(2, '0');
|
|
88
|
+
const dd = String(createdAt.getUTCDate()).padStart(2, '0');
|
|
89
|
+
return `${podBaseUrlFromWebId(webId)}/.data/approvals/${yyyy}/${mm}/${dd}.ttl`;
|
|
90
|
+
}
|
|
91
|
+
export function buildApprovalResourceUrl(webId, approvalId, createdAt = new Date()) {
|
|
92
|
+
return `${buildApprovalDocumentUrl(webId, createdAt)}#${encodeURIComponent(approvalId)}`;
|
|
93
|
+
}
|
|
94
|
+
export function buildGrantResourceUrl(webIdOrUri, grantId) {
|
|
95
|
+
return `${podBaseUrlFromWebIdOrUri(webIdOrUri)}/settings/autonomy/grants/${encodeURIComponent(grantId)}.ttl`;
|
|
96
|
+
}
|
|
97
|
+
export function buildInboxResourceUrl(webIdOrUri, notificationId) {
|
|
98
|
+
return `${podBaseUrlFromWebIdOrUri(webIdOrUri)}/inbox/${encodeURIComponent(notificationId)}.ttl`;
|
|
99
|
+
}
|
|
100
|
+
export function buildAgentResourceUrl(webId, agentId) {
|
|
101
|
+
return `${podBaseUrlFromWebId(webId)}/.data/agents/${encodeURIComponent(agentId)}.ttl`;
|
|
102
|
+
}
|
|
103
|
+
export function buildChatIndexResourceUrl(webId, chatId) {
|
|
104
|
+
return `${podBaseUrlFromWebId(webId)}/.data/chat/${encodeURIComponent(chatId)}/index.ttl`;
|
|
105
|
+
}
|
|
106
|
+
export function buildMessageResourceUrl(webId, chatId, createdAt) {
|
|
107
|
+
const yyyy = String(createdAt.getUTCFullYear());
|
|
108
|
+
const mm = String(createdAt.getUTCMonth() + 1).padStart(2, '0');
|
|
109
|
+
const dd = String(createdAt.getUTCDate()).padStart(2, '0');
|
|
110
|
+
return `${podBaseUrlFromWebId(webId)}/.data/chat/${encodeURIComponent(chatId)}/${yyyy}/${mm}/${dd}/messages.ttl`;
|
|
111
|
+
}
|
|
112
|
+
export function buildMessageSubjectUrl(resourceUrl, messageId) {
|
|
113
|
+
return `${resourceUrl}#${encodeURIComponent(messageId)}`;
|
|
114
|
+
}
|
|
115
|
+
export function iri(value) {
|
|
116
|
+
return { type: 'iri', value };
|
|
117
|
+
}
|
|
118
|
+
export function literal(value, datatype) {
|
|
119
|
+
return { type: 'literal', value, datatype };
|
|
120
|
+
}
|
|
121
|
+
export function dateLiteral(value) {
|
|
122
|
+
return literal(value.toISOString(), XSD_DATE_TIME);
|
|
123
|
+
}
|
|
124
|
+
export function integerLiteral(value) {
|
|
125
|
+
return { type: 'integer', value: Number.isFinite(value) ? Math.trunc(value) : 0 };
|
|
126
|
+
}
|
|
127
|
+
export async function readTurtleResource(fetcher, url) {
|
|
128
|
+
const response = await fetcher(url, {
|
|
129
|
+
method: 'GET',
|
|
130
|
+
headers: { Accept: 'text/turtle, application/n-triples;q=0.9, */*;q=0.1' },
|
|
131
|
+
});
|
|
132
|
+
if (response.status === 404) {
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
if (!response.ok) {
|
|
136
|
+
throw new Error(`Failed to read Pod resource ${url}: ${response.status} ${response.statusText}`);
|
|
137
|
+
}
|
|
138
|
+
return response.text();
|
|
139
|
+
}
|
|
140
|
+
export async function putTurtleResource(fetcher, url, turtle) {
|
|
141
|
+
await ensureResourceContainers(fetcher, url);
|
|
142
|
+
const response = await fetcher(url, {
|
|
143
|
+
method: 'PUT',
|
|
144
|
+
headers: { 'Content-Type': 'text/turtle; charset=utf-8' },
|
|
145
|
+
body: turtle.endsWith('\n') ? turtle : `${turtle}\n`,
|
|
146
|
+
});
|
|
147
|
+
if (!response.ok) {
|
|
148
|
+
const details = await response.text().catch(() => '');
|
|
149
|
+
const suffix = details.trim() ? ` - ${details.trim().slice(0, 500)}` : '';
|
|
150
|
+
throw new Error(`Failed to write Pod resource ${url}: ${response.status} ${response.statusText}${suffix}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
export async function upsertManagedTurtleBlock(fetcher, url, block) {
|
|
154
|
+
await ensureResourceContainers(fetcher, url);
|
|
155
|
+
const existing = await readTurtleResource(fetcher, url).catch((error) => {
|
|
156
|
+
if (isNotFoundError(error)) {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
throw error;
|
|
160
|
+
});
|
|
161
|
+
const turtle = mergeManagedBlock(existing ?? '', block);
|
|
162
|
+
await putTurtleResource(fetcher, url, turtle);
|
|
163
|
+
}
|
|
164
|
+
export async function deleteManagedTurtleSubject(fetcher, url, subject) {
|
|
165
|
+
const existing = await readTurtleResource(fetcher, url).catch((error) => {
|
|
166
|
+
if (isNotFoundError(error)) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
throw error;
|
|
170
|
+
});
|
|
171
|
+
if (!existing) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const encoded = encodeURIComponent(subject);
|
|
175
|
+
const pattern = new RegExp(`${escapeRegExp(MANAGED_BEGIN)} ${escapeRegExp(encoded)}\\n[\\s\\S]*?${escapeRegExp(MANAGED_END)}\\n?`, 'g');
|
|
176
|
+
const withoutManagedBlock = existing.replace(pattern, '').trim();
|
|
177
|
+
const withoutSubject = removeStandardTriplesForSubject(withoutManagedBlock, subject).trim();
|
|
178
|
+
await putTurtleResource(fetcher, url, withoutSubject ? `${withoutSubject}\n` : '');
|
|
179
|
+
}
|
|
180
|
+
export function mergeManagedBlock(existing, block) {
|
|
181
|
+
const encoded = encodeURIComponent(block.subject);
|
|
182
|
+
const blockText = renderManagedBlock(block);
|
|
183
|
+
const pattern = new RegExp(`${escapeRegExp(MANAGED_BEGIN)} ${escapeRegExp(encoded)}\\n[\\s\\S]*?${escapeRegExp(MANAGED_END)}\\n?`, 'g');
|
|
184
|
+
const withoutPreviousManagedBlock = existing.replace(pattern, '').trim();
|
|
185
|
+
const withoutPrevious = removeStandardTriplesForSubject(withoutPreviousManagedBlock, block.subject).trim();
|
|
186
|
+
return [withoutPrevious, blockText].filter(Boolean).join('\n\n');
|
|
187
|
+
}
|
|
188
|
+
export function renderManagedBlock(block) {
|
|
189
|
+
const encoded = encodeURIComponent(block.subject);
|
|
190
|
+
const lines = [`${MANAGED_BEGIN} ${encoded}`];
|
|
191
|
+
const predicates = [
|
|
192
|
+
...block.triples,
|
|
193
|
+
...(block.extraStatements ?? []).map((statement) => ({ statement })),
|
|
194
|
+
];
|
|
195
|
+
const tripleLines = block.triples.map((triple, index) => {
|
|
196
|
+
const suffix = index === block.triples.length - 1 && !block.extraStatements?.length ? ' .' : ' ;';
|
|
197
|
+
return ` <${triple.predicate}> ${renderTurtleObject(triple.object)}${suffix}`;
|
|
198
|
+
});
|
|
199
|
+
lines.push(`<${block.subject}>`);
|
|
200
|
+
lines.push(...tripleLines);
|
|
201
|
+
if (block.extraStatements?.length) {
|
|
202
|
+
if (tripleLines.length > 0) {
|
|
203
|
+
const lastTripleIndex = lines.length - 1;
|
|
204
|
+
lines[lastTripleIndex] = lines[lastTripleIndex].replace(/\s;$/, ' .');
|
|
205
|
+
}
|
|
206
|
+
lines.push(...block.extraStatements.map((statement) => (statement.trim().endsWith('.') ? statement.trim() : `${statement.trim()} .`)));
|
|
207
|
+
}
|
|
208
|
+
if (predicates.length === 0) {
|
|
209
|
+
lines.push(' .');
|
|
210
|
+
}
|
|
211
|
+
lines.push(MANAGED_END);
|
|
212
|
+
return `${lines.join('\n')}\n`;
|
|
213
|
+
}
|
|
214
|
+
export function parseManagedTurtleBlocks(turtle, baseIRI) {
|
|
215
|
+
const blocks = new Map();
|
|
216
|
+
const regexp = new RegExp(`${escapeRegExp(MANAGED_BEGIN)} ([^\\n]+)\\n([\\s\\S]*?)${escapeRegExp(MANAGED_END)}`, 'g');
|
|
217
|
+
let match;
|
|
218
|
+
while ((match = regexp.exec(turtle))) {
|
|
219
|
+
const subject = decodeURIComponent(match[1]);
|
|
220
|
+
const body = match[2];
|
|
221
|
+
const predicates = new Map();
|
|
222
|
+
const lineRegexp = /^ {2}<([^>]+)>\s+(.+?)\s*[;.]$/gm;
|
|
223
|
+
let lineMatch;
|
|
224
|
+
while ((lineMatch = lineRegexp.exec(body))) {
|
|
225
|
+
const object = parseTurtleObject(lineMatch[2]);
|
|
226
|
+
if (!object) {
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
const existing = predicates.get(lineMatch[1]) ?? [];
|
|
230
|
+
existing.push(object);
|
|
231
|
+
predicates.set(lineMatch[1], existing);
|
|
232
|
+
}
|
|
233
|
+
blocks.set(subject, predicates);
|
|
234
|
+
}
|
|
235
|
+
const turtleWithoutManagedBlocks = turtle.replace(new RegExp(`${escapeRegExp(MANAGED_BEGIN)} [^\\n]+\\n[\\s\\S]*?${escapeRegExp(MANAGED_END)}\\n?`, 'g'), '');
|
|
236
|
+
for (const [subject, predicates] of parseStandardTurtleBlocks(turtleWithoutManagedBlocks, baseIRI)) {
|
|
237
|
+
const existing = blocks.get(subject) ?? new Map();
|
|
238
|
+
for (const [predicate, objects] of predicates) {
|
|
239
|
+
existing.set(predicate, [...(existing.get(predicate) ?? []), ...objects]);
|
|
240
|
+
}
|
|
241
|
+
blocks.set(subject, existing);
|
|
242
|
+
}
|
|
243
|
+
return blocks;
|
|
244
|
+
}
|
|
245
|
+
export function firstLiteral(predicates, predicate) {
|
|
246
|
+
const object = predicates.get(predicate)?.[0];
|
|
247
|
+
return object?.type === 'literal' ? object.value : undefined;
|
|
248
|
+
}
|
|
249
|
+
export function firstIri(predicates, predicate) {
|
|
250
|
+
const object = predicates.get(predicate)?.[0];
|
|
251
|
+
return object?.type === 'iri' ? object.value : undefined;
|
|
252
|
+
}
|
|
253
|
+
export function firstInteger(predicates, predicate) {
|
|
254
|
+
const object = predicates.get(predicate)?.[0];
|
|
255
|
+
return object?.type === 'integer' ? object.value : undefined;
|
|
256
|
+
}
|
|
257
|
+
export function subjectIdFromResourceUrl(resourceUrl) {
|
|
258
|
+
const hashIndex = resourceUrl.indexOf('#');
|
|
259
|
+
if (hashIndex !== -1) {
|
|
260
|
+
return decodeURIComponent(resourceUrl.slice(hashIndex + 1));
|
|
261
|
+
}
|
|
262
|
+
return decodeURIComponent(resourceUrl.split('/').pop()?.replace(/\.ttl$/, '') ?? '');
|
|
263
|
+
}
|
|
264
|
+
export async function listTurtleResources(fetcher, containerUrl) {
|
|
265
|
+
const response = await fetcher(containerUrl, {
|
|
266
|
+
method: 'GET',
|
|
267
|
+
headers: { Accept: 'text/turtle, application/ld+json;q=0.8, */*;q=0.1' },
|
|
268
|
+
});
|
|
269
|
+
if (response.status === 404) {
|
|
270
|
+
return [];
|
|
271
|
+
}
|
|
272
|
+
if (!response.ok) {
|
|
273
|
+
throw new Error(`Failed to list Pod container ${containerUrl}: ${response.status} ${response.statusText}`);
|
|
274
|
+
}
|
|
275
|
+
const text = await response.text();
|
|
276
|
+
const urls = new Set();
|
|
277
|
+
const absoluteRegexp = /https?:\/\/[^<>"'\s)]+\.ttl/g;
|
|
278
|
+
for (const match of text.matchAll(absoluteRegexp)) {
|
|
279
|
+
urls.add(match[0]);
|
|
280
|
+
}
|
|
281
|
+
const relativeRegexp = /[<"]([^<>"']+\.ttl)[>"]/g;
|
|
282
|
+
let relativeMatch;
|
|
283
|
+
while ((relativeMatch = relativeRegexp.exec(text))) {
|
|
284
|
+
urls.add(new URL(relativeMatch[1], containerUrl).toString());
|
|
285
|
+
}
|
|
286
|
+
return [...urls].sort();
|
|
287
|
+
}
|
|
288
|
+
export async function listTurtleResourcesRecursive(fetcher, containerUrl) {
|
|
289
|
+
const response = await fetcher(containerUrl, {
|
|
290
|
+
method: 'GET',
|
|
291
|
+
headers: { Accept: 'text/turtle, application/ld+json;q=0.8, */*;q=0.1' },
|
|
292
|
+
});
|
|
293
|
+
if (response.status === 404) {
|
|
294
|
+
return [];
|
|
295
|
+
}
|
|
296
|
+
if (!response.ok) {
|
|
297
|
+
throw new Error(`Failed to list Pod container ${containerUrl}: ${response.status} ${response.statusText}`);
|
|
298
|
+
}
|
|
299
|
+
const text = await response.text();
|
|
300
|
+
const resources = new Set();
|
|
301
|
+
const containers = new Set();
|
|
302
|
+
const resourceRegexp = /[<"]([^<>"']+\.ttl)[>"]/g;
|
|
303
|
+
let resourceMatch;
|
|
304
|
+
while ((resourceMatch = resourceRegexp.exec(text))) {
|
|
305
|
+
resources.add(new URL(resourceMatch[1], containerUrl).toString());
|
|
306
|
+
}
|
|
307
|
+
const containerRegexp = /[<"]([^<>"']+\/)[>"]/g;
|
|
308
|
+
let containerMatch;
|
|
309
|
+
while ((containerMatch = containerRegexp.exec(text))) {
|
|
310
|
+
const url = new URL(containerMatch[1], containerUrl).toString();
|
|
311
|
+
if (url !== containerUrl) {
|
|
312
|
+
containers.add(url);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
const nested = await Promise.all([...containers].map((url) => listTurtleResourcesRecursive(fetcher, url)));
|
|
316
|
+
return [...resources, ...nested.flat()].sort();
|
|
317
|
+
}
|
|
318
|
+
async function ensureResourceContainers(fetcher, resourceUrl) {
|
|
319
|
+
for (const containerUrl of containerUrlsForResource(resourceUrl)) {
|
|
320
|
+
await ensureContainer(fetcher, containerUrl);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
async function ensureContainer(fetcher, containerUrl) {
|
|
324
|
+
const existing = await fetcher(containerUrl, { method: 'HEAD' }).catch(() => null);
|
|
325
|
+
if (existing?.ok) {
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
if (existing && existing.status !== 404 && existing.status !== 405) {
|
|
329
|
+
return;
|
|
330
|
+
}
|
|
331
|
+
const response = await fetcher(containerUrl, {
|
|
332
|
+
method: 'PUT',
|
|
333
|
+
headers: {
|
|
334
|
+
Link: '<http://www.w3.org/ns/ldp#BasicContainer>; rel="type"',
|
|
335
|
+
'Content-Type': 'text/turtle; charset=utf-8',
|
|
336
|
+
},
|
|
337
|
+
body: '',
|
|
338
|
+
});
|
|
339
|
+
if (!response.ok && response.status !== 409) {
|
|
340
|
+
throw new Error(`Failed to ensure Pod container ${containerUrl}: ${response.status} ${response.statusText}`);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
function containerUrlsForResource(resourceUrl) {
|
|
344
|
+
const url = new URL(resourceUrl);
|
|
345
|
+
const parts = url.pathname.split('/').filter(Boolean);
|
|
346
|
+
const containers = [];
|
|
347
|
+
let path = '/';
|
|
348
|
+
for (let index = 0; index < parts.length - 1; index += 1) {
|
|
349
|
+
path += `${parts[index]}/`;
|
|
350
|
+
containers.push(new URL(path, url.origin).toString());
|
|
351
|
+
}
|
|
352
|
+
return containers;
|
|
353
|
+
}
|
|
354
|
+
function podBaseUrlFromWebIdOrUri(webIdOrUri) {
|
|
355
|
+
if (webIdOrUri.includes('/profile/card#me')) {
|
|
356
|
+
return podBaseUrlFromWebId(webIdOrUri);
|
|
357
|
+
}
|
|
358
|
+
const match = webIdOrUri.match(/^(https?:\/\/[^?#]+?)(?:\/\.data\/|\/settings\/|\/inbox\/)/u);
|
|
359
|
+
if (match) {
|
|
360
|
+
return match[1].replace(/\/$/, '');
|
|
361
|
+
}
|
|
362
|
+
return webIdOrUri.replace(/\/$/, '');
|
|
363
|
+
}
|
|
364
|
+
function renderTurtleObject(object) {
|
|
365
|
+
if (object.type === 'iri') {
|
|
366
|
+
return `<${object.value}>`;
|
|
367
|
+
}
|
|
368
|
+
if (object.type === 'integer') {
|
|
369
|
+
return String(object.value);
|
|
370
|
+
}
|
|
371
|
+
const datatype = object.datatype ? `^^<${object.datatype}>` : '';
|
|
372
|
+
return `"${escapeLiteral(object.value)}"${datatype}`;
|
|
373
|
+
}
|
|
374
|
+
function parseStandardTurtleBlocks(turtle, baseIRI) {
|
|
375
|
+
const blocks = new Map();
|
|
376
|
+
const parser = new Parser(baseIRI ? { baseIRI } : undefined);
|
|
377
|
+
let quads;
|
|
378
|
+
try {
|
|
379
|
+
quads = parser.parse(turtle);
|
|
380
|
+
}
|
|
381
|
+
catch {
|
|
382
|
+
return blocks;
|
|
383
|
+
}
|
|
384
|
+
for (const quad of quads) {
|
|
385
|
+
if (quad.subject.termType !== 'NamedNode' || quad.predicate.termType !== 'NamedNode') {
|
|
386
|
+
continue;
|
|
387
|
+
}
|
|
388
|
+
const object = turtleObjectFromTerm(quad.object);
|
|
389
|
+
if (!object) {
|
|
390
|
+
continue;
|
|
391
|
+
}
|
|
392
|
+
const predicates = blocks.get(quad.subject.value) ?? new Map();
|
|
393
|
+
const values = predicates.get(quad.predicate.value) ?? [];
|
|
394
|
+
values.push(object);
|
|
395
|
+
predicates.set(quad.predicate.value, values);
|
|
396
|
+
blocks.set(quad.subject.value, predicates);
|
|
397
|
+
}
|
|
398
|
+
return blocks;
|
|
399
|
+
}
|
|
400
|
+
function removeStandardTriplesForSubject(turtle, subject) {
|
|
401
|
+
if (!turtle.trim()) {
|
|
402
|
+
return '';
|
|
403
|
+
}
|
|
404
|
+
const baseIRI = subject.includes('#') ? subject.split('#')[0] : subject;
|
|
405
|
+
const parser = new Parser({ baseIRI });
|
|
406
|
+
let quads;
|
|
407
|
+
try {
|
|
408
|
+
quads = parser.parse(turtle);
|
|
409
|
+
}
|
|
410
|
+
catch {
|
|
411
|
+
return turtle;
|
|
412
|
+
}
|
|
413
|
+
const kept = quads.filter((quad) => (quad.subject.value !== subject
|
|
414
|
+
&& !(quad.object.termType === 'NamedNode' && quad.object.value === subject)));
|
|
415
|
+
if (kept.length === quads.length) {
|
|
416
|
+
return turtle;
|
|
417
|
+
}
|
|
418
|
+
const writer = new Writer();
|
|
419
|
+
writer.addQuads(kept);
|
|
420
|
+
let output = '';
|
|
421
|
+
writer.end((error, result) => {
|
|
422
|
+
output = error ? turtle : result;
|
|
423
|
+
});
|
|
424
|
+
return output;
|
|
425
|
+
}
|
|
426
|
+
function turtleObjectFromTerm(term) {
|
|
427
|
+
if (term.termType === 'NamedNode') {
|
|
428
|
+
return iri(term.value);
|
|
429
|
+
}
|
|
430
|
+
if (term.termType !== 'Literal') {
|
|
431
|
+
return null;
|
|
432
|
+
}
|
|
433
|
+
const datatype = term.datatype?.value;
|
|
434
|
+
if (datatype === 'http://www.w3.org/2001/XMLSchema#integer'
|
|
435
|
+
|| datatype === 'http://www.w3.org/2001/XMLSchema#decimal') {
|
|
436
|
+
const parsed = Number(term.value);
|
|
437
|
+
if (Number.isFinite(parsed)) {
|
|
438
|
+
return integerLiteral(parsed);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
return literal(term.value, datatype);
|
|
442
|
+
}
|
|
443
|
+
function parseTurtleObject(source) {
|
|
444
|
+
const trimmed = source.trim();
|
|
445
|
+
const iriMatch = /^<([^>]+)>$/.exec(trimmed);
|
|
446
|
+
if (iriMatch) {
|
|
447
|
+
return iri(iriMatch[1]);
|
|
448
|
+
}
|
|
449
|
+
const integerMatch = /^-?\d+$/.exec(trimmed);
|
|
450
|
+
if (integerMatch) {
|
|
451
|
+
return integerLiteral(Number(trimmed));
|
|
452
|
+
}
|
|
453
|
+
const literalMatch = /^"((?:\\.|[^"\\])*)"(?:\^\^<([^>]+)>)?$/.exec(trimmed);
|
|
454
|
+
if (!literalMatch) {
|
|
455
|
+
return null;
|
|
456
|
+
}
|
|
457
|
+
return literal(unescapeLiteral(literalMatch[1]), literalMatch[2]);
|
|
458
|
+
}
|
|
459
|
+
function escapeLiteral(value) {
|
|
460
|
+
return value
|
|
461
|
+
.replace(/\\/g, '\\\\')
|
|
462
|
+
.replace(/"/g, '\\"')
|
|
463
|
+
.replace(/\n/g, '\\n')
|
|
464
|
+
.replace(/\r/g, '\\r');
|
|
465
|
+
}
|
|
466
|
+
function unescapeLiteral(value) {
|
|
467
|
+
return value
|
|
468
|
+
.replace(/\\r/g, '\r')
|
|
469
|
+
.replace(/\\n/g, '\n')
|
|
470
|
+
.replace(/\\"/g, '"')
|
|
471
|
+
.replace(/\\\\/g, '\\');
|
|
472
|
+
}
|
|
473
|
+
function isNotFoundError(error) {
|
|
474
|
+
return error instanceof Error && error.message.includes(': 404 ');
|
|
475
|
+
}
|
|
476
|
+
function escapeRegExp(value) {
|
|
477
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
478
|
+
}
|
|
479
|
+
//# sourceMappingURL=pod-native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pod-native.js","sourceRoot":"","sources":["../../../src/lib/pi-adapter/pod-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;AAoBnC,MAAM,CAAC,MAAM,QAAQ,GAAG,iDAAiD,CAAA;AACzE,MAAM,CAAC,MAAM,aAAa,GAAG,2CAA2C,CAAA;AACxE,MAAM,CAAC,MAAM,WAAW,GAAG,kCAAkC,CAAA;AAC7D,MAAM,CAAC,MAAM,YAAY,GAAG,mCAAmC,CAAA;AAC/D,MAAM,CAAC,MAAM,SAAS,GAAG,gCAAgC,CAAA;AACzD,MAAM,CAAC,MAAM,UAAU,GAAG,iCAAiC,CAAA;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAG,iCAAiC,CAAA;AAC7D,MAAM,CAAC,MAAM,iBAAiB,GAAG,qCAAqC,CAAA;AACtE,MAAM,CAAC,MAAM,eAAe,GAAG,oCAAoC,CAAA;AACnE,MAAM,CAAC,MAAM,iBAAiB,GAAG,2CAA2C,CAAA;AAC5E,MAAM,CAAC,MAAM,eAAe,GAAG,0CAA0C,CAAA;AACzE,MAAM,CAAC,MAAM,WAAW,GAAG,gCAAgC,CAAA;AAC3D,MAAM,CAAC,MAAM,UAAU,GAAG,+CAA+C,CAAA;AACzE,MAAM,CAAC,MAAM,UAAU,GAAG,gCAAgC,CAAA;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,qCAAqC,CAAA;AACrE,MAAM,CAAC,MAAM,qBAAqB,GAAG,0CAA0C,CAAA;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,wCAAwC,CAAA;AAC3E,MAAM,CAAC,MAAM,YAAY,GAAG,kCAAkC,CAAA;AAC9D,MAAM,CAAC,MAAM,WAAW,GAAG,iCAAiC,CAAA;AAC5D,MAAM,CAAC,MAAM,UAAU,GAAG,gCAAgC,CAAA;AAC1D,MAAM,CAAC,MAAM,eAAe,GAAG,oCAAoC,CAAA;AACnE,MAAM,CAAC,MAAM,aAAa,GAAG,mCAAmC,CAAA;AAChE,MAAM,CAAC,MAAM,cAAc,GAAG,mCAAmC,CAAA;AACjE,MAAM,CAAC,MAAM,YAAY,GAAG,kCAAkC,CAAA;AAC9D,MAAM,CAAC,MAAM,UAAU,GAAG,gCAAgC,CAAA;AAC1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,uCAAuC,CAAA;AACxE,MAAM,CAAC,MAAM,uBAAuB,GAAG,4CAA4C,CAAA;AACnF,MAAM,CAAC,MAAM,sBAAsB,GAAG,2CAA2C,CAAA;AACjF,MAAM,CAAC,MAAM,eAAe,GAAG,oCAAoC,CAAA;AACnE,MAAM,CAAC,MAAM,cAAc,GAAG,mCAAmC,CAAA;AACjE,MAAM,CAAC,MAAM,mBAAmB,GAAG,uCAAuC,CAAA;AAC1E,MAAM,CAAC,MAAM,mBAAmB,GAAG,wCAAwC,CAAA;AAC3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,sCAAsC,CAAA;AACvE,MAAM,CAAC,MAAM,aAAa,GAAG,mCAAmC,CAAA;AAChE,MAAM,CAAC,MAAM,UAAU,GAAG,gCAAgC,CAAA;AAC1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,qCAAqC,CAAA;AACtE,MAAM,CAAC,MAAM,gBAAgB,GAAG,qCAAqC,CAAA;AACrE,MAAM,CAAC,MAAM,gBAAgB,GAAG,qCAAqC,CAAA;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,uCAAuC,CAAA;AACzE,MAAM,CAAC,MAAM,WAAW,GAAG,iCAAiC,CAAA;AAC5D,MAAM,CAAC,MAAM,mBAAmB,GAAG,wCAAwC,CAAA;AAC3E,MAAM,CAAC,MAAM,aAAa,GAAG,mCAAmC,CAAA;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG,iCAAiC,CAAA;AAC5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,qCAAqC,CAAA;AACrE,MAAM,CAAC,MAAM,eAAe,GAAG,oCAAoC,CAAA;AACnE,MAAM,CAAC,MAAM,SAAS,GAAG,+BAA+B,CAAA;AACxD,MAAM,CAAC,MAAM,iBAAiB,GAAG,sCAAsC,CAAA;AACvE,MAAM,CAAC,MAAM,mBAAmB,GAAG,wCAAwC,CAAA;AAC3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,sCAAsC,CAAA;AACvE,MAAM,CAAC,MAAM,WAAW,GAAG,iCAAiC,CAAA;AAC5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,qCAAqC,CAAA;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAG,qCAAqC,CAAA;AACtE,MAAM,CAAC,MAAM,cAAc,GAAG,mCAAmC,CAAA;AACjE,MAAM,CAAC,MAAM,cAAc,GAAG,oCAAoC,CAAA;AAClE,MAAM,CAAC,MAAM,WAAW,GAAG,oCAAoC,CAAA;AAC/D,MAAM,CAAC,MAAM,WAAW,GAAG,oCAAoC,CAAA;AAC/D,MAAM,CAAC,MAAM,WAAW,GAAG,oCAAoC,CAAA;AAC/D,MAAM,CAAC,MAAM,WAAW,GAAG,gDAAgD,CAAA;AAC3E,MAAM,CAAC,MAAM,QAAQ,GAAG,6CAA6C,CAAA;AACrE,MAAM,CAAC,MAAM,SAAS,GAAG,8CAA8C,CAAA;AAEvE,MAAM,aAAa,GAAG,yBAAyB,CAAA;AAC/C,MAAM,WAAW,GAAG,yBAAyB,CAAA;AAE7C,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,OAAO,KAAK,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AACjE,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa,EAAE,SAAe;IACpE,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAA;IAC/C,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC/D,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC1D,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,mBAAmB,IAAI,IAAI,EAAE,IAAI,EAAE,GAAG,CAAA;AAC5E,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa,EAAE,SAAiB,EAAE,YAAkB,IAAI,IAAI,EAAE;IACpG,OAAO,GAAG,uBAAuB,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAA;AAC3F,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,SAAe;IAClE,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAA;IAC/C,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC/D,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC1D,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,iBAAiB,IAAI,IAAI,EAAE,IAAI,EAAE,MAAM,CAAA;AAC7E,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,OAAe,EAAE,SAAe;IACnF,OAAO,GAAG,qBAAqB,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAA;AACpF,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAa,EAAE,SAAe;IACrE,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAA;IAC/C,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC/D,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC1D,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,oBAAoB,IAAI,IAAI,EAAE,IAAI,EAAE,MAAM,CAAA;AAChF,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAa,EAAE,UAAkB,EAAE,YAAkB,IAAI,IAAI,EAAE;IACtG,OAAO,GAAG,wBAAwB,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAA;AAC1F,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAkB,EAAE,OAAe;IACvE,OAAO,GAAG,wBAAwB,CAAC,UAAU,CAAC,6BAA6B,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAA;AAC9G,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,UAAkB,EAAE,cAAsB;IAC9E,OAAO,GAAG,wBAAwB,CAAC,UAAU,CAAC,UAAU,kBAAkB,CAAC,cAAc,CAAC,MAAM,CAAA;AAClG,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,OAAe;IAClE,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,iBAAiB,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAA;AACxF,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAa,EAAE,MAAc;IACrE,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,eAAe,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAA;AAC3F,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa,EAAE,MAAc,EAAE,SAAe;IACpF,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,CAAA;IAC/C,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC/D,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC1D,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,eAAe,kBAAkB,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,eAAe,CAAA;AAClH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,WAAmB,EAAE,SAAiB;IAC3E,OAAO,GAAG,WAAW,IAAI,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAA;AAC1D,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,KAAa;IAC/B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,QAAiB;IACtD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAW;IACrC,OAAO,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,aAAa,CAAC,CAAA;AACpD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AACnF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAiB,EAAE,GAAW;IACrE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;QAClC,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,EAAE,MAAM,EAAE,qDAAqD,EAAE;KAC3E,CAAC,CAAA;IACF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;IAClG,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAA;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAiB,EAAE,GAAW,EAAE,MAAc;IACpF,MAAM,wBAAwB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IAC5C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;QAClC,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,EAAE,cAAc,EAAE,4BAA4B,EAAE;QACzD,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;KACrD,CAAC,CAAA;IACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;QACrD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QACzE,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,GAAG,MAAM,EAAE,CAAC,CAAA;IAC5G,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAiB,EACjB,GAAW,EACX,KAAyB;IAEzB,MAAM,wBAAwB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IAC5C,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACtE,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,IAAI,EAAE,EAAE,KAAK,CAAC,CAAA;IACvD,MAAM,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,OAAiB,EACjB,GAAW,EACX,OAAe;IAEf,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACtE,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC,CAAC,CAAA;IACF,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAM;IACR,CAAC;IAED,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,OAAO,GAAG,IAAI,MAAM,CACxB,GAAG,YAAY,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,gBAAgB,YAAY,CAAC,WAAW,CAAC,MAAM,EACtG,GAAG,CACJ,CAAA;IACD,MAAM,mBAAmB,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IAChE,MAAM,cAAc,GAAG,+BAA+B,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;IAC3F,MAAM,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,cAAc,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;AACpF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,KAAyB;IAC3E,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACjD,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,OAAO,GAAG,IAAI,MAAM,CACxB,GAAG,YAAY,CAAC,aAAa,CAAC,IAAI,YAAY,CAAC,OAAO,CAAC,gBAAgB,YAAY,CAAC,WAAW,CAAC,MAAM,EACtG,GAAG,CACJ,CAAA;IACD,MAAM,2BAA2B,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACxE,MAAM,eAAe,GAAG,+BAA+B,CAAC,2BAA2B,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAA;IAC1G,OAAO,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAClE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAyB;IAC1D,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACjD,MAAM,KAAK,GAAG,CAAC,GAAG,aAAa,IAAI,OAAO,EAAE,CAAC,CAAA;IAC7C,MAAM,UAAU,GAAG;QACjB,GAAG,KAAK,CAAC,OAAO;QAChB,GAAG,CAAC,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;KACrE,CAAA;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACtD,MAAM,MAAM,GAAG,KAAK,KAAK,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;QACjG,OAAO,MAAM,MAAM,CAAC,SAAS,KAAK,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CAAA;IAChF,CAAC,CAAC,CAAA;IACF,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,CAAA;IAChC,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAA;IAC1B,IAAI,KAAK,CAAC,eAAe,EAAE,MAAM,EAAE,CAAC;QAClC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA;YACxC,KAAK,CAAC,eAAe,CAAC,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QACvE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CACrD,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAC5E,CAAC,CAAC,CAAA;IACL,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACvB,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,MAAc,EAAE,OAAgB;IACvE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuC,CAAA;IAC7D,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,GAAG,YAAY,CAAC,aAAa,CAAC,4BAA4B,YAAY,CAAC,WAAW,CAAC,EAAE,EACrF,GAAG,CACJ,CAAA;IACD,IAAI,KAA6B,CAAA;IACjC,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QACrB,MAAM,UAAU,GAAG,IAAI,GAAG,EAA0B,CAAA;QACpD,MAAM,UAAU,GAAG,kCAAkC,CAAA;QACrD,IAAI,SAAiC,CAAA;QACrC,OAAO,CAAC,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAA;YAC9C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,SAAQ;YACV,CAAC;YACD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YACnD,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACrB,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;QACxC,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IACjC,CAAC;IACD,MAAM,0BAA0B,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,MAAM,CAC1D,GAAG,YAAY,CAAC,aAAa,CAAC,wBAAwB,YAAY,CAAC,WAAW,CAAC,MAAM,EACrF,GAAG,CACJ,EAAE,EAAE,CAAC,CAAA;IACN,KAAK,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,yBAAyB,CAAC,0BAA0B,EAAE,OAAO,CAAC,EAAE,CAAC;QACnG,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,EAA0B,CAAA;QACzE,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,UAAU,EAAE,CAAC;YAC9C,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAA;QAC3E,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IAC/B,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,UAAuC,EACvC,SAAiB;IAEjB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC7C,OAAO,MAAM,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AAC9D,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,UAAuC,EACvC,SAAiB;IAEjB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC7C,OAAO,MAAM,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AAC1D,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,UAAuC,EACvC,SAAiB;IAEjB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC7C,OAAO,MAAM,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AAC9D,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,WAAmB;IAC1D,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC1C,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACrB,OAAO,kBAAkB,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAA;IAC7D,CAAC;IACD,OAAO,kBAAkB,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAA;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAiB,EAAE,YAAoB;IAC/E,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE;QAC3C,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,EAAE,MAAM,EAAE,mDAAmD,EAAE;KACzE,CAAC,CAAA;IACF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAA;IACX,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,gCAAgC,YAAY,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;IAC5G,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAClC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,MAAM,cAAc,GAAG,8BAA8B,CAAA;IACrD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACpB,CAAC;IACD,MAAM,cAAc,GAAG,0BAA0B,CAAA;IACjD,IAAI,aAAqC,CAAA;IACzC,OAAO,CAAC,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC9D,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,OAAiB,EAAE,YAAoB;IACxF,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE;QAC3C,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,EAAE,MAAM,EAAE,mDAAmD,EAAE;KACzE,CAAC,CAAA;IACF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAA;IACX,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,gCAAgC,YAAY,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;IAC5G,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAClC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;IACnC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAA;IACpC,MAAM,cAAc,GAAG,0BAA0B,CAAA;IACjD,IAAI,aAAqC,CAAA;IACzC,OAAO,CAAC,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACnD,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;IACnE,CAAC;IACD,MAAM,eAAe,GAAG,uBAAuB,CAAA;IAC/C,IAAI,cAAsC,CAAA;IAC1C,OAAO,CAAC,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC/D,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACzB,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACrB,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,4BAA4B,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;IAC1G,OAAO,CAAC,GAAG,SAAS,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;AAChD,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,OAAiB,EAAE,WAAmB;IAC5E,KAAK,MAAM,YAAY,IAAI,wBAAwB,CAAC,WAAW,CAAC,EAAE,CAAC;QACjE,MAAM,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IAC9C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,OAAiB,EAAE,YAAoB;IACpE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAA;IAClF,IAAI,QAAQ,EAAE,EAAE,EAAE,CAAC;QACjB,OAAM;IACR,CAAC;IACD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACnE,OAAM;IACR,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE;QAC3C,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,IAAI,EAAE,uDAAuD;YAC7D,cAAc,EAAE,4BAA4B;SAC7C;QACD,IAAI,EAAE,EAAE;KACT,CAAC,CAAA;IACF,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,kCAAkC,YAAY,KAAK,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;IAC9G,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,WAAmB;IACnD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAA;IAChC,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACrD,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,IAAI,IAAI,GAAG,GAAG,CAAA;IACd,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACzD,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAA;QAC1B,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;IACvD,CAAC;IACD,OAAO,UAAU,CAAA;AACnB,CAAC;AAED,SAAS,wBAAwB,CAAC,UAAkB;IAClD,IAAI,UAAU,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC5C,OAAO,mBAAmB,CAAC,UAAU,CAAC,CAAA;IACxC,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAA;IAC7F,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACpC,CAAC;IACD,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;AACtC,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAoB;IAC9C,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC1B,OAAO,IAAI,MAAM,CAAC,KAAK,GAAG,CAAA;IAC5B,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAChE,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAA;AACtD,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAc,EAAE,OAAgB;IACjE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuC,CAAA;IAC7D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC5D,IAAI,KAAK,CAAA;IACT,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAA;IACf,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,WAAW,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;YACrF,SAAQ;QACV,CAAC;QACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAChD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,SAAQ;QACV,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,EAA0B,CAAA;QACtF,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;QACzD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACnB,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC5C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;IAC5C,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,+BAA+B,CAAC,MAAc,EAAE,OAAe;IACtE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACnB,OAAO,EAAE,CAAA;IACX,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;IACvE,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IACtC,IAAI,KAAK,CAAA;IACT,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAA;IACf,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAClC,IAAI,CAAC,OAAO,CAAC,KAAK,KAAK,OAAO;WAC3B,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC,CAC5E,CAAC,CAAA;IACF,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QACjC,OAAO,MAAM,CAAA;IACf,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAA;IAC3B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACrB,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAC3B,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;IAClC,CAAC,CAAC,CAAA;IACF,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAuE;IACnG,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAA;IACrC,IACE,QAAQ,KAAK,0CAA0C;WACpD,QAAQ,KAAK,0CAA0C,EAC1D,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,cAAc,CAAC,MAAM,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;AACtC,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAc;IACvC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAA;IAC7B,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IACzB,CAAC;IACD,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5C,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;IACxC,CAAC;IACD,MAAM,YAAY,GAAG,yCAAyC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5E,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,OAAO,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;AACnE,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK;SACT,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;AAC1B,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,KAAK;SACT,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;SACrB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC;SACrB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;AAC3B,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,OAAO,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AACnE,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;AACrD,CAAC"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* with a Pod root (e.g., /alice/). For local files, use read/write.
|
|
9
9
|
*/
|
|
10
10
|
import { Type } from '@sinclair/typebox';
|
|
11
|
+
import { resolveLinxPodBaseUrl } from '@undefineds.co/models/client';
|
|
11
12
|
import { getDefaultPodDataSession } from '../pod-data-session.js';
|
|
12
13
|
// ── Parameter Schemas ──────────────────────────────────────────────────────
|
|
13
14
|
const PodReadParams = Type.Object({
|
|
@@ -30,6 +31,33 @@ function inferContentType(path) {
|
|
|
30
31
|
return 'text/html';
|
|
31
32
|
return 'text/plain';
|
|
32
33
|
}
|
|
34
|
+
export function resolvePodToolUrl(path, pod) {
|
|
35
|
+
if (/^https?:\/\//i.test(path)) {
|
|
36
|
+
return path;
|
|
37
|
+
}
|
|
38
|
+
const webId = pod.webId?.trim() ?? '';
|
|
39
|
+
const origin = resolveUrlOrigin(webId) || resolveUrlOrigin(pod.credentials?.url);
|
|
40
|
+
if (path.startsWith('/')) {
|
|
41
|
+
if (!origin) {
|
|
42
|
+
throw new Error('Cannot resolve absolute Pod path without a WebID or issuer URL.');
|
|
43
|
+
}
|
|
44
|
+
return new URL(path, `${origin}/`).toString();
|
|
45
|
+
}
|
|
46
|
+
const podBase = webId ? resolveLinxPodBaseUrl(webId) : '';
|
|
47
|
+
const baseUrl = podBase || origin;
|
|
48
|
+
if (!baseUrl) {
|
|
49
|
+
throw new Error('Cannot resolve relative Pod path without a WebID or issuer URL.');
|
|
50
|
+
}
|
|
51
|
+
return new URL(path, `${baseUrl.replace(/\/+$/, '')}/`).toString();
|
|
52
|
+
}
|
|
53
|
+
function resolveUrlOrigin(url) {
|
|
54
|
+
try {
|
|
55
|
+
return typeof url === 'string' && url.trim() ? new URL(url).origin : '';
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return '';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
33
61
|
// ── Tool Definitions ────────────────────────────────────────────────────────
|
|
34
62
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
35
63
|
export const podReadTool = {
|
|
@@ -41,26 +69,30 @@ export const podReadTool = {
|
|
|
41
69
|
].join('\n'),
|
|
42
70
|
parameters: PodReadParams,
|
|
43
71
|
async execute(_callId, params) {
|
|
44
|
-
|
|
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
|
-
}
|
|
72
|
+
return executePodRead(params);
|
|
62
73
|
},
|
|
63
74
|
};
|
|
75
|
+
export async function executePodRead(params, getPodDataSession = getDefaultPodDataSession) {
|
|
76
|
+
const path = params.path.trim();
|
|
77
|
+
if (!path)
|
|
78
|
+
return { content: [{ type: 'text', text: 'Error: path is required' }], isError: true };
|
|
79
|
+
const pod = await getPodDataSession();
|
|
80
|
+
if (!pod)
|
|
81
|
+
return { content: [{ type: 'text', text: 'Error: not connected to Pod' }], isError: true };
|
|
82
|
+
try {
|
|
83
|
+
const fullUrl = resolvePodToolUrl(path, pod);
|
|
84
|
+
const res = await pod.fetch(fullUrl);
|
|
85
|
+
if (!res.ok) {
|
|
86
|
+
const body = await res.text().catch(() => '');
|
|
87
|
+
return { content: [{ type: 'text', text: `Pod read failed: HTTP ${res.status} — ${body.slice(0, 500)}` }], isError: true };
|
|
88
|
+
}
|
|
89
|
+
const text = await res.text();
|
|
90
|
+
return { content: [{ type: 'text', text }] };
|
|
91
|
+
}
|
|
92
|
+
catch (e) {
|
|
93
|
+
return { content: [{ type: 'text', text: `Pod read error: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
64
96
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
65
97
|
export const podWriteTool = {
|
|
66
98
|
name: 'pod_write',
|
|
@@ -72,30 +104,34 @@ export const podWriteTool = {
|
|
|
72
104
|
].join('\n'),
|
|
73
105
|
parameters: PodWriteParams,
|
|
74
106
|
async execute(_callId, params) {
|
|
75
|
-
|
|
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
|
-
}
|
|
107
|
+
return executePodWrite(params);
|
|
97
108
|
},
|
|
98
109
|
};
|
|
110
|
+
export async function executePodWrite(params, getPodDataSession = getDefaultPodDataSession) {
|
|
111
|
+
const path = params.path.trim();
|
|
112
|
+
if (!path)
|
|
113
|
+
return { content: [{ type: 'text', text: 'Error: path is required' }], isError: true };
|
|
114
|
+
const pod = await getPodDataSession();
|
|
115
|
+
if (!pod)
|
|
116
|
+
return { content: [{ type: 'text', text: 'Error: not connected to Pod' }], isError: true };
|
|
117
|
+
const ct = params.contentType?.trim() || inferContentType(path);
|
|
118
|
+
try {
|
|
119
|
+
const fullUrl = resolvePodToolUrl(path, pod);
|
|
120
|
+
const res = await pod.fetch(fullUrl, {
|
|
121
|
+
method: 'PUT',
|
|
122
|
+
headers: { 'Content-Type': ct },
|
|
123
|
+
body: params.content,
|
|
124
|
+
});
|
|
125
|
+
if (!res.ok) {
|
|
126
|
+
const body = await res.text().catch(() => '');
|
|
127
|
+
return { content: [{ type: 'text', text: `Pod write failed: HTTP ${res.status} — ${body.slice(0, 500)}` }], isError: true };
|
|
128
|
+
}
|
|
129
|
+
return { content: [{ type: 'text', text: `Written: ${path}` }] };
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
return { content: [{ type: 'text', text: `Pod write error: ${e instanceof Error ? e.message : String(e)}` }], isError: true };
|
|
133
|
+
}
|
|
134
|
+
}
|
|
99
135
|
// ── Pi Extension ────────────────────────────────────────────────────────────
|
|
100
136
|
export default function (pi) {
|
|
101
137
|
pi.registerTool(podReadTool);
|