@undefineds.co/models 0.2.15 → 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 (46) hide show
  1. package/README.md +26 -28
  2. package/dist/agent.providers.js +11 -0
  3. package/dist/agent.repository.d.ts +1 -1
  4. package/dist/ai-config/index.d.ts +10 -2
  5. package/dist/ai-config/index.js +53 -15
  6. package/dist/ai-model.schema.js +4 -3
  7. package/dist/ai-provider.schema.js +1 -1
  8. package/dist/approval.schema.d.ts +7 -1
  9. package/dist/approval.schema.js +6 -8
  10. package/dist/audit.presentation.d.ts +23 -0
  11. package/dist/audit.presentation.js +275 -0
  12. package/dist/audit.schema.d.ts +1 -1
  13. package/dist/audit.schema.js +3 -8
  14. package/dist/chat.repository.d.ts +1 -1
  15. package/dist/chat.utils.d.ts +9 -0
  16. package/dist/chat.utils.js +33 -0
  17. package/dist/contact.repository.d.ts +1 -1
  18. package/dist/contact.schema.d.ts +8 -0
  19. package/dist/contact.schema.js +12 -0
  20. package/dist/credential.schema.js +1 -1
  21. package/dist/discovery/models.json +29 -0
  22. package/dist/discovery/providers.json +10 -0
  23. package/dist/grant.schema.d.ts +28 -1
  24. package/dist/grant.schema.js +21 -7
  25. package/dist/index.d.ts +10 -8
  26. package/dist/index.js +9 -7
  27. package/dist/message.repository.d.ts +1 -1
  28. package/dist/namespaces.js +11 -0
  29. package/dist/profile.repository.d.ts +7 -7
  30. package/dist/repository.d.ts +1 -99
  31. package/dist/repository.js +1 -189
  32. package/dist/schema.d.ts +34 -0
  33. package/dist/session/index.d.ts +1 -1
  34. package/dist/session/index.js +1 -1
  35. package/dist/session/session.schema.d.ts +2 -1
  36. package/dist/session/session.schema.js +11 -7
  37. package/dist/session.repository.d.ts +1 -1
  38. package/dist/sidecar/persistence-mapping.d.ts +2 -2
  39. package/dist/sidecar/sidecar-events.d.ts +192 -6
  40. package/dist/sidecar/sidecar-events.js +10 -0
  41. package/dist/thread.repository.d.ts +1 -1
  42. package/dist/vocab/sidecar.vocab.d.ts +17 -0
  43. package/dist/vocab/sidecar.vocab.js +17 -0
  44. package/dist/watch/index.d.ts +55 -0
  45. package/dist/watch/index.js +349 -12
  46. package/package.json +4 -4
@@ -0,0 +1,275 @@
1
+ import { extractChatThreadRef } from './chat.utils.js';
2
+ function formatTimestamp(value) {
3
+ if (!value)
4
+ return 0;
5
+ const time = new Date(String(value)).getTime();
6
+ return Number.isFinite(time) ? time : 0;
7
+ }
8
+ function getAuditAuthKey(audit) {
9
+ if (audit.action !== 'runtime.auth_required' && audit.action !== 'runtime.auth_resolved')
10
+ return null;
11
+ const method = audit.toolName || null;
12
+ const entry = audit.entry || null;
13
+ if (!method && !entry)
14
+ return null;
15
+ return `${audit.session ?? ''}:${method ?? ''}:${entry ?? ''}`;
16
+ }
17
+ function buildRuntimeSessionDescription(audit, fallback) {
18
+ const tool = audit.toolName ? `工具 ${audit.toolName}` : null;
19
+ return tool ?? fallback;
20
+ }
21
+ function buildApprovalDecisionDescription(audit, relatedApproval, decision) {
22
+ const toolName = audit.toolName || relatedApproval?.toolName || null;
23
+ const risk = relatedApproval?.risk ? `${relatedApproval.risk} 风险` : null;
24
+ const reason = relatedApproval?.reason?.trim() || null;
25
+ const lead = decision === 'approved' ? '收件箱已批准工具执行。' : '收件箱已拒绝工具执行。';
26
+ const parts = [toolName, risk, reason].filter(Boolean);
27
+ return parts.length > 0 ? `${lead} ${parts.join(' · ')}` : lead;
28
+ }
29
+ export function buildAuditDetailRecord(audit, relatedApproval) {
30
+ return {
31
+ action: audit.action,
32
+ actor: audit.actor,
33
+ actorRole: audit.actorRole,
34
+ onBehalfOf: audit.onBehalfOf || undefined,
35
+ session: audit.session || undefined,
36
+ entry: audit.entry || undefined,
37
+ toolCallId: audit.toolCallId || undefined,
38
+ toolName: audit.toolName || undefined,
39
+ approval: audit.approval || undefined,
40
+ policy: audit.policy || undefined,
41
+ policyVersion: audit.policyVersion || undefined,
42
+ createdAt: audit.createdAt,
43
+ relatedApproval: relatedApproval
44
+ ? {
45
+ target: relatedApproval.target,
46
+ toolName: relatedApproval.toolName,
47
+ risk: relatedApproval.risk,
48
+ status: relatedApproval.status,
49
+ reason: relatedApproval.reason || undefined,
50
+ }
51
+ : undefined,
52
+ };
53
+ }
54
+ export function formatInboxStatusLabel(status) {
55
+ if (!status)
56
+ return null;
57
+ switch (status) {
58
+ case 'pending':
59
+ return '待处理';
60
+ case 'resolved':
61
+ return '已完成';
62
+ case 'approved':
63
+ return '已批准';
64
+ case 'rejected':
65
+ return '已拒绝';
66
+ case 'active':
67
+ return '运行中';
68
+ case 'paused':
69
+ return '已暂停';
70
+ case 'completed':
71
+ return '已完成';
72
+ case 'error':
73
+ return '异常';
74
+ default:
75
+ return status;
76
+ }
77
+ }
78
+ export function formatAuditActorRole(role) {
79
+ switch (role) {
80
+ case 'system':
81
+ return '系统';
82
+ case 'human':
83
+ return '人工';
84
+ case 'secretary':
85
+ return '秘书';
86
+ default:
87
+ return role || '—';
88
+ }
89
+ }
90
+ export function createResolvedAuthTimestampsIndex(audits) {
91
+ const resolvedAuthTimestampsByKey = new Map();
92
+ for (const audit of audits) {
93
+ if (audit.action !== 'runtime.auth_resolved')
94
+ continue;
95
+ const authKey = getAuditAuthKey(audit);
96
+ if (!authKey)
97
+ continue;
98
+ const timestamps = resolvedAuthTimestampsByKey.get(authKey) ?? [];
99
+ timestamps.push(formatTimestamp(audit.createdAt));
100
+ resolvedAuthTimestampsByKey.set(authKey, timestamps);
101
+ }
102
+ return resolvedAuthTimestampsByKey;
103
+ }
104
+ export function buildAuditPresentation(audit, resolvedAuthTimestampsByKey, relatedApproval) {
105
+ const thread = audit.entry || relatedApproval?.target || null;
106
+ const about = relatedApproval?.target ?? audit.entry ?? audit.approval ?? null;
107
+ const { chatId, threadId } = extractChatThreadRef(thread);
108
+ const actorRoleLabel = formatAuditActorRole(audit.actorRole);
109
+ if (audit.action === 'runtime.auth_required') {
110
+ const method = audit.toolName || null;
111
+ const authKey = getAuditAuthKey(audit);
112
+ const createdAtTs = formatTimestamp(audit.createdAt);
113
+ const resolvedAtTs = authKey ? (resolvedAuthTimestampsByKey.get(authKey) ?? []) : [];
114
+ const isResolved = resolvedAtTs.some((value) => value >= createdAtTs);
115
+ return {
116
+ title: method ? `认证请求 · ${method}` : '认证请求',
117
+ description: method ? `运行时需要完成 ${method} 认证后才能继续。` : '运行时需要额外认证后才能继续。',
118
+ category: 'auth_required',
119
+ status: isResolved ? 'resolved' : 'pending',
120
+ chatId,
121
+ threadId,
122
+ thread,
123
+ about,
124
+ authUrl: null,
125
+ authMethod: method,
126
+ authMessage: null,
127
+ actorRoleLabel,
128
+ };
129
+ }
130
+ if (audit.action === 'runtime.auth_resolved') {
131
+ const method = audit.toolName || null;
132
+ return {
133
+ title: method ? `认证完成 · ${method}` : '认证完成',
134
+ description: '运行时认证已完成。',
135
+ category: 'audit',
136
+ status: 'resolved',
137
+ chatId,
138
+ threadId,
139
+ thread,
140
+ about,
141
+ authUrl: null,
142
+ authMethod: method,
143
+ authMessage: null,
144
+ actorRoleLabel,
145
+ };
146
+ }
147
+ if (audit.action === 'runtime.tool_call.waiting_approval') {
148
+ const toolName = audit.toolName || relatedApproval?.toolName || null;
149
+ const risk = relatedApproval?.risk ? `${relatedApproval.risk} 风险` : null;
150
+ return {
151
+ title: toolName ? `工具请求 · ${toolName}` : '工具请求',
152
+ description: [risk, '已进入审批队列'].filter(Boolean).join(' · ') || '工具调用已进入审批队列。',
153
+ category: 'audit',
154
+ status: undefined,
155
+ chatId,
156
+ threadId,
157
+ thread,
158
+ about,
159
+ authUrl: null,
160
+ authMethod: null,
161
+ authMessage: null,
162
+ actorRoleLabel,
163
+ };
164
+ }
165
+ if (audit.action === 'inbox.approval.approved') {
166
+ return {
167
+ title: '授权已批准',
168
+ description: buildApprovalDecisionDescription(audit, relatedApproval, 'approved'),
169
+ category: 'audit',
170
+ status: 'approved',
171
+ chatId,
172
+ threadId,
173
+ thread,
174
+ about,
175
+ authUrl: null,
176
+ authMethod: null,
177
+ authMessage: null,
178
+ actorRoleLabel,
179
+ };
180
+ }
181
+ if (audit.action === 'inbox.approval.rejected') {
182
+ return {
183
+ title: '授权已拒绝',
184
+ description: buildApprovalDecisionDescription(audit, relatedApproval, 'rejected'),
185
+ category: 'audit',
186
+ status: 'rejected',
187
+ chatId,
188
+ threadId,
189
+ thread,
190
+ about,
191
+ authUrl: null,
192
+ authMethod: null,
193
+ authMessage: null,
194
+ actorRoleLabel,
195
+ };
196
+ }
197
+ if (audit.action === 'runtime.session.active') {
198
+ return {
199
+ title: '运行时已启动',
200
+ description: buildRuntimeSessionDescription(audit, '运行时会话开始执行。'),
201
+ category: 'audit',
202
+ status: 'active',
203
+ chatId,
204
+ threadId,
205
+ thread,
206
+ about,
207
+ authUrl: null,
208
+ authMethod: null,
209
+ authMessage: null,
210
+ actorRoleLabel,
211
+ };
212
+ }
213
+ if (audit.action === 'runtime.session.paused') {
214
+ return {
215
+ title: '运行时已暂停',
216
+ description: buildRuntimeSessionDescription(audit, '运行时会话已暂停。'),
217
+ category: 'audit',
218
+ status: 'paused',
219
+ chatId,
220
+ threadId,
221
+ thread,
222
+ about,
223
+ authUrl: null,
224
+ authMethod: null,
225
+ authMessage: null,
226
+ actorRoleLabel,
227
+ };
228
+ }
229
+ if (audit.action === 'runtime.session.completed') {
230
+ return {
231
+ title: '运行时已完成',
232
+ description: buildRuntimeSessionDescription(audit, '运行时会话已完成。'),
233
+ category: 'audit',
234
+ status: 'completed',
235
+ chatId,
236
+ threadId,
237
+ thread,
238
+ about,
239
+ authUrl: null,
240
+ authMethod: null,
241
+ authMessage: null,
242
+ actorRoleLabel,
243
+ };
244
+ }
245
+ if (audit.action === 'runtime.session.error') {
246
+ return {
247
+ title: '运行时异常',
248
+ description: buildRuntimeSessionDescription(audit, '运行时会话执行失败。'),
249
+ category: 'audit',
250
+ status: 'error',
251
+ chatId,
252
+ threadId,
253
+ thread,
254
+ about,
255
+ authUrl: null,
256
+ authMethod: null,
257
+ authMessage: null,
258
+ actorRoleLabel,
259
+ };
260
+ }
261
+ return {
262
+ title: audit.action,
263
+ description: actorRoleLabel,
264
+ category: 'audit',
265
+ status: undefined,
266
+ chatId,
267
+ threadId,
268
+ thread,
269
+ about,
270
+ authUrl: null,
271
+ authMethod: null,
272
+ authMessage: null,
273
+ actorRoleLabel,
274
+ };
275
+ }
@@ -13,7 +13,7 @@ export declare const auditResource: import("@undefineds.co/drizzle-solid/dist/co
13
13
  policyVersion: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
14
14
  createdAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
15
15
  }>>;
16
- export declare function buildAuditSubjectPath(auditId: string, createdAt?: Date | string | number): string;
16
+ export declare function extractAuditIdFromAuditRef(auditRef: string | null | undefined): string | null;
17
17
  export declare const auditTable: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
18
18
  id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
19
19
  action: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
@@ -1,4 +1,4 @@
1
- import { podTable, uri, string, timestamp, id } from '@undefineds.co/drizzle-solid';
1
+ import { extractPodResourceTemplateValue, podTable, uri, string, timestamp, id } from '@undefineds.co/drizzle-solid';
2
2
  import { UDFS, DCTerms } from './namespaces.js';
3
3
  // Append-only audit entry resource (separate from Solid inbox notifications).
4
4
  // Audit entries are independent events; session/chat/thread are optional relations,
@@ -29,13 +29,8 @@ export const auditResource = podTable('audit', {
29
29
  namespace: UDFS,
30
30
  subjectTemplate: '{yyyy}/{MM}/{dd}.ttl#{id}',
31
31
  });
32
- export function buildAuditSubjectPath(auditId, createdAt = new Date()) {
33
- const date = createdAt instanceof Date ? createdAt : new Date(createdAt);
34
- const safeDate = Number.isFinite(date.getTime()) ? date : new Date();
35
- const yyyy = String(safeDate.getUTCFullYear());
36
- const mm = String(safeDate.getUTCMonth() + 1).padStart(2, '0');
37
- const dd = String(safeDate.getUTCDate()).padStart(2, '0');
38
- return `/.data/audits/${yyyy}/${mm}/${dd}.ttl#${encodeURIComponent(auditId)}`;
32
+ export function extractAuditIdFromAuditRef(auditRef) {
33
+ return extractPodResourceTemplateValue(auditResource, auditRef);
39
34
  }
40
35
  // Compatibility alias. New model code should prefer `auditResource`.
41
36
  export const auditTable = auditResource;
@@ -1,4 +1,4 @@
1
- export declare const chatRepository: import("./repository").PodRepositoryDescriptor<import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
1
+ export declare const chatRepository: import("@undefineds.co/drizzle-solid/dist/core/repository").PodRepositoryDescriptor<import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
2
2
  id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
3
3
  title: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
4
4
  description: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
@@ -0,0 +1,9 @@
1
+ export declare const toTimestamp: (value: unknown, fallback?: number) => number;
2
+ export interface ChatThreadRef {
3
+ chatId: string | null;
4
+ threadId: string | null;
5
+ }
6
+ export declare function extractChatIdFromChatRef(chatRef: string | null | undefined): string | null;
7
+ export declare function extractThreadIdFromThreadRef(threadRef: string | null | undefined): string | null;
8
+ export declare function extractChatThreadRef(uri: string | null | undefined): ChatThreadRef;
9
+ export declare function resolveThreadChatId(thread: Pick<Record<string, unknown>, 'chat'> | null | undefined): string | null;
@@ -0,0 +1,33 @@
1
+ import { extractPodResourceTemplateValue, parsePodResourceRef } from '@undefineds.co/drizzle-solid';
2
+ import { chatResource } from './chat.schema.js';
3
+ import { threadResource } from './thread.schema.js';
4
+ export const toTimestamp = (value, fallback = 0) => {
5
+ if (value instanceof Date)
6
+ return value.getTime();
7
+ if (typeof value === 'string') {
8
+ const ms = new Date(value).getTime();
9
+ return Number.isNaN(ms) ? fallback : ms;
10
+ }
11
+ if (typeof value === 'number')
12
+ return value;
13
+ return fallback;
14
+ };
15
+ export function extractChatIdFromChatRef(chatRef) {
16
+ return extractPodResourceTemplateValue(threadResource, chatRef, 'chat')
17
+ ?? extractPodResourceTemplateValue(chatResource, chatRef);
18
+ }
19
+ export function extractThreadIdFromThreadRef(threadRef) {
20
+ return extractPodResourceTemplateValue(threadResource, threadRef);
21
+ }
22
+ export function extractChatThreadRef(uri) {
23
+ if (!uri)
24
+ return { chatId: null, threadId: null };
25
+ const parsed = parsePodResourceRef(threadResource, uri);
26
+ return {
27
+ chatId: parsed?.templateValues.chat ?? null,
28
+ threadId: parsed?.templateValues.id ?? null,
29
+ };
30
+ }
31
+ export function resolveThreadChatId(thread) {
32
+ return extractChatIdFromChatRef(typeof thread?.chat === 'string' ? thread.chat : null);
33
+ }
@@ -1,4 +1,4 @@
1
- export declare const contactRepository: import("./repository").PodRepositoryDescriptor<import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
1
+ export declare const contactRepository: import("@undefineds.co/drizzle-solid/dist/core/repository").PodRepositoryDescriptor<import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
2
2
  id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
3
3
  name: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
4
4
  avatarUrl: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
@@ -5,6 +5,13 @@ export declare const ContactType: {
5
5
  readonly GROUP: "group";
6
6
  };
7
7
  export type ContactTypeValue = typeof ContactType[keyof typeof ContactType];
8
+ export declare const ContactGender: {
9
+ readonly MALE: "male";
10
+ readonly FEMALE: "female";
11
+ readonly BOT: "bot";
12
+ readonly UNKNOWN: "unknown";
13
+ };
14
+ export type ContactGenderValue = typeof ContactGender[keyof typeof ContactGender];
8
15
  export declare const ContactClass: {
9
16
  readonly PERSON: string;
10
17
  readonly AGENT: string;
@@ -17,6 +24,7 @@ type ContactClassifier = {
17
24
  };
18
25
  export declare function isGroupContact(contact: ContactClassifier | null | undefined): boolean;
19
26
  export declare function isAgentContact(contact: ContactClassifier | null | undefined): boolean;
27
+ export declare function normalizeContactGender(value: string | null | undefined, fallback?: ContactGenderValue): ContactGenderValue | undefined;
20
28
  /**
21
29
  * Contact Table - Unified contact index for all contact types.
22
30
  */
@@ -6,6 +6,12 @@ export const ContactType = {
6
6
  AGENT: 'agent',
7
7
  GROUP: 'group',
8
8
  };
9
+ export const ContactGender = {
10
+ MALE: 'male',
11
+ FEMALE: 'female',
12
+ BOT: 'bot',
13
+ UNKNOWN: 'unknown',
14
+ };
9
15
  export const ContactClass = {
10
16
  PERSON: UDFS.PersonContact,
11
17
  AGENT: UDFS.AgentContact,
@@ -17,6 +23,12 @@ export function isGroupContact(contact) {
17
23
  export function isAgentContact(contact) {
18
24
  return contact?.rdfType === ContactClass.AGENT || contact?.contactType === ContactType.AGENT;
19
25
  }
26
+ export function normalizeContactGender(value, fallback) {
27
+ if (value === ContactGender.MALE || value === ContactGender.FEMALE || value === ContactGender.BOT || value === ContactGender.UNKNOWN) {
28
+ return value;
29
+ }
30
+ return fallback;
31
+ }
20
32
  /**
21
33
  * Contact Table - Unified contact index for all contact types.
22
34
  */
@@ -2,7 +2,7 @@ import { id, integer, podTable, string, timestamp, uri } from "@undefineds.co/dr
2
2
  import { XPOD_CREDENTIAL } from "./namespaces.js";
3
3
  export const credentialTable = podTable("credential", {
4
4
  id: id("id"),
5
- provider: uri("provider").predicate(XPOD_CREDENTIAL.provider),
5
+ provider: uri("provider").predicate(XPOD_CREDENTIAL.provider).link("aiProvider"),
6
6
  service: string("service").predicate(XPOD_CREDENTIAL.service).notNull().default("ai"),
7
7
  status: string("status").predicate(XPOD_CREDENTIAL.status).notNull().default("active"),
8
8
  apiKey: string("apiKey").predicate(XPOD_CREDENTIAL.apiKey),
@@ -2,6 +2,35 @@
2
2
  "version": "1.0.0",
3
3
  "updatedAt": "2026-03-16",
4
4
  "models": [
5
+ {
6
+ "id": "linx-lite",
7
+ "provider": "undefineds",
8
+ "displayName": "LinX Lite",
9
+ "description": "Fast undefineds model for LinX companion, routing, and lightweight assistant tasks.",
10
+ "contextLength": 1000000,
11
+ "maxOutputTokens": 8192,
12
+ "capabilities": [
13
+ "chat",
14
+ "function-calling",
15
+ "streaming",
16
+ "json-mode"
17
+ ],
18
+ "isDefault": true
19
+ },
20
+ {
21
+ "id": "linx",
22
+ "provider": "undefineds",
23
+ "displayName": "LinX",
24
+ "description": "undefineds general LinX assistant model.",
25
+ "contextLength": 1000000,
26
+ "maxOutputTokens": 8192,
27
+ "capabilities": [
28
+ "chat",
29
+ "function-calling",
30
+ "streaming",
31
+ "json-mode"
32
+ ]
33
+ },
5
34
  {
6
35
  "id": "anthropic/claude-3.5-sonnet",
7
36
  "provider": "anthropic",
@@ -2,6 +2,16 @@
2
2
  "version": "1.0.0",
3
3
  "updatedAt": "2026-03-16",
4
4
  "providers": [
5
+ {
6
+ "slug": "undefineds",
7
+ "displayName": "undefineds",
8
+ "baseUrl": "https://api.undefineds.co/v1",
9
+ "homepage": "https://undefineds.co/linx",
10
+ "logoUrl": "https://undefineds.co/favicon.ico",
11
+ "description": "undefineds LinX 模型服务",
12
+ "supportedFeatures": ["chat", "function-calling", "streaming"],
13
+ "authType": "bearer"
14
+ },
5
15
  {
6
16
  "slug": "openai",
7
17
  "displayName": "OpenAI",
@@ -1,11 +1,24 @@
1
- export declare function buildGrantSubjectPath(grantId: string): string;
2
1
  export declare const grantResource: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
3
2
  id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
4
3
  rdfType: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "uri", true, true>;
5
4
  target: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
6
5
  action: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
6
+ title: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
7
+ summary: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
8
+ body: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
9
+ schema: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
10
+ pageKind: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
11
+ wikiStatus: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
12
+ tags: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
13
+ source: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
14
+ sourceHash: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
15
+ compiledAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
16
+ compiledFrom: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "uri", false, false>;
17
+ related: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "uri", false, false>;
7
18
  effect: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
8
19
  riskCeiling: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
20
+ policy: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
21
+ context: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
9
22
  decisionBy: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
10
23
  decisionRole: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
11
24
  onBehalfOf: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
@@ -17,8 +30,22 @@ export declare const grantTable: import("@undefineds.co/drizzle-solid/dist/core/
17
30
  rdfType: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "uri", true, true>;
18
31
  target: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
19
32
  action: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
33
+ title: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
34
+ summary: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
35
+ body: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
36
+ schema: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
37
+ pageKind: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
38
+ wikiStatus: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
39
+ tags: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
40
+ source: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
41
+ sourceHash: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
42
+ compiledAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
43
+ compiledFrom: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "uri", false, false>;
44
+ related: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "uri", false, false>;
20
45
  effect: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
21
46
  riskCeiling: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
47
+ policy: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
48
+ context: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
22
49
  decisionBy: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
23
50
  decisionRole: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
24
51
  onBehalfOf: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
@@ -1,21 +1,34 @@
1
- import { podTable, uri, string, timestamp, id } from '@undefineds.co/drizzle-solid';
1
+ import { podTable, uri, string, text, timestamp, id } from '@undefineds.co/drizzle-solid';
2
2
  import { RDF, ODRL, UDFS, DCTerms } from './namespaces.js';
3
- export function buildGrantSubjectPath(grantId) {
4
- return `/settings/autonomy/grants.ttl#${encodeURIComponent(grantId)}`;
5
- }
6
3
  // Persistent delegation grant resource generated by "do not ask again" decisions.
7
4
  // This is the durable "delegation" layer (distinct from one-off approvals and append-only audit entries).
8
5
  export const grantResource = podTable('grant', {
9
6
  id: id('id'),
10
- // Table-level type writes odrl:Policy. Keep the project-specific class as
7
+ // Resource-level type writes odrl:Policy. Keep the project-specific class as
11
8
  // an additional rdf:type, so readback treats RDF class membership as multi-valued.
12
9
  rdfType: uri('rdfType').array().predicate(RDF.type).notNull().default([UDFS.AutonomyGrant]),
13
10
  // Minimal ODRL surface (CP0): allow/deny action on target.
14
11
  target: uri('target').predicate(ODRL.target).notNull(),
15
12
  action: uri('action').predicate(ODRL.action).notNull(),
13
+ // Pod version of the LLM Wiki page contract. The grant remains an ODRL
14
+ // policy, but its maintainable surface is a wiki page with provenance.
15
+ title: string('title').predicate(DCTerms.title),
16
+ summary: text('summary').predicate(UDFS.summary),
17
+ body: text('body').predicate(UDFS.body),
18
+ schema: uri('schema').predicate(DCTerms.conformsTo),
19
+ pageKind: string('pageKind').predicate(UDFS.pageKind),
20
+ wikiStatus: string('wikiStatus').predicate(UDFS.status),
21
+ tags: text('tags').predicate(UDFS.tags),
22
+ source: string('source').predicate(UDFS.source),
23
+ sourceHash: string('sourceHash').predicate(UDFS.sourceHash),
24
+ compiledAt: timestamp('compiledAt').predicate(UDFS.compiledAt),
25
+ compiledFrom: uri('compiledFrom').array().predicate(UDFS.compiledFrom),
26
+ related: uri('related').array().predicate(UDFS.related),
16
27
  // Extensions
17
28
  effect: string('effect').predicate(UDFS.effect).notNull(),
18
29
  riskCeiling: string('riskCeiling').predicate(UDFS.riskCeiling),
30
+ policy: text('policy').predicate(UDFS.policy),
31
+ context: text('context').predicate(UDFS.context),
19
32
  // Delegation identity (WebID semantics)
20
33
  decisionBy: uri('decisionBy').predicate(UDFS.decisionBy).notNull(),
21
34
  decisionRole: string('decisionRole').predicate(UDFS.decisionRole).notNull(),
@@ -24,10 +37,11 @@ export const grantResource = podTable('grant', {
24
37
  createdAt: timestamp('createdAt').predicate(DCTerms.created).notNull().defaultNow(),
25
38
  revokedAt: timestamp('revokedAt').predicate(UDFS.revokedAt),
26
39
  }, {
27
- base: '/settings/autonomy/grants.ttl',
40
+ base: '/settings/autonomy/grants/',
41
+ sparqlEndpoint: '/settings/autonomy/grants/-/sparql',
28
42
  type: ODRL.Policy,
29
43
  namespace: ODRL,
30
- subjectTemplate: '#{id}',
44
+ subjectTemplate: '{id}.ttl',
31
45
  });
32
46
  // Compatibility alias. New model code should prefer `grantResource`.
33
47
  export const grantTable = grantResource;
package/dist/index.d.ts CHANGED
@@ -3,10 +3,11 @@ export * from "./vocab";
3
3
  export * from './profile';
4
4
  export * from './profile.repository';
5
5
  export * from './profile.schema';
6
- export { contactTable, ContactClass, ContactType, isAgentContact, isGroupContact, type ContactRow, type ContactInsert, type ContactUpdate, type ContactClassValue, type ContactTypeValue, } from './contact.schema';
6
+ export { ContactGender, contactTable, ContactClass, ContactType, isAgentContact, isGroupContact, normalizeContactGender, type ContactRow, type ContactInsert, type ContactUpdate, type ContactClassValue, type ContactGenderValue, type ContactTypeValue, } from './contact.schema';
7
7
  export { contactRepository } from './contact.repository';
8
8
  export { chatResource, chatTable, type ChatMetadata, type ChatMemberRole, type ChatRow, type ChatInsert, type ChatUpdate, } from './chat.schema';
9
9
  export { chatRepository } from './chat.repository';
10
+ export { extractChatIdFromChatRef, extractChatThreadRef, extractThreadIdFromThreadRef, resolveThreadChatId, toTimestamp, type ChatThreadRef, } from './chat.utils';
10
11
  export { threadResource, threadTable, type ThreadRow, type ThreadInsert, type ThreadUpdate, } from './thread.schema';
11
12
  export { threadRepository } from './thread.repository';
12
13
  export { messageResource, messageTable, type MessageRow, type MessageInsert, type MessageUpdate, } from './message.schema';
@@ -20,11 +21,12 @@ export { settingsTable, SETTING_KEYS, type SettingKey, type SettingsRow, type Se
20
21
  export { agentTable, type AgentRow, type AgentInsert, type AgentUpdate, } from './agent.schema';
21
22
  export { agentRepository } from './agent.repository';
22
23
  export { DEFAULT_AGENT_PROVIDERS, type AgentProviderMetadata, type AgentModelOption, } from './agent.providers';
23
- export { sessionResource, sessionTable, buildSessionSubjectPath, type SessionType, type SessionStatus, type SessionRow, type SessionInsert, type SessionUpdate, } from './session';
24
+ export { sessionResource, sessionTable, buildRuntimeSessionIri, extractRuntimeSessionId, type SessionType, type SessionStatus, type SessionRow, type SessionInsert, type SessionUpdate, } from './session';
24
25
  export { sessionRepository } from './session.repository';
25
- export { approvalResource, approvalTable, buildApprovalSubjectPath, type ApprovalRow, type ApprovalInsert, type ApprovalUpdate, } from './approval.schema';
26
- export { auditResource, auditTable, buildAuditSubjectPath, type AuditRow, type AuditInsert, type AuditUpdate, } from './audit.schema';
27
- export { grantResource, grantTable, buildGrantSubjectPath, type GrantRow, type GrantInsert, type GrantUpdate, } from './grant.schema';
26
+ export { approvalResource, approvalTable, extractApprovalIdFromApprovalRef, type ApprovalRow, type ApprovalInsert, type ApprovalUpdate, } from './approval.schema';
27
+ export { auditResource, auditTable, extractAuditIdFromAuditRef, type AuditRow, type AuditInsert, type AuditUpdate, } from './audit.schema';
28
+ export { buildAuditDetailRecord, buildAuditPresentation, createResolvedAuthTimestampsIndex, formatAuditActorRole, formatInboxStatusLabel, type AuditPresentation, } from './audit.presentation';
29
+ export { grantResource, grantTable, type GrantRow, type GrantInsert, type GrantUpdate, } from './grant.schema';
28
30
  export { inboxNotificationTable, type InboxNotificationRow, type InboxNotificationInsert, type InboxNotificationUpdate, } from './inbox-notification.schema';
29
31
  export { ApprovalVocab, AuditVocab, GrantVocab, InboxNotificationVocab } from './vocab/sidecar.vocab';
30
32
  export * from './sidecar/sidecar-events';
@@ -34,10 +36,10 @@ export { extensionSchema } from './extension';
34
36
  export { credentialTable, type CredentialRow, type CredentialInsert, type CredentialUpdate, } from "./credential.schema";
35
37
  export { aiProviderTable, type AIProviderRow, type AIProviderInsert, type AIProviderUpdate, } from "./ai-provider.schema";
36
38
  export { aiModelTable, type AIModelRow, type AIModelInsert, type AIModelUpdate, } from "./ai-model.schema";
37
- export { aiConfigModelUri, aiConfigProviderUri, buildAIConfigMutationPlan, buildAIConfigProviderStateMap, getAIConfigDefaultBaseUrl, getAIConfigProviderCatalog, getAIConfigProviderFamilyIds, getAIConfigProviderMetadata, getDefaultAIConfigCredentialId, normalizeAIConfigProviderId, normalizeAIConfigResourceId, sameAIConfigProviderFamily, type AIConfigModel, type AIConfigMutationPlan, type AIConfigProviderCatalogEntry, type AIConfigProviderState, type AIConfigUpdate, type BuildAIConfigProviderStateMapOptions, } from './ai-config';
38
- export { buildAcpPermissionResponse, buildWatchThreadMetadata, buildWatchTranscriptMessages, buildWatchUserInputResponse, createWatchSessionId, detectWatchAuthFailure, formatWatchAutoFallbackMessage, formatWatchBackendAuthMessage, extractWatchSessionIdFromJsonLine, getWatchArchiveRelativePaths, getWatchAuthLoginCommand, looksLikeWatchAuthFailureText, normalizeAcpInteractionRequest, normalizeAcpRequest, normalizeAcpSessionNotification, normalizeCodexAppServerNotification, normalizeCodexAppServerRequest, normalizeWatchCredentialSource, parseWatchClaudeAuthStatus, parseWatchJsonLine, parseWatchJsonProtocolLine, resolveWatchAutoApprovalDecision, resolveWatchCredentialSourceResolution, resolveWatchInteractionAutoResponse, resolveWatchQuestionAnswer, shouldAttemptCloudCredentialProbe, WATCH_EVENTS_FILE_NAME, WATCH_HOME_DIRNAME, WATCH_SESSIONS_DIRNAME, WATCH_SESSION_FILE_NAME, type WatchApprovalDecision, type WatchApprovalRequest, type CreateWatchSessionIdOptions, type WatchAuthFailure, type WatchAuthState, type WatchAuthStatus, type WatchArchiveRelativePaths, type WatchBackend, type WatchCloudCredentialProbe, type WatchCloudCredentialProbeStatus, type WatchCredentialSource, type WatchCredentialSourceResolution, type WatchEventLogEntry, type WatchMode, type WatchNormalizedEvent, type WatchOutputStream, type WatchResolvedCredentialSource, type WatchRuntime, type WatchSessionRecord, type WatchSessionStatus, type WatchThreadMetadata, type WatchTranscriptMessage, type WatchTranscriptMessageRole, } from './watch';
39
+ export { aiConfigModelRef, aiConfigProviderRef, buildAIConfigMutationPlan, buildAIConfigProviderStateMap, getAIConfigDefaultBaseUrl, getAIConfigProviderCatalog, getAIConfigProviderFamilyIds, getAIConfigProviderMetadata, getDefaultAIConfigCredentialId, normalizeAIConfigProviderId, normalizeAIConfigModelId, normalizeAIConfigResourceId, sameAIConfigProviderFamily, type AIConfigModel, type AIConfigMutationPlan, type AIConfigProviderCatalogEntry, type AIConfigProviderState, type AIConfigUpdate, type BuildAIConfigProviderStateMapOptions, } from './ai-config';
40
+ export { buildAcpPermissionResponse, buildWatchThreadMetadata, buildWatchTranscriptMessages, buildWatchUserInputResponse, createWatchSessionId, detectWatchAuthFailure, formatWatchAutoFallbackMessage, formatWatchBackendAuthMessage, extractWatchSessionIdFromJsonLine, getWatchArchiveRelativePaths, getWatchAuthLoginCommand, looksLikeWatchAuthFailureText, normalizeAcpInteractionRequest, normalizeAcpRequest, normalizeAcpSessionNotification, normalizeCodexAppServerNotification, normalizeCodexAppServerRequest, normalizeWatchCredentialSource, parseWatchClaudeAuthStatus, parseWatchJsonLine, parseWatchJsonProtocolLine, resolveWatchAutoApprovalDecision, resolveWatchCredentialSourceResolution, resolveWatchInteractionAutoResponse, resolveWatchQuestionAnswer, shouldAttemptCloudCredentialProbe, WATCH_EVENTS_FILE_NAME, WATCH_HOME_DIRNAME, WATCH_SESSIONS_DIRNAME, WATCH_SESSION_FILE_NAME, type WatchApprovalDecision, type WatchApprovalRequest, type CreateWatchSessionIdOptions, type WatchAuthFailure, type WatchAuthState, type WatchAuthStatus, type WatchArchiveRelativePaths, type WatchBackend, type WatchCloudCredentialProbe, type WatchCloudCredentialProbeStatus, type WatchCredentialSource, type WatchCredentialSourceResolution, type WatchEventLogEntry, type WatchMode, type WatchNormalizedEvent, type WatchOutputStream, type WatchResolvedCredentialSource, type WatchRuntime, type WatchSessionRecord, type WatchSessionStatus, type WatchThreadMetadata, type WatchTranscriptMessage, type WatchTranscriptMessageRole, type WatchTranscriptMessageSource, } from './watch';
39
41
  export { applySolidComunicaPatches, } from './comunica-patches';
40
- export { createRepositoryDescriptor, definePodRepository, findPodRowByStorageId, initSolidTables, resolveRowId, resolvePodUri, whereByPodStorageId, type AnyPodTable, type PodRepositoryDescriptor, type RepositoryCacheOptions, type RepositoryInvalidations, type RepositoryScope, type SolidDatabase, } from './repository';
42
+ export { createRepositoryDescriptor, definePodRepository, initSolidTables, type AnyPodTable, type PodRepositoryDescriptor, type RepositoryCacheOptions, type RepositoryInvalidations, type RepositoryScope, type SolidDatabase, } from './repository';
41
43
  export { importJobSchema } from './import';
42
44
  export { eq, ne, and, or, drizzle } from '@undefineds.co/drizzle-solid';
43
45
  export { solidResources, solidSchema } from './schema';