@undefineds.co/models 0.2.25 → 0.2.26

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.
@@ -3,6 +3,8 @@ export declare function extractApprovalIdFromApprovalRef(approvalRef: string | n
3
3
  export declare const approvalResource: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
4
4
  id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
5
5
  session: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
6
+ chat: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
7
+ thread: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
6
8
  toolCallId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
7
9
  toolName: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
8
10
  target: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
@@ -24,6 +26,8 @@ export declare const approvalResource: import("@undefineds.co/drizzle-solid/dist
24
26
  export declare const approvalTable: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
25
27
  id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
26
28
  session: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
29
+ chat: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
30
+ thread: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
27
31
  toolCallId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
28
32
  toolName: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
29
33
  target: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
@@ -1,5 +1,7 @@
1
1
  import { extractPodResourceTemplateValue, podTable, uri, string, text, timestamp, id } from '@undefineds.co/drizzle-solid';
2
2
  import { ODRL, UDFS, DCTerms } from './namespaces.js';
3
+ import { chatResource } from './chat.schema.js';
4
+ import { threadResource } from './thread.schema.js';
3
5
  export function buildApprovalSubjectPath(approvalId, createdAt = new Date()) {
4
6
  const date = createdAt instanceof Date ? createdAt : new Date(createdAt);
5
7
  const safeDate = Number.isFinite(date.getTime()) ? date : new Date();
@@ -19,6 +21,8 @@ export const approvalResource = podTable('approval', {
19
21
  id: id('id'),
20
22
  // Relations
21
23
  session: uri('session').predicate(UDFS.session).notNull(),
24
+ chat: uri('chat').predicate(UDFS.conversation).link(chatResource),
25
+ thread: uri('thread').predicate(UDFS.inThread).link(threadResource),
22
26
  toolCallId: string('toolCallId').predicate(UDFS.toolCallId).notNull(),
23
27
  // Request details
24
28
  toolName: string('toolName').predicate(UDFS.toolName).notNull(),
@@ -14,7 +14,7 @@ export interface AuditPresentation {
14
14
  authMessage: string | null;
15
15
  actorRoleLabel: string;
16
16
  }
17
- type RelatedApproval = Pick<ApprovalRow, 'target' | 'toolName' | 'risk' | 'reason' | 'status' | 'context'> | null | undefined;
17
+ type RelatedApproval = Pick<ApprovalRow, 'chat' | 'thread' | 'target' | 'toolName' | 'risk' | 'reason' | 'status' | 'context'> | null | undefined;
18
18
  export declare function buildAuditDetailRecord(audit: AuditRow, relatedApproval?: RelatedApproval): Record<string, unknown>;
19
19
  export declare function formatInboxStatusLabel(status?: string | null): string | null;
20
20
  export declare function formatAuditActorRole(role?: string | null): string;
@@ -33,6 +33,8 @@ export function buildAuditDetailRecord(audit, relatedApproval) {
33
33
  actorRole: audit.actorRole,
34
34
  onBehalfOf: audit.onBehalfOf || undefined,
35
35
  session: audit.session || undefined,
36
+ chat: audit.chat || undefined,
37
+ thread: audit.thread || undefined,
36
38
  entry: audit.entry || undefined,
37
39
  toolCallId: audit.toolCallId || undefined,
38
40
  toolName: audit.toolName || undefined,
@@ -42,6 +44,8 @@ export function buildAuditDetailRecord(audit, relatedApproval) {
42
44
  createdAt: audit.createdAt,
43
45
  relatedApproval: relatedApproval
44
46
  ? {
47
+ chat: relatedApproval.chat || undefined,
48
+ thread: relatedApproval.thread || undefined,
45
49
  target: relatedApproval.target,
46
50
  toolName: relatedApproval.toolName,
47
51
  risk: relatedApproval.risk,
@@ -102,9 +106,12 @@ export function createResolvedAuthTimestampsIndex(audits) {
102
106
  return resolvedAuthTimestampsByKey;
103
107
  }
104
108
  export function buildAuditPresentation(audit, resolvedAuthTimestampsByKey, relatedApproval) {
105
- const thread = audit.entry || relatedApproval?.target || null;
106
- const about = relatedApproval?.target ?? audit.entry ?? audit.approval ?? null;
109
+ const thread = audit.thread || relatedApproval?.thread || audit.entry || relatedApproval?.target || null;
110
+ const chat = audit.chat || relatedApproval?.chat || null;
111
+ const about = relatedApproval?.target ?? audit.entry ?? audit.approval ?? thread ?? null;
107
112
  const { chatId, threadId } = extractChatThreadRef(thread);
113
+ const chatRef = extractChatThreadRef(chat);
114
+ const resolvedChatId = chatId ?? chatRef.chatId;
108
115
  const actorRoleLabel = formatAuditActorRole(audit.actorRole);
109
116
  if (audit.action === 'runtime.auth_required') {
110
117
  const method = audit.toolName || null;
@@ -117,7 +124,7 @@ export function buildAuditPresentation(audit, resolvedAuthTimestampsByKey, relat
117
124
  description: method ? `运行时需要完成 ${method} 认证后才能继续。` : '运行时需要额外认证后才能继续。',
118
125
  category: 'auth_required',
119
126
  status: isResolved ? 'resolved' : 'pending',
120
- chatId,
127
+ chatId: resolvedChatId,
121
128
  threadId,
122
129
  thread,
123
130
  about,
@@ -134,7 +141,7 @@ export function buildAuditPresentation(audit, resolvedAuthTimestampsByKey, relat
134
141
  description: '运行时认证已完成。',
135
142
  category: 'audit',
136
143
  status: 'resolved',
137
- chatId,
144
+ chatId: resolvedChatId,
138
145
  threadId,
139
146
  thread,
140
147
  about,
@@ -152,7 +159,7 @@ export function buildAuditPresentation(audit, resolvedAuthTimestampsByKey, relat
152
159
  description: [risk, '已进入审批队列'].filter(Boolean).join(' · ') || '工具调用已进入审批队列。',
153
160
  category: 'audit',
154
161
  status: undefined,
155
- chatId,
162
+ chatId: resolvedChatId,
156
163
  threadId,
157
164
  thread,
158
165
  about,
@@ -168,7 +175,7 @@ export function buildAuditPresentation(audit, resolvedAuthTimestampsByKey, relat
168
175
  description: buildApprovalDecisionDescription(audit, relatedApproval, 'approved'),
169
176
  category: 'audit',
170
177
  status: 'approved',
171
- chatId,
178
+ chatId: resolvedChatId,
172
179
  threadId,
173
180
  thread,
174
181
  about,
@@ -184,7 +191,7 @@ export function buildAuditPresentation(audit, resolvedAuthTimestampsByKey, relat
184
191
  description: buildApprovalDecisionDescription(audit, relatedApproval, 'rejected'),
185
192
  category: 'audit',
186
193
  status: 'rejected',
187
- chatId,
194
+ chatId: resolvedChatId,
188
195
  threadId,
189
196
  thread,
190
197
  about,
@@ -200,7 +207,7 @@ export function buildAuditPresentation(audit, resolvedAuthTimestampsByKey, relat
200
207
  description: buildRuntimeSessionDescription(audit, '运行时会话开始执行。'),
201
208
  category: 'audit',
202
209
  status: 'active',
203
- chatId,
210
+ chatId: resolvedChatId,
204
211
  threadId,
205
212
  thread,
206
213
  about,
@@ -216,7 +223,7 @@ export function buildAuditPresentation(audit, resolvedAuthTimestampsByKey, relat
216
223
  description: buildRuntimeSessionDescription(audit, '运行时会话已暂停。'),
217
224
  category: 'audit',
218
225
  status: 'paused',
219
- chatId,
226
+ chatId: resolvedChatId,
220
227
  threadId,
221
228
  thread,
222
229
  about,
@@ -232,7 +239,7 @@ export function buildAuditPresentation(audit, resolvedAuthTimestampsByKey, relat
232
239
  description: buildRuntimeSessionDescription(audit, '运行时会话已完成。'),
233
240
  category: 'audit',
234
241
  status: 'completed',
235
- chatId,
242
+ chatId: resolvedChatId,
236
243
  threadId,
237
244
  thread,
238
245
  about,
@@ -248,7 +255,7 @@ export function buildAuditPresentation(audit, resolvedAuthTimestampsByKey, relat
248
255
  description: buildRuntimeSessionDescription(audit, '运行时会话执行失败。'),
249
256
  category: 'audit',
250
257
  status: 'error',
251
- chatId,
258
+ chatId: resolvedChatId,
252
259
  threadId,
253
260
  thread,
254
261
  about,
@@ -263,7 +270,7 @@ export function buildAuditPresentation(audit, resolvedAuthTimestampsByKey, relat
263
270
  description: actorRoleLabel,
264
271
  category: 'audit',
265
272
  status: undefined,
266
- chatId,
273
+ chatId: resolvedChatId,
267
274
  threadId,
268
275
  thread,
269
276
  about,
@@ -6,6 +6,8 @@ export declare const auditResource: import("@undefineds.co/drizzle-solid/dist/co
6
6
  actorRole: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
7
7
  onBehalfOf: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
8
8
  session: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
9
+ chat: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
10
+ thread: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
9
11
  entry: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
10
12
  toolCallId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
11
13
  toolName: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
@@ -22,6 +24,8 @@ export declare const auditTable: import("@undefineds.co/drizzle-solid/dist/core/
22
24
  actorRole: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
23
25
  onBehalfOf: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
24
26
  session: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
27
+ chat: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
28
+ thread: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
25
29
  entry: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
26
30
  toolCallId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
27
31
  toolName: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
@@ -1,5 +1,7 @@
1
1
  import { extractPodResourceTemplateValue, podTable, uri, string, timestamp, id } from '@undefineds.co/drizzle-solid';
2
2
  import { UDFS, DCTerms } from './namespaces.js';
3
+ import { chatResource } from './chat.schema.js';
4
+ import { threadResource } from './thread.schema.js';
3
5
  export function buildAuditSubjectPath(auditId, createdAt = new Date()) {
4
6
  const date = createdAt instanceof Date ? createdAt : new Date(createdAt);
5
7
  const safeDate = Number.isFinite(date.getTime()) ? date : new Date();
@@ -21,6 +23,8 @@ export const auditResource = podTable('audit', {
21
23
  onBehalfOf: uri('onBehalfOf').predicate(UDFS.onBehalfOf),
22
24
  // Relations
23
25
  session: uri('session').predicate(UDFS.session),
26
+ chat: uri('chat').predicate(UDFS.conversation).link(chatResource),
27
+ thread: uri('thread').predicate(UDFS.inThread).link(threadResource),
24
28
  entry: uri('entry').predicate(UDFS.entry),
25
29
  toolCallId: string('toolCallId').predicate(UDFS.toolCallId),
26
30
  toolName: string('toolName').predicate(UDFS.toolName),
package/dist/index.d.ts CHANGED
@@ -12,6 +12,8 @@ export { threadResource, threadTable, type ThreadRow, type ThreadInsert, type Th
12
12
  export { threadRepository } from './thread.repository';
13
13
  export { messageResource, messageTable, type MessageRow, type MessageInsert, type MessageUpdate, } from './message.schema';
14
14
  export { messageRepository } from './message.repository';
15
+ export { issueResource, issueTable, type IssueStatus, type IssuePriority, type IssueRow, type IssueInsert, type IssueUpdate, } from './issue.schema';
16
+ export { issueRepository } from './issue.repository';
15
17
  export { MessageBlockType, MessageBlockStatus, type BaseMessageBlock, type PlaceholderMessageBlock, type MainTextMessageBlock, type ThinkingMessageBlock, type ImageMessageBlock, type CodeMessageBlock, type ToolMessageBlock, type FileMessageBlock, type ErrorMessageBlock, type CitationMessageBlock, type MessageBlock, type MessageRichContent, createMessageBlock, isBlockType, parseMessageBlocks, serializeMessageBlocks, } from './types/message-block';
16
18
  export { type ToolApprovalBlock, type ToolCallBlock, type TaskProgressBlock, type CollaborationRichBlock, type ToolRisk, type ToolApprovalStatus, type ToolCallStatus, type TaskProgressStepStatus, } from "./types/collaboration-blocks";
17
19
  export * from "./fixtures/contracts-chat-contact";
package/dist/index.js CHANGED
@@ -26,6 +26,9 @@ export { threadResource, threadTable, } from './thread.schema.js';
26
26
  export { threadRepository } from './thread.repository.js';
27
27
  export { messageResource, messageTable, } from './message.schema.js';
28
28
  export { messageRepository } from './message.repository.js';
29
+ // Issue - user-facing work item that can be inspected through chat/thread
30
+ export { issueResource, issueTable, } from './issue.schema.js';
31
+ export { issueRepository } from './issue.repository.js';
29
32
  // Message Block - 消息块类型系统 (Block-based Message System)
30
33
  export { MessageBlockType, MessageBlockStatus, createMessageBlock, isBlockType, parseMessageBlocks, serializeMessageBlocks, } from './types/message-block.js';
31
34
  // Wave A CP0: fixtures for downstream parallel development
@@ -0,0 +1,69 @@
1
+ export declare const issueRepository: 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
+ id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
3
+ title: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
4
+ description: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
5
+ status: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
6
+ priority: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, true>;
7
+ labels: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "string", false, false>;
8
+ chat: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
9
+ thread: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
10
+ parentIssue: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
11
+ tasks: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "uri", false, false>;
12
+ createdBy: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
13
+ assignedTo: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
14
+ createdAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
15
+ updatedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
16
+ closedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
17
+ deletedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
18
+ }>>, {
19
+ id: string;
20
+ title: string;
21
+ description: string;
22
+ status: string;
23
+ priority: string;
24
+ labels: string[];
25
+ chat: string;
26
+ thread: string;
27
+ parentIssue: string;
28
+ tasks: string[];
29
+ createdBy: string;
30
+ assignedTo: string;
31
+ createdAt: Date;
32
+ updatedAt: Date;
33
+ closedAt: Date;
34
+ deletedAt: Date;
35
+ }, {
36
+ title: string;
37
+ id?: string | undefined;
38
+ description?: string | undefined;
39
+ status?: string | undefined;
40
+ priority?: string | undefined;
41
+ labels?: string[] | undefined;
42
+ chat?: string | undefined;
43
+ thread?: string | undefined;
44
+ parentIssue?: string | undefined;
45
+ tasks?: string[] | undefined;
46
+ createdBy?: string | undefined;
47
+ assignedTo?: string | undefined;
48
+ createdAt?: Date | undefined;
49
+ updatedAt?: Date | undefined;
50
+ closedAt?: Date | undefined;
51
+ deletedAt?: Date | undefined;
52
+ }, {
53
+ id?: string | null | undefined;
54
+ title?: string | undefined;
55
+ description?: string | null | undefined;
56
+ status?: string | undefined;
57
+ priority?: string | null | undefined;
58
+ labels?: string[] | null | undefined;
59
+ chat?: string | null | undefined;
60
+ thread?: string | null | undefined;
61
+ parentIssue?: string | null | undefined;
62
+ tasks?: string[] | null | undefined;
63
+ createdBy?: string | null | undefined;
64
+ assignedTo?: string | null | undefined;
65
+ createdAt?: Date | undefined;
66
+ updatedAt?: Date | undefined;
67
+ closedAt?: Date | null | undefined;
68
+ deletedAt?: Date | null | undefined;
69
+ }, Record<string, unknown>>;
@@ -0,0 +1,8 @@
1
+ import { definePodRepository } from './repository.js';
2
+ import { issueResource } from './issue.schema.js';
3
+ export const issueRepository = definePodRepository({
4
+ namespace: 'issue',
5
+ table: issueResource,
6
+ searchableFields: ['title', 'description'],
7
+ defaultSort: { field: 'updatedAt', direction: 'desc' },
8
+ });
@@ -0,0 +1,48 @@
1
+ export type IssueStatus = 'open' | 'triaging' | 'in_progress' | 'blocked' | 'resolved' | 'closed';
2
+ export type IssuePriority = 'low' | 'medium' | 'high' | 'urgent';
3
+ /**
4
+ * User-facing work item.
5
+ *
6
+ * Issue is the product entry for a requirement, bug, support item,
7
+ * investigation, or feature request. Executable slices live in Task.
8
+ * The visible process remains Chat/Thread/Message through chat/thread links.
9
+ */
10
+ export declare const issueResource: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
11
+ id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
12
+ title: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
13
+ description: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
14
+ status: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
15
+ priority: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, true>;
16
+ labels: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "string", false, false>;
17
+ chat: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
18
+ thread: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
19
+ parentIssue: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
20
+ tasks: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "uri", false, false>;
21
+ createdBy: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
22
+ assignedTo: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
23
+ createdAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
24
+ updatedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
25
+ closedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
26
+ deletedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
27
+ }>>;
28
+ export declare const issueTable: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
29
+ id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
30
+ title: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
31
+ description: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
32
+ status: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
33
+ priority: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, true>;
34
+ labels: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "string", false, false>;
35
+ chat: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
36
+ thread: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
37
+ parentIssue: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
38
+ tasks: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "uri", false, false>;
39
+ createdBy: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
40
+ assignedTo: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
41
+ createdAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
42
+ updatedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
43
+ closedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
44
+ deletedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
45
+ }>>;
46
+ export type IssueRow = typeof issueResource.$inferSelect;
47
+ export type IssueInsert = typeof issueResource.$inferInsert;
48
+ export type IssueUpdate = typeof issueResource.$inferUpdate;
@@ -0,0 +1,37 @@
1
+ import { id, podTable, string, text, timestamp, uri } from '@undefineds.co/drizzle-solid';
2
+ import { DCTerms, UDFS } from './namespaces.js';
3
+ import { chatResource } from './chat.schema.js';
4
+ import { threadResource } from './thread.schema.js';
5
+ /**
6
+ * User-facing work item.
7
+ *
8
+ * Issue is the product entry for a requirement, bug, support item,
9
+ * investigation, or feature request. Executable slices live in Task.
10
+ * The visible process remains Chat/Thread/Message through chat/thread links.
11
+ */
12
+ export const issueResource = podTable('issue', {
13
+ id: id('id'),
14
+ title: string('title').predicate(DCTerms.title).notNull(),
15
+ description: text('description').predicate(DCTerms.description),
16
+ status: string('status').predicate(UDFS.status).notNull().default('open'),
17
+ priority: string('priority').predicate(UDFS.priority).default('medium'),
18
+ labels: text('labels').array().predicate(UDFS.tags),
19
+ chat: uri('chat').predicate(UDFS.conversation).link(chatResource),
20
+ thread: uri('thread').predicate(UDFS.inThread).link(threadResource),
21
+ parentIssue: uri('parentIssue').predicate(UDFS.parentIssue).link('issue'),
22
+ tasks: uri('tasks').predicate(UDFS.task).array(),
23
+ createdBy: uri('createdBy').predicate(DCTerms.creator),
24
+ assignedTo: uri('assignedTo').predicate(UDFS.assignedTo),
25
+ createdAt: timestamp('createdAt').predicate(DCTerms.created).notNull().defaultNow(),
26
+ updatedAt: timestamp('updatedAt').predicate(DCTerms.modified).notNull().defaultNow(),
27
+ closedAt: timestamp('closedAt').predicate(UDFS.closedAt),
28
+ deletedAt: timestamp('deletedAt').predicate(UDFS.deletedAt),
29
+ }, {
30
+ base: '/.data/issues/',
31
+ sparqlEndpoint: '/.data/issues/-/sparql',
32
+ type: UDFS.Issue,
33
+ namespace: UDFS,
34
+ subjectTemplate: '{id}.ttl',
35
+ });
36
+ // Compatibility alias. New model code should prefer `issueResource`.
37
+ export const issueTable = issueResource;
@@ -95,6 +95,7 @@ export const UDFS = createNamespace('udfs', 'https://undefineds.co/ns#', {
95
95
  ApprovalRequest: 'ApprovalRequest',
96
96
  AuditEntry: 'AuditEntry',
97
97
  AutonomyGrant: 'AutonomyGrant',
98
+ Issue: 'Issue',
98
99
  favorite: 'favorite',
99
100
  favoriteType: 'favoriteType',
100
101
  favoriteTarget: 'favoriteTarget',
@@ -153,12 +154,17 @@ export const UDFS = createNamespace('udfs', 'https://undefineds.co/ns#', {
153
154
  apiKey: 'apiKey',
154
155
  baseUrl: 'baseUrl',
155
156
  inbox: 'inbox',
157
+ issue: 'issue',
158
+ task: 'task',
159
+ priority: 'priority',
160
+ parentIssue: 'parentIssue',
156
161
  session: 'session',
157
162
  status: 'status',
158
163
  risk: 'risk',
159
164
  assignedTo: 'assignedTo',
160
165
  reason: 'reason',
161
166
  resolvedAt: 'resolvedAt',
167
+ closedAt: 'closedAt',
162
168
  action: 'action',
163
169
  actor: 'actor',
164
170
  actorRole: 'actorRole',
package/dist/schema.d.ts CHANGED
@@ -236,9 +236,29 @@ export declare const solidResources: {
236
236
  createdAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
237
237
  modifiedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
238
238
  }>>;
239
+ issueResource: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
240
+ id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
241
+ title: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
242
+ description: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
243
+ status: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
244
+ priority: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, true>;
245
+ labels: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "string", false, false>;
246
+ chat: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
247
+ thread: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
248
+ parentIssue: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
249
+ tasks: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "uri", false, false>;
250
+ createdBy: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
251
+ assignedTo: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
252
+ createdAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
253
+ updatedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
254
+ closedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
255
+ deletedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
256
+ }>>;
239
257
  approvalResource: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
240
258
  id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
241
259
  session: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
260
+ chat: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
261
+ thread: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
242
262
  toolCallId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
243
263
  toolName: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
244
264
  target: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
@@ -264,6 +284,8 @@ export declare const solidResources: {
264
284
  actorRole: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
265
285
  onBehalfOf: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
266
286
  session: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
287
+ chat: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
288
+ thread: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
267
289
  entry: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
268
290
  toolCallId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
269
291
  toolName: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
@@ -545,9 +567,29 @@ export declare const solidSchema: {
545
567
  createdAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
546
568
  modifiedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
547
569
  }>>;
570
+ issueTable: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
571
+ id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
572
+ title: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
573
+ description: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
574
+ status: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, true>;
575
+ priority: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, true>;
576
+ labels: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "string", false, false>;
577
+ chat: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
578
+ thread: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
579
+ parentIssue: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
580
+ tasks: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"array", "uri", false, false>;
581
+ createdBy: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
582
+ assignedTo: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
583
+ createdAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
584
+ updatedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, true, true>;
585
+ closedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
586
+ deletedAt: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"datetime", null, false, false>;
587
+ }>>;
548
588
  approvalTable: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
549
589
  id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
550
590
  session: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
591
+ chat: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
592
+ thread: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
551
593
  toolCallId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
552
594
  toolName: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
553
595
  target: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
@@ -573,6 +615,8 @@ export declare const solidSchema: {
573
615
  actorRole: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, true, false>;
574
616
  onBehalfOf: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
575
617
  session: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
618
+ chat: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
619
+ thread: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
576
620
  entry: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
577
621
  toolCallId: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
578
622
  toolName: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"string", null, false, false>;
package/dist/schema.js CHANGED
@@ -11,6 +11,7 @@ import { favoriteResource, favoriteTable } from './favorite/favorite.schema.js';
11
11
  import { fileResource, fileTable } from './file/file.schema.js';
12
12
  import { grantResource, grantTable } from './grant.schema.js';
13
13
  import { inboxNotificationResource, inboxNotificationTable } from './inbox-notification.schema.js';
14
+ import { issueResource, issueTable } from './issue.schema.js';
14
15
  import { messageResource, messageTable } from './message.schema.js';
15
16
  import { solidProfileResource, solidProfileTable } from './profile.schema.js';
16
17
  import { sessionResource, sessionTable } from './session/index.js';
@@ -34,6 +35,7 @@ export const solidResources = {
34
35
  fileResource,
35
36
  favoriteResource,
36
37
  settingsResource,
38
+ issueResource,
37
39
  // Sidecar collaboration data
38
40
  approvalResource,
39
41
  auditResource,
@@ -60,6 +62,7 @@ export const solidSchema = {
60
62
  fileTable,
61
63
  favoriteTable,
62
64
  settingsTable,
65
+ issueTable,
63
66
  // Sidecar collaboration data
64
67
  approvalTable,
65
68
  auditTable,
@@ -4,14 +4,14 @@ import type { GrantInsert } from '../grant.schema';
4
4
  import type { InboxNotificationInsert } from '../inbox-notification.schema';
5
5
  import type { ToolCallEvent, InboxApprovalEvent, SessionStateEvent } from './sidecar-events';
6
6
  export type ChatSessionProjection = {
7
- chatId: string;
7
+ chat: string;
8
8
  sessionStatus: 'active' | 'paused' | 'completed' | 'error';
9
9
  policy?: string;
10
10
  policyVersion?: string;
11
11
  };
12
- export type ApprovalProjectionInsert = Pick<ApprovalInsert, 'session' | 'toolCallId' | 'toolName' | 'target' | 'action' | 'risk' | 'status' | 'context' | 'approvalOptions' | 'policyVersion' | 'expiresAt'>;
12
+ export type ApprovalProjectionInsert = Pick<ApprovalInsert, 'session' | 'chat' | 'thread' | 'toolCallId' | 'toolName' | 'target' | 'action' | 'risk' | 'status' | 'context' | 'approvalOptions' | 'policyVersion' | 'expiresAt'>;
13
13
  export type ApprovalProjectionUpdate = Partial<Pick<ApprovalUpdate, 'status' | 'assignedTo' | 'decisionBy' | 'decisionRole' | 'onBehalfOf' | 'reason' | 'policyVersion' | 'resolvedAt'>>;
14
- export type AuditProjectionInsert = Pick<AuditInsert, 'action' | 'actor' | 'actorRole' | 'onBehalfOf' | 'session' | 'entry' | 'toolCallId' | 'toolName' | 'approval' | 'policy' | 'policyVersion'>;
14
+ export type AuditProjectionInsert = Pick<AuditInsert, 'action' | 'actor' | 'actorRole' | 'onBehalfOf' | 'session' | 'chat' | 'thread' | 'entry' | 'toolCallId' | 'toolName' | 'approval' | 'policy' | 'policyVersion'>;
15
15
  export type GrantProjectionInsert = Pick<GrantInsert, 'target' | 'action' | 'title' | 'summary' | 'body' | 'schema' | 'pageKind' | 'wikiStatus' | 'tags' | 'source' | 'sourceHash' | 'compiledAt' | 'compiledFrom' | 'related' | 'effect' | 'riskCeiling' | 'policy' | 'context' | 'decisionBy' | 'decisionRole' | 'onBehalfOf'>;
16
16
  export type InboxNotificationProjectionInsert = Pick<InboxNotificationInsert, 'actor' | 'object'>;
17
17
  export declare const SidecarEventToPodMapping: {
@@ -200,7 +200,7 @@ export declare const SessionStateEventV1Schema: z.ZodObject<{
200
200
  type: z.ZodLiteral<"session.state">;
201
201
  version: z.ZodOptional<z.ZodLiteral<1>>;
202
202
  sessionId: z.ZodString;
203
- chatId: z.ZodString;
203
+ chat: z.ZodString;
204
204
  policy: z.ZodOptional<z.ZodString>;
205
205
  policyVersion: z.ZodOptional<z.ZodString>;
206
206
  status: z.ZodEnum<["active", "paused", "completed", "error"]>;
@@ -212,8 +212,8 @@ export declare const SessionStateEventV1Schema: z.ZodObject<{
212
212
  status: "error" | "paused" | "active" | "completed";
213
213
  tokenUsage: number;
214
214
  type: "session.state";
215
+ chat: string;
215
216
  tool: "claude-code" | "cursor" | "windsurf";
216
- chatId: string;
217
217
  sessionId: string;
218
218
  timestamp: string;
219
219
  previousStatus: string;
@@ -224,8 +224,8 @@ export declare const SessionStateEventV1Schema: z.ZodObject<{
224
224
  status: "error" | "paused" | "active" | "completed";
225
225
  tokenUsage: number;
226
226
  type: "session.state";
227
+ chat: string;
227
228
  tool: "claude-code" | "cursor" | "windsurf";
228
- chatId: string;
229
229
  sessionId: string;
230
230
  timestamp: string;
231
231
  previousStatus: string;
@@ -237,7 +237,7 @@ export declare const SessionStateEventSchema: z.ZodObject<{
237
237
  type: z.ZodLiteral<"session.state">;
238
238
  version: z.ZodOptional<z.ZodLiteral<1>>;
239
239
  sessionId: z.ZodString;
240
- chatId: z.ZodString;
240
+ chat: z.ZodString;
241
241
  policy: z.ZodOptional<z.ZodString>;
242
242
  policyVersion: z.ZodOptional<z.ZodString>;
243
243
  status: z.ZodEnum<["active", "paused", "completed", "error"]>;
@@ -249,8 +249,8 @@ export declare const SessionStateEventSchema: z.ZodObject<{
249
249
  status: "error" | "paused" | "active" | "completed";
250
250
  tokenUsage: number;
251
251
  type: "session.state";
252
+ chat: string;
252
253
  tool: "claude-code" | "cursor" | "windsurf";
253
- chatId: string;
254
254
  sessionId: string;
255
255
  timestamp: string;
256
256
  previousStatus: string;
@@ -261,8 +261,8 @@ export declare const SessionStateEventSchema: z.ZodObject<{
261
261
  status: "error" | "paused" | "active" | "completed";
262
262
  tokenUsage: number;
263
263
  type: "session.state";
264
+ chat: string;
264
265
  tool: "claude-code" | "cursor" | "windsurf";
265
- chatId: string;
266
266
  sessionId: string;
267
267
  timestamp: string;
268
268
  previousStatus: string;
@@ -646,7 +646,7 @@ export declare const SidecarEventSchema: z.ZodUnion<[z.ZodObject<{
646
646
  type: z.ZodLiteral<"session.state">;
647
647
  version: z.ZodOptional<z.ZodLiteral<1>>;
648
648
  sessionId: z.ZodString;
649
- chatId: z.ZodString;
649
+ chat: z.ZodString;
650
650
  policy: z.ZodOptional<z.ZodString>;
651
651
  policyVersion: z.ZodOptional<z.ZodString>;
652
652
  status: z.ZodEnum<["active", "paused", "completed", "error"]>;
@@ -658,8 +658,8 @@ export declare const SidecarEventSchema: z.ZodUnion<[z.ZodObject<{
658
658
  status: "error" | "paused" | "active" | "completed";
659
659
  tokenUsage: number;
660
660
  type: "session.state";
661
+ chat: string;
661
662
  tool: "claude-code" | "cursor" | "windsurf";
662
- chatId: string;
663
663
  sessionId: string;
664
664
  timestamp: string;
665
665
  previousStatus: string;
@@ -670,8 +670,8 @@ export declare const SidecarEventSchema: z.ZodUnion<[z.ZodObject<{
670
670
  status: "error" | "paused" | "active" | "completed";
671
671
  tokenUsage: number;
672
672
  type: "session.state";
673
+ chat: string;
673
674
  tool: "claude-code" | "cursor" | "windsurf";
674
- chatId: string;
675
675
  sessionId: string;
676
676
  timestamp: string;
677
677
  previousStatus: string;
@@ -57,7 +57,7 @@ export const SessionStateEventV1Schema = z
57
57
  type: z.literal('session.state'),
58
58
  version: z.literal(1).optional(),
59
59
  sessionId: z.string(),
60
- chatId: z.string(),
60
+ chat: z.string(),
61
61
  policy: z.string().optional(),
62
62
  policyVersion: z.string().optional(),
63
63
  status: SessionStatusSchema,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@undefineds.co/models",
3
- "version": "0.2.25",
3
+ "version": "0.2.26",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -62,7 +62,7 @@
62
62
  "pack:release": "node scripts/pack-release.mjs",
63
63
  "sync:discovery:vercel": "node --experimental-strip-types scripts/sync-discovery-vercel.ts",
64
64
  "test": "vitest run",
65
- "test:ci": "vitest run tests/ai-config.test.ts tests/ai-runtime-schema.test.ts tests/client.test.ts tests/contracts-chat-contact.contract.test.ts tests/discovery-vercel.test.ts tests/discovery.test.ts tests/profile.test.ts tests/repository.test.ts tests/resource-utils.test.ts tests/session-schema.test.ts tests/sidecar-events.contract.test.ts tests/resource-schema.test.ts",
65
+ "test:ci": "vitest run tests/ai-config.test.ts tests/ai-runtime-schema.test.ts tests/client.test.ts tests/contracts-chat-contact.contract.test.ts tests/discovery-vercel.test.ts tests/discovery.test.ts tests/issue-schema.test.ts tests/profile.test.ts tests/repository.test.ts tests/resource-utils.test.ts tests/session-schema.test.ts tests/sidecar-events.contract.test.ts tests/resource-schema.test.ts",
66
66
  "test:pod": "dotenv -e ../linx-models/.env -- vitest run tests/pod.integration.test.ts"
67
67
  },
68
68
  "dependencies": {