@shardworks/nexus-core 0.1.99 → 0.1.101

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 (166) hide show
  1. package/README.md +95 -166
  2. package/dist/guild-config.d.ts +14 -52
  3. package/dist/guild-config.d.ts.map +1 -1
  4. package/dist/guild-config.js +7 -10
  5. package/dist/guild-config.js.map +1 -1
  6. package/dist/guild.d.ts +83 -0
  7. package/dist/guild.d.ts.map +1 -0
  8. package/dist/guild.js +45 -0
  9. package/dist/guild.js.map +1 -0
  10. package/dist/id.d.ts +14 -0
  11. package/dist/id.d.ts.map +1 -0
  12. package/dist/id.js +19 -0
  13. package/dist/id.js.map +1 -0
  14. package/dist/index.d.ts +6 -30
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +7 -32
  17. package/dist/index.js.map +1 -1
  18. package/dist/nexus-home.d.ts +0 -4
  19. package/dist/nexus-home.d.ts.map +1 -1
  20. package/dist/nexus-home.js +1 -9
  21. package/dist/nexus-home.js.map +1 -1
  22. package/dist/plugin.d.ts +115 -0
  23. package/dist/plugin.d.ts.map +1 -0
  24. package/dist/plugin.js +39 -0
  25. package/dist/plugin.js.map +1 -0
  26. package/dist/resolve-package.d.ts +58 -0
  27. package/dist/resolve-package.d.ts.map +1 -0
  28. package/dist/resolve-package.js +123 -0
  29. package/dist/resolve-package.js.map +1 -0
  30. package/package.json +5 -14
  31. package/dist/book.d.ts +0 -110
  32. package/dist/book.d.ts.map +0 -1
  33. package/dist/book.js +0 -16
  34. package/dist/book.js.map +0 -1
  35. package/dist/legacy/1/anima.d.ts +0 -79
  36. package/dist/legacy/1/anima.d.ts.map +0 -1
  37. package/dist/legacy/1/anima.js +0 -285
  38. package/dist/legacy/1/anima.js.map +0 -1
  39. package/dist/legacy/1/audit.d.ts +0 -23
  40. package/dist/legacy/1/audit.d.ts.map +0 -1
  41. package/dist/legacy/1/audit.js +0 -61
  42. package/dist/legacy/1/audit.js.map +0 -1
  43. package/dist/legacy/1/bundle.d.ts +0 -111
  44. package/dist/legacy/1/bundle.d.ts.map +0 -1
  45. package/dist/legacy/1/bundle.js +0 -452
  46. package/dist/legacy/1/bundle.js.map +0 -1
  47. package/dist/legacy/1/clock-daemon.d.ts +0 -2
  48. package/dist/legacy/1/clock-daemon.d.ts.map +0 -1
  49. package/dist/legacy/1/clock-daemon.js +0 -72
  50. package/dist/legacy/1/clock-daemon.js.map +0 -1
  51. package/dist/legacy/1/clockworks.d.ts +0 -98
  52. package/dist/legacy/1/clockworks.d.ts.map +0 -1
  53. package/dist/legacy/1/clockworks.js +0 -359
  54. package/dist/legacy/1/clockworks.js.map +0 -1
  55. package/dist/legacy/1/conversation.d.ts +0 -165
  56. package/dist/legacy/1/conversation.d.ts.map +0 -1
  57. package/dist/legacy/1/conversation.js +0 -457
  58. package/dist/legacy/1/conversation.js.map +0 -1
  59. package/dist/legacy/1/engine.d.ts +0 -90
  60. package/dist/legacy/1/engine.d.ts.map +0 -1
  61. package/dist/legacy/1/engine.js +0 -89
  62. package/dist/legacy/1/engine.js.map +0 -1
  63. package/dist/legacy/1/events.d.ts +0 -88
  64. package/dist/legacy/1/events.d.ts.map +0 -1
  65. package/dist/legacy/1/events.js +0 -239
  66. package/dist/legacy/1/events.js.map +0 -1
  67. package/dist/legacy/1/guild-config.d.ts +0 -74
  68. package/dist/legacy/1/guild-config.d.ts.map +0 -1
  69. package/dist/legacy/1/guild-config.js +0 -51
  70. package/dist/legacy/1/guild-config.js.map +0 -1
  71. package/dist/legacy/1/id.d.ts +0 -8
  72. package/dist/legacy/1/id.d.ts.map +0 -1
  73. package/dist/legacy/1/id.js +0 -27
  74. package/dist/legacy/1/id.js.map +0 -1
  75. package/dist/legacy/1/index.d.ts +0 -28
  76. package/dist/legacy/1/index.d.ts.map +0 -1
  77. package/dist/legacy/1/index.js +0 -32
  78. package/dist/legacy/1/index.js.map +0 -1
  79. package/dist/legacy/1/init-guild.d.ts +0 -24
  80. package/dist/legacy/1/init-guild.d.ts.map +0 -1
  81. package/dist/legacy/1/init-guild.js +0 -230
  82. package/dist/legacy/1/init-guild.js.map +0 -1
  83. package/dist/legacy/1/install-tool.d.ts +0 -73
  84. package/dist/legacy/1/install-tool.d.ts.map +0 -1
  85. package/dist/legacy/1/install-tool.js +0 -436
  86. package/dist/legacy/1/install-tool.js.map +0 -1
  87. package/dist/legacy/1/instantiate.d.ts +0 -33
  88. package/dist/legacy/1/instantiate.d.ts.map +0 -1
  89. package/dist/legacy/1/instantiate.js +0 -137
  90. package/dist/legacy/1/instantiate.js.map +0 -1
  91. package/dist/legacy/1/manifest.d.ts +0 -132
  92. package/dist/legacy/1/manifest.d.ts.map +0 -1
  93. package/dist/legacy/1/manifest.js +0 -321
  94. package/dist/legacy/1/manifest.js.map +0 -1
  95. package/dist/legacy/1/migrate.d.ts +0 -84
  96. package/dist/legacy/1/migrate.d.ts.map +0 -1
  97. package/dist/legacy/1/migrate.js +0 -228
  98. package/dist/legacy/1/migrate.js.map +0 -1
  99. package/dist/legacy/1/nexus-home.d.ts +0 -11
  100. package/dist/legacy/1/nexus-home.d.ts.map +0 -1
  101. package/dist/legacy/1/nexus-home.js +0 -16
  102. package/dist/legacy/1/nexus-home.js.map +0 -1
  103. package/dist/legacy/1/plugin-descriptor.d.ts +0 -3
  104. package/dist/legacy/1/plugin-descriptor.d.ts.map +0 -1
  105. package/dist/legacy/1/plugin-descriptor.js +0 -2
  106. package/dist/legacy/1/plugin-descriptor.js.map +0 -1
  107. package/dist/legacy/1/preconditions.d.ts +0 -100
  108. package/dist/legacy/1/preconditions.d.ts.map +0 -1
  109. package/dist/legacy/1/preconditions.js +0 -189
  110. package/dist/legacy/1/preconditions.js.map +0 -1
  111. package/dist/legacy/1/rehydrate.d.ts +0 -22
  112. package/dist/legacy/1/rehydrate.d.ts.map +0 -1
  113. package/dist/legacy/1/rehydrate.js +0 -109
  114. package/dist/legacy/1/rehydrate.js.map +0 -1
  115. package/dist/legacy/1/remove-tool.d.ts +0 -19
  116. package/dist/legacy/1/remove-tool.d.ts.map +0 -1
  117. package/dist/legacy/1/remove-tool.js +0 -105
  118. package/dist/legacy/1/remove-tool.js.map +0 -1
  119. package/dist/legacy/1/session.d.ts +0 -343
  120. package/dist/legacy/1/session.d.ts.map +0 -1
  121. package/dist/legacy/1/session.js +0 -499
  122. package/dist/legacy/1/session.js.map +0 -1
  123. package/dist/legacy/1/tool-registry.d.ts +0 -12
  124. package/dist/legacy/1/tool-registry.d.ts.map +0 -1
  125. package/dist/legacy/1/tool-registry.js +0 -28
  126. package/dist/legacy/1/tool-registry.js.map +0 -1
  127. package/dist/legacy/1/tool.d.ts +0 -10
  128. package/dist/legacy/1/tool.d.ts.map +0 -1
  129. package/dist/legacy/1/tool.js +0 -2
  130. package/dist/legacy/1/tool.js.map +0 -1
  131. package/dist/legacy/1/upgrade.d.ts +0 -129
  132. package/dist/legacy/1/upgrade.d.ts.map +0 -1
  133. package/dist/legacy/1/upgrade.js +0 -355
  134. package/dist/legacy/1/upgrade.js.map +0 -1
  135. package/dist/legacy/1/workshop.d.ts +0 -95
  136. package/dist/legacy/1/workshop.d.ts.map +0 -1
  137. package/dist/legacy/1/workshop.js +0 -229
  138. package/dist/legacy/1/workshop.js.map +0 -1
  139. package/dist/legacy/1/worktree.d.ts +0 -67
  140. package/dist/legacy/1/worktree.d.ts.map +0 -1
  141. package/dist/legacy/1/worktree.js +0 -117
  142. package/dist/legacy/1/worktree.js.map +0 -1
  143. package/dist/legacy/1/writ.d.ts +0 -130
  144. package/dist/legacy/1/writ.d.ts.map +0 -1
  145. package/dist/legacy/1/writ.js +0 -599
  146. package/dist/legacy/1/writ.js.map +0 -1
  147. package/dist/rig-context.d.ts +0 -47
  148. package/dist/rig-context.d.ts.map +0 -1
  149. package/dist/rig-context.js +0 -11
  150. package/dist/rig-context.js.map +0 -1
  151. package/dist/rig-descriptor.d.ts +0 -39
  152. package/dist/rig-descriptor.d.ts.map +0 -1
  153. package/dist/rig-descriptor.js +0 -12
  154. package/dist/rig-descriptor.js.map +0 -1
  155. package/dist/rig.d.ts +0 -70
  156. package/dist/rig.d.ts.map +0 -1
  157. package/dist/rig.js +0 -14
  158. package/dist/rig.js.map +0 -1
  159. package/dist/tool.d.ts +0 -136
  160. package/dist/tool.d.ts.map +0 -1
  161. package/dist/tool.js +0 -135
  162. package/dist/tool.js.map +0 -1
  163. package/migrations/001-schema.sql +0 -177
  164. package/migrations/002-writs.sql +0 -44
  165. package/migrations/003-conversations.sql +0 -43
  166. package/migrations/004-remove-commissions.sql +0 -24
@@ -1,165 +0,0 @@
1
- /**
2
- * Conversation — multi-turn interaction with animas.
3
- *
4
- * Conversations group multiple sessions (turns) into a single logical
5
- * interaction. Each turn is a full launchSession() call through the
6
- * standard session funnel — same manifest pipeline, same metrics,
7
- * same session records.
8
- *
9
- * Two kinds:
10
- * - **consult** — human talks to an anima (from dashboard or CLI)
11
- * - **convene** — multiple animas hold a turn-limited dialogue
12
- *
13
- * State is fully persistent in the database. The core primitive is
14
- * `takeTurn()` — a stateless function that reads conversation state,
15
- * runs one turn through the session funnel, and updates the records.
16
- * No in-memory state is held between turns. Any component (dashboard,
17
- * CLI, clockworks) can drive a turn with just a conversation ID and
18
- * participant ID.
19
- *
20
- * Human participants don't launch sessions. Their messages are captured
21
- * as the `prompt` field on the anima's session record. This means the
22
- * sessions table only contains anima turns — cost, tokens, and duration
23
- * are always agent-side metrics. For dialogue reconstruction,
24
- * `showConversation()` interleaves anima session rows with their prompts
25
- * to show the full exchange.
26
- */
27
- import type { SessionChunk } from './session.ts';
28
- /** A chunk emitted during a conversation turn. Re-exports SessionChunk
29
- * with an additional turn_complete variant. */
30
- export type ConversationChunk = SessionChunk | {
31
- type: 'turn_complete';
32
- turnNumber: number;
33
- costUsd?: number;
34
- };
35
- /** Options for creating a conversation. */
36
- export interface CreateConversationOptions {
37
- kind: 'consult' | 'convene';
38
- topic?: string;
39
- turnLimit?: number;
40
- participants: Array<{
41
- kind: 'anima' | 'human';
42
- name: string;
43
- }>;
44
- /** For convene: the triggering event ID. */
45
- eventId?: string;
46
- }
47
- /** Result of creating a conversation. */
48
- export interface CreateConversationResult {
49
- conversationId: string;
50
- participants: Array<{
51
- id: string;
52
- name: string;
53
- kind: string;
54
- }>;
55
- }
56
- /** Summary view for listing conversations. */
57
- export interface ConversationSummary {
58
- id: string;
59
- status: string;
60
- kind: string;
61
- topic: string | null;
62
- turnLimit: number | null;
63
- createdAt: string;
64
- endedAt: string | null;
65
- participants: Array<{
66
- id: string;
67
- name: string;
68
- kind: string;
69
- }>;
70
- /** Computed from sessions table. */
71
- turnCount: number;
72
- totalCostUsd: number;
73
- }
74
- /** Full detail view of a conversation including turns. */
75
- export interface ConversationDetail extends ConversationSummary {
76
- /** Turns are session rows, enriched with participant name. */
77
- turns: Array<{
78
- sessionId: string;
79
- turnNumber: number;
80
- participant: string;
81
- prompt: string | null;
82
- exitCode: number | null;
83
- costUsd: number | null;
84
- durationMs: number | null;
85
- startedAt: string;
86
- endedAt: string | null;
87
- }>;
88
- }
89
- /** Options for listing conversations. */
90
- export interface ListConversationsOptions {
91
- status?: string;
92
- kind?: string;
93
- limit?: number;
94
- }
95
- /**
96
- * Create a new conversation.
97
- *
98
- * Sets up conversation and participant records. Does NOT take a first
99
- * turn — that's a separate call to takeTurn().
100
- *
101
- * Anima participants are identified by name. Manifesting happens at
102
- * turn time, not creation time.
103
- */
104
- export declare function createConversation(home: string, options: CreateConversationOptions): CreateConversationResult;
105
- /**
106
- * Take a turn in a conversation.
107
- *
108
- * For anima participants:
109
- * 1. Reads conversation state (checks status, turn limit)
110
- * 2. Manifests the anima through the standard pipeline
111
- * 3. Calls launchSession() with claudeSessionId for --resume
112
- * 4. Captures providerSessionId and updates participant record
113
- * 5. Yields ConversationChunks as they stream from the provider
114
- *
115
- * For human participants:
116
- * - No session launched. Human messages are passed as the prompt
117
- * to the next anima turn. This function is a no-op for humans
118
- * (the caller passes the human's message directly to the anima's
119
- * takeTurn call).
120
- *
121
- * Throws if conversation is not active or turn limit reached.
122
- */
123
- export declare function takeTurn(home: string, conversationId: string, participantId: string, message: string): AsyncGenerator<ConversationChunk>;
124
- /**
125
- * End a conversation explicitly.
126
- *
127
- * Sets status to 'concluded' (normal end) or 'abandoned' (e.g.
128
- * browser disconnect, timeout).
129
- */
130
- export declare function endConversation(home: string, conversationId: string, reason?: 'concluded' | 'abandoned'): void;
131
- /**
132
- * Get the next participant in a convene rotation.
133
- *
134
- * Reads turn history and returns whose turn it is (round-robin by
135
- * participant creation order). Returns null if conversation is not
136
- * active or turn limit reached.
137
- */
138
- export declare function nextParticipant(home: string, conversationId: string): {
139
- participantId: string;
140
- name: string;
141
- } | null;
142
- /**
143
- * List conversations with optional filters.
144
- */
145
- export declare function listConversations(home: string, opts?: ListConversationsOptions): ConversationSummary[];
146
- /**
147
- * Show full detail for a conversation, including all turns.
148
- *
149
- * Turns are session rows ordered by turn_number. Each turn includes
150
- * the prompt (which, in a consult, is the human's message — this is
151
- * how human contributions appear in the dialogue reconstruction).
152
- */
153
- export declare function showConversation(home: string, conversationId: string): ConversationDetail | null;
154
- /**
155
- * Format a message for the next participant in a convene.
156
- *
157
- * Each anima has their own claude session via --resume. Their session
158
- * already contains their own prior messages and responses. We only
159
- * send them what happened since their last turn — the other
160
- * participants' contributions.
161
- *
162
- * On the first turn (no prior turns), returns the conversation topic.
163
- */
164
- export declare function formatConveneMessage(home: string, conversationId: string, participantId: string): string;
165
- //# sourceMappingURL=conversation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../src/legacy/1/conversation.ts"],"names":[],"mappings":"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"}
@@ -1,457 +0,0 @@
1
- /**
2
- * Conversation — multi-turn interaction with animas.
3
- *
4
- * Conversations group multiple sessions (turns) into a single logical
5
- * interaction. Each turn is a full launchSession() call through the
6
- * standard session funnel — same manifest pipeline, same metrics,
7
- * same session records.
8
- *
9
- * Two kinds:
10
- * - **consult** — human talks to an anima (from dashboard or CLI)
11
- * - **convene** — multiple animas hold a turn-limited dialogue
12
- *
13
- * State is fully persistent in the database. The core primitive is
14
- * `takeTurn()` — a stateless function that reads conversation state,
15
- * runs one turn through the session funnel, and updates the records.
16
- * No in-memory state is held between turns. Any component (dashboard,
17
- * CLI, clockworks) can drive a turn with just a conversation ID and
18
- * participant ID.
19
- *
20
- * Human participants don't launch sessions. Their messages are captured
21
- * as the `prompt` field on the anima's session record. This means the
22
- * sessions table only contains anima turns — cost, tokens, and duration
23
- * are always agent-side metrics. For dialogue reconstruction,
24
- * `showConversation()` interleaves anima session rows with their prompts
25
- * to show the full exchange.
26
- */
27
- import Database from 'better-sqlite3';
28
- import { booksPath } from "./nexus-home.js";
29
- import { generateId } from "./id.js";
30
- import { manifest } from "./manifest.js";
31
- import { launchSession } from "./session.js";
32
- // ── Lifecycle Functions ────────────────────────────────────────────────
33
- /**
34
- * Create a new conversation.
35
- *
36
- * Sets up conversation and participant records. Does NOT take a first
37
- * turn — that's a separate call to takeTurn().
38
- *
39
- * Anima participants are identified by name. Manifesting happens at
40
- * turn time, not creation time.
41
- */
42
- export function createConversation(home, options) {
43
- const db = new Database(booksPath(home));
44
- db.pragma('foreign_keys = ON');
45
- try {
46
- const conversationId = generateId('conv');
47
- const now = new Date().toISOString();
48
- db.prepare(`INSERT INTO conversations (id, status, kind, topic, turn_limit, created_at, event_id)
49
- VALUES (?, 'active', ?, ?, ?, ?, ?)`).run(conversationId, options.kind, options.topic ?? null, options.turnLimit ?? null, now, options.eventId ?? null);
50
- const participants = [];
51
- for (const p of options.participants) {
52
- const participantId = generateId('cpart');
53
- // Look up anima_id for anima participants
54
- let animaId = null;
55
- if (p.kind === 'anima') {
56
- const row = db.prepare(`SELECT id FROM animas WHERE name = ? AND status = 'active'`).get(p.name);
57
- if (row) {
58
- animaId = row.id;
59
- }
60
- }
61
- db.prepare(`INSERT INTO conversation_participants (id, conversation_id, kind, name, anima_id)
62
- VALUES (?, ?, ?, ?, ?)`).run(participantId, conversationId, p.kind, p.name, animaId);
63
- participants.push({ id: participantId, name: p.name, kind: p.kind });
64
- }
65
- return { conversationId, participants };
66
- }
67
- finally {
68
- db.close();
69
- }
70
- }
71
- /**
72
- * Take a turn in a conversation.
73
- *
74
- * For anima participants:
75
- * 1. Reads conversation state (checks status, turn limit)
76
- * 2. Manifests the anima through the standard pipeline
77
- * 3. Calls launchSession() with claudeSessionId for --resume
78
- * 4. Captures providerSessionId and updates participant record
79
- * 5. Yields ConversationChunks as they stream from the provider
80
- *
81
- * For human participants:
82
- * - No session launched. Human messages are passed as the prompt
83
- * to the next anima turn. This function is a no-op for humans
84
- * (the caller passes the human's message directly to the anima's
85
- * takeTurn call).
86
- *
87
- * Throws if conversation is not active or turn limit reached.
88
- */
89
- export async function* takeTurn(home, conversationId, participantId, message) {
90
- // 1. Read conversation and participant state
91
- const db = new Database(booksPath(home));
92
- db.pragma('foreign_keys = ON');
93
- let conversation;
94
- let participant;
95
- let currentTurnCount;
96
- try {
97
- const convRow = db.prepare(`SELECT status, kind, turn_limit FROM conversations WHERE id = ?`).get(conversationId);
98
- if (!convRow) {
99
- throw new Error(`Conversation "${conversationId}" not found.`);
100
- }
101
- conversation = convRow;
102
- if (conversation.status !== 'active') {
103
- throw new Error(`Conversation "${conversationId}" is not active (status: ${conversation.status}).`);
104
- }
105
- const partRow = db.prepare(`SELECT kind, name, anima_id, claude_session_id
106
- FROM conversation_participants WHERE id = ? AND conversation_id = ?`).get(participantId, conversationId);
107
- if (!partRow) {
108
- throw new Error(`Participant "${participantId}" not found in conversation "${conversationId}".`);
109
- }
110
- participant = partRow;
111
- // Count existing turns for this conversation
112
- const countRow = db.prepare(`SELECT COUNT(*) as count FROM sessions WHERE conversation_id = ?`).get(conversationId);
113
- currentTurnCount = countRow.count;
114
- // Check turn limit
115
- if (conversation.turn_limit !== null && currentTurnCount >= conversation.turn_limit) {
116
- // Auto-conclude if at limit
117
- db.prepare(`UPDATE conversations SET status = 'concluded', ended_at = ? WHERE id = ?`).run(new Date().toISOString(), conversationId);
118
- throw new Error(`Conversation "${conversationId}" has reached its turn limit (${conversation.turn_limit}).`);
119
- }
120
- }
121
- finally {
122
- db.close();
123
- }
124
- // 2. Human participants don't launch sessions
125
- if (participant.kind === 'human') {
126
- // Nothing to do — the message will be passed as the prompt
127
- // to the next anima turn by the caller.
128
- return;
129
- }
130
- // 3. Manifest the anima
131
- const animaManifest = await manifest(home, participant.name);
132
- // 4. Determine turn number (1-indexed)
133
- const turnNumber = currentTurnCount + 1;
134
- // 5. Launch session through the funnel
135
- const workspace = { kind: 'guildhall' };
136
- // Collect chunks from the streaming provider
137
- const collectedChunks = [];
138
- const sessionResult = await launchSession({
139
- home,
140
- manifest: animaManifest,
141
- prompt: message,
142
- interactive: false,
143
- workspace,
144
- trigger: conversation.kind,
145
- name: `${conversation.kind}-${participant.name}-turn-${turnNumber}`,
146
- conversationId,
147
- turnNumber,
148
- claudeSessionId: participant.claude_session_id ?? undefined,
149
- onChunk: (chunk) => {
150
- collectedChunks.push(chunk);
151
- },
152
- });
153
- // Yield all collected chunks
154
- for (const chunk of collectedChunks) {
155
- yield chunk;
156
- }
157
- // 6. Update participant's claude_session_id for --resume on next turn
158
- if (sessionResult.providerSessionId) {
159
- const db2 = new Database(booksPath(home));
160
- db2.pragma('foreign_keys = ON');
161
- try {
162
- db2.prepare(`UPDATE conversation_participants SET claude_session_id = ? WHERE id = ?`).run(sessionResult.providerSessionId, participantId);
163
- }
164
- finally {
165
- db2.close();
166
- }
167
- }
168
- // 7. Check if we've hit the turn limit after this turn
169
- if (conversation.turn_limit !== null && turnNumber >= conversation.turn_limit) {
170
- const db3 = new Database(booksPath(home));
171
- db3.pragma('foreign_keys = ON');
172
- try {
173
- db3.prepare(`UPDATE conversations SET status = 'concluded', ended_at = ? WHERE id = ?`).run(new Date().toISOString(), conversationId);
174
- }
175
- finally {
176
- db3.close();
177
- }
178
- }
179
- // 8. Yield turn_complete
180
- yield {
181
- type: 'turn_complete',
182
- turnNumber,
183
- costUsd: sessionResult.costUsd,
184
- };
185
- }
186
- /**
187
- * End a conversation explicitly.
188
- *
189
- * Sets status to 'concluded' (normal end) or 'abandoned' (e.g.
190
- * browser disconnect, timeout).
191
- */
192
- export function endConversation(home, conversationId, reason = 'concluded') {
193
- const db = new Database(booksPath(home));
194
- db.pragma('foreign_keys = ON');
195
- try {
196
- const result = db.prepare(`UPDATE conversations SET status = ?, ended_at = ? WHERE id = ? AND status = 'active'`).run(reason, new Date().toISOString(), conversationId);
197
- if (result.changes === 0) {
198
- // Either not found or already ended — check which
199
- const row = db.prepare(`SELECT status FROM conversations WHERE id = ?`).get(conversationId);
200
- if (!row) {
201
- throw new Error(`Conversation "${conversationId}" not found.`);
202
- }
203
- // Already ended — no-op (idempotent)
204
- }
205
- }
206
- finally {
207
- db.close();
208
- }
209
- }
210
- /**
211
- * Get the next participant in a convene rotation.
212
- *
213
- * Reads turn history and returns whose turn it is (round-robin by
214
- * participant creation order). Returns null if conversation is not
215
- * active or turn limit reached.
216
- */
217
- export function nextParticipant(home, conversationId) {
218
- const db = new Database(booksPath(home));
219
- db.pragma('foreign_keys = ON');
220
- try {
221
- // Check conversation is active
222
- const conv = db.prepare(`SELECT status, turn_limit FROM conversations WHERE id = ?`).get(conversationId);
223
- if (!conv || conv.status !== 'active')
224
- return null;
225
- // Count existing turns
226
- const countRow = db.prepare(`SELECT COUNT(*) as count FROM sessions WHERE conversation_id = ?`).get(conversationId);
227
- if (conv.turn_limit !== null && countRow.count >= conv.turn_limit)
228
- return null;
229
- // Get participants in creation order (by rowid)
230
- const participants = db.prepare(`SELECT id, name FROM conversation_participants
231
- WHERE conversation_id = ? AND kind = 'anima'
232
- ORDER BY rowid ASC`).all(conversationId);
233
- if (participants.length === 0)
234
- return null;
235
- // Round-robin: turn count mod participant count
236
- const nextIdx = countRow.count % participants.length;
237
- const next = participants[nextIdx];
238
- return { participantId: next.id, name: next.name };
239
- }
240
- finally {
241
- db.close();
242
- }
243
- }
244
- // ── Read Functions ─────────────────────────────────────────────────────
245
- /**
246
- * List conversations with optional filters.
247
- */
248
- export function listConversations(home, opts = {}) {
249
- const db = new Database(booksPath(home));
250
- db.pragma('foreign_keys = ON');
251
- try {
252
- let query = `SELECT c.id, c.status, c.kind, c.topic, c.turn_limit,
253
- c.created_at, c.ended_at
254
- FROM conversations c`;
255
- const conditions = [];
256
- const params = [];
257
- if (opts.status) {
258
- conditions.push('c.status = ?');
259
- params.push(opts.status);
260
- }
261
- if (opts.kind) {
262
- conditions.push('c.kind = ?');
263
- params.push(opts.kind);
264
- }
265
- if (conditions.length > 0) {
266
- query += ` WHERE ${conditions.join(' AND ')}`;
267
- }
268
- query += ` ORDER BY c.created_at DESC`;
269
- if (opts.limit) {
270
- query += ` LIMIT ?`;
271
- params.push(opts.limit);
272
- }
273
- const rows = db.prepare(query).all(...params);
274
- return rows.map(row => {
275
- // Get participants
276
- const parts = db.prepare(`SELECT id, name, kind FROM conversation_participants WHERE conversation_id = ?`).all(row.id);
277
- // Get turn count and total cost from sessions
278
- const metrics = db.prepare(`SELECT COUNT(*) as turn_count, COALESCE(SUM(cost_usd), 0) as total_cost
279
- FROM sessions WHERE conversation_id = ?`).get(row.id);
280
- return {
281
- id: row.id,
282
- status: row.status,
283
- kind: row.kind,
284
- topic: row.topic,
285
- turnLimit: row.turn_limit,
286
- createdAt: row.created_at,
287
- endedAt: row.ended_at,
288
- participants: parts,
289
- turnCount: metrics.turn_count,
290
- totalCostUsd: metrics.total_cost,
291
- };
292
- });
293
- }
294
- finally {
295
- db.close();
296
- }
297
- }
298
- /**
299
- * Show full detail for a conversation, including all turns.
300
- *
301
- * Turns are session rows ordered by turn_number. Each turn includes
302
- * the prompt (which, in a consult, is the human's message — this is
303
- * how human contributions appear in the dialogue reconstruction).
304
- */
305
- export function showConversation(home, conversationId) {
306
- const db = new Database(booksPath(home));
307
- db.pragma('foreign_keys = ON');
308
- try {
309
- const row = db.prepare(`SELECT id, status, kind, topic, turn_limit, created_at, ended_at
310
- FROM conversations WHERE id = ?`).get(conversationId);
311
- if (!row)
312
- return null;
313
- // Get participants
314
- const parts = db.prepare(`SELECT id, name, kind FROM conversation_participants WHERE conversation_id = ?`).all(row.id);
315
- // Get turns (sessions for this conversation)
316
- const turns = db.prepare(`SELECT s.id, s.turn_number, a.name as participant,
317
- s.started_at, s.ended_at, s.exit_code, s.cost_usd, s.duration_ms
318
- FROM sessions s
319
- JOIN animas a ON a.id = s.anima_id
320
- WHERE s.conversation_id = ?
321
- ORDER BY s.turn_number ASC`).all(conversationId);
322
- // Get prompts from session records for dialogue reconstruction
323
- const turnDetails = turns.map(t => {
324
- // Read the prompt from the session record JSON if available
325
- let prompt = null;
326
- const recordRow = db.prepare(`SELECT record_path FROM sessions WHERE id = ?`).get(t.id);
327
- if (recordRow?.record_path) {
328
- try {
329
- const fs = require('node:fs');
330
- const path = require('node:path');
331
- const fullPath = path.join(home, recordRow.record_path);
332
- if (fs.existsSync(fullPath)) {
333
- const record = JSON.parse(fs.readFileSync(fullPath, 'utf-8'));
334
- prompt = record.userPrompt ?? null;
335
- }
336
- }
337
- catch {
338
- // If we can't read the record, skip the prompt
339
- }
340
- }
341
- return {
342
- sessionId: t.id,
343
- turnNumber: t.turn_number,
344
- participant: t.participant,
345
- prompt,
346
- exitCode: t.exit_code,
347
- costUsd: t.cost_usd,
348
- durationMs: t.duration_ms,
349
- startedAt: t.started_at,
350
- endedAt: t.ended_at,
351
- };
352
- });
353
- // Metrics
354
- const metrics = db.prepare(`SELECT COUNT(*) as turn_count, COALESCE(SUM(cost_usd), 0) as total_cost
355
- FROM sessions WHERE conversation_id = ?`).get(conversationId);
356
- return {
357
- id: row.id,
358
- status: row.status,
359
- kind: row.kind,
360
- topic: row.topic,
361
- turnLimit: row.turn_limit,
362
- createdAt: row.created_at,
363
- endedAt: row.ended_at,
364
- participants: parts,
365
- turnCount: metrics.turn_count,
366
- totalCostUsd: metrics.total_cost,
367
- turns: turnDetails,
368
- };
369
- }
370
- finally {
371
- db.close();
372
- }
373
- }
374
- // ── Convene Helpers ────────────────────────────────────────────────────
375
- /**
376
- * Format a message for the next participant in a convene.
377
- *
378
- * Each anima has their own claude session via --resume. Their session
379
- * already contains their own prior messages and responses. We only
380
- * send them what happened since their last turn — the other
381
- * participants' contributions.
382
- *
383
- * On the first turn (no prior turns), returns the conversation topic.
384
- */
385
- export function formatConveneMessage(home, conversationId, participantId) {
386
- const db = new Database(booksPath(home));
387
- db.pragma('foreign_keys = ON');
388
- try {
389
- // Get the conversation topic
390
- const conv = db.prepare(`SELECT topic FROM conversations WHERE id = ?`).get(conversationId);
391
- // Find this participant's last turn number
392
- const participant = db.prepare(`SELECT name, anima_id FROM conversation_participants WHERE id = ?`).get(participantId);
393
- if (!participant?.anima_id) {
394
- return conv?.topic ?? '';
395
- }
396
- const lastTurn = db.prepare(`SELECT MAX(turn_number) as last_turn FROM sessions
397
- WHERE conversation_id = ? AND anima_id = ?`).get(conversationId, participant.anima_id);
398
- if (lastTurn.last_turn === null) {
399
- // First turn for this participant — use the topic
400
- return conv?.topic ?? '';
401
- }
402
- // Get all turns since this participant's last turn
403
- const newTurns = db.prepare(`SELECT s.turn_number, a.name as participant_name, s.record_path
404
- FROM sessions s
405
- JOIN animas a ON a.id = s.anima_id
406
- WHERE s.conversation_id = ? AND s.turn_number > ?
407
- ORDER BY s.turn_number ASC`).all(conversationId, lastTurn.last_turn);
408
- if (newTurns.length === 0) {
409
- return conv?.topic ?? '';
410
- }
411
- // Build the message from session records
412
- const fs = require('node:fs');
413
- const path = require('node:path');
414
- const lines = [];
415
- for (const turn of newTurns) {
416
- let responseText = '[response not available]';
417
- if (turn.record_path) {
418
- try {
419
- const fullPath = path.join(home, turn.record_path);
420
- if (fs.existsSync(fullPath)) {
421
- const record = JSON.parse(fs.readFileSync(fullPath, 'utf-8'));
422
- // Extract text from transcript
423
- const transcript = record.transcript;
424
- if (transcript) {
425
- const textParts = [];
426
- for (const msg of transcript) {
427
- if (msg.type === 'assistant') {
428
- const message = msg.message;
429
- const content = message?.content;
430
- if (content) {
431
- for (const block of content) {
432
- if (block.type === 'text' && typeof block.text === 'string') {
433
- textParts.push(block.text);
434
- }
435
- }
436
- }
437
- }
438
- }
439
- if (textParts.length > 0) {
440
- responseText = textParts.join('');
441
- }
442
- }
443
- }
444
- }
445
- catch {
446
- // If we can't read the record, use placeholder
447
- }
448
- }
449
- lines.push(`[${turn.participant_name}]: ${responseText}`);
450
- }
451
- return lines.join('\n\n');
452
- }
453
- finally {
454
- db.close();
455
- }
456
- }
457
- //# sourceMappingURL=conversation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation.js","sourceRoot":"","sources":["../../../src/legacy/1/conversation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAoE7C,0EAA0E;AAE1E;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAY,EACZ,OAAkC;IAElC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErC,EAAE,CAAC,OAAO,CACR;2CACqC,CACtC,CAAC,GAAG,CACH,cAAc,EACd,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,KAAK,IAAI,IAAI,EACrB,OAAO,CAAC,SAAS,IAAI,IAAI,EACzB,GAAG,EACH,OAAO,CAAC,OAAO,IAAI,IAAI,CACxB,CAAC;QAEF,MAAM,YAAY,GAAsD,EAAE,CAAC;QAE3E,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACrC,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;YAE1C,0CAA0C;YAC1C,IAAI,OAAO,GAAkB,IAAI,CAAC;YAClC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACvB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB,4DAA4D,CAC7D,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAA+B,CAAC;gBAC5C,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;gBACnB,CAAC;YACH,CAAC;YAED,EAAE,CAAC,OAAO,CACR;gCACwB,CACzB,CAAC,GAAG,CAAC,aAAa,EAAE,cAAc,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAE9D,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC;IAC1C,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,QAAQ,CAC7B,IAAY,EACZ,cAAsB,EACtB,aAAqB,EACrB,OAAe;IAEf,6CAA6C;IAC7C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,IAAI,YAIH,CAAC;IACF,IAAI,WAKH,CAAC;IACF,IAAI,gBAAwB,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB,iEAAiE,CAClE,CAAC,GAAG,CAAC,cAAc,CAAoC,CAAC;QAEzD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,iBAAiB,cAAc,cAAc,CAAC,CAAC;QACjE,CAAC;QACD,YAAY,GAAG,OAAO,CAAC;QAEvB,IAAI,YAAY,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CACb,iBAAiB,cAAc,4BAA4B,YAAY,CAAC,MAAM,IAAI,CACnF,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB;2EACqE,CACtE,CAAC,GAAG,CAAC,aAAa,EAAE,cAAc,CAAmC,CAAC;QAEvE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,gBAAgB,aAAa,gCAAgC,cAAc,IAAI,CAChF,CAAC;QACJ,CAAC;QACD,WAAW,GAAG,OAAO,CAAC;QAEtB,6CAA6C;QAC7C,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB,kEAAkE,CACnE,CAAC,GAAG,CAAC,cAAc,CAAsB,CAAC;QAC3C,gBAAgB,GAAG,QAAQ,CAAC,KAAK,CAAC;QAElC,mBAAmB;QACnB,IAAI,YAAY,CAAC,UAAU,KAAK,IAAI,IAAI,gBAAgB,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;YACpF,4BAA4B;YAC5B,EAAE,CAAC,OAAO,CACR,0EAA0E,CAC3E,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,cAAc,CAAC,CAAC;YAChD,MAAM,IAAI,KAAK,CACb,iBAAiB,cAAc,iCAAiC,YAAY,CAAC,UAAU,IAAI,CAC5F,CAAC;QACJ,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;IAED,8CAA8C;IAC9C,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACjC,2DAA2D;QAC3D,wCAAwC;QACxC,OAAO;IACT,CAAC;IAED,wBAAwB;IACxB,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IAE7D,uCAAuC;IACvC,MAAM,UAAU,GAAG,gBAAgB,GAAG,CAAC,CAAC;IAExC,uCAAuC;IACvC,MAAM,SAAS,GAAsB,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAE3D,6CAA6C;IAC7C,MAAM,eAAe,GAAwB,EAAE,CAAC;IAEhD,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC;QACxC,IAAI;QACJ,QAAQ,EAAE,aAAa;QACvB,MAAM,EAAE,OAAO;QACf,WAAW,EAAE,KAAK;QAClB,SAAS;QACT,OAAO,EAAE,YAAY,CAAC,IAA6B;QACnD,IAAI,EAAE,GAAG,YAAY,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,SAAS,UAAU,EAAE;QACnE,cAAc;QACd,UAAU;QACV,eAAe,EAAE,WAAW,CAAC,iBAAiB,IAAI,SAAS;QAC3D,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;KACF,CAAC,CAAC;IAEH,6BAA6B;IAC7B,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,KAAK,CAAC;IACd,CAAC;IAED,sEAAsE;IACtE,IAAI,aAAa,CAAC,iBAAiB,EAAE,CAAC;QACpC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAChC,IAAI,CAAC;YACH,GAAG,CAAC,OAAO,CACT,yEAAyE,CAC1E,CAAC,GAAG,CAAC,aAAa,CAAC,iBAAiB,EAAE,aAAa,CAAC,CAAC;QACxD,CAAC;gBAAS,CAAC;YACT,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,IAAI,YAAY,CAAC,UAAU,KAAK,IAAI,IAAI,UAAU,IAAI,YAAY,CAAC,UAAU,EAAE,CAAC;QAC9E,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;QAChC,IAAI,CAAC;YACH,GAAG,CAAC,OAAO,CACT,0EAA0E,CAC3E,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,cAAc,CAAC,CAAC;QAClD,CAAC;gBAAS,CAAC;YACT,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,MAAM;QACJ,IAAI,EAAE,eAAe;QACrB,UAAU;QACV,OAAO,EAAE,aAAa,CAAC,OAAO;KAC/B,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,cAAsB,EACtB,SAAoC,WAAW;IAE/C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,sFAAsF,CACvF,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,cAAc,CAAC,CAAC;QAExD,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YACzB,kDAAkD;YAClD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB,+CAA+C,CAChD,CAAC,GAAG,CAAC,cAAc,CAAmC,CAAC;YAExD,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,KAAK,CAAC,iBAAiB,cAAc,cAAc,CAAC,CAAC;YACjE,CAAC;YACD,qCAAqC;QACvC,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,cAAsB;IAEtB,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,IAAI,CAAC;QACH,+BAA+B;QAC/B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,2DAA2D,CAC5D,CAAC,GAAG,CAAC,cAAc,CAA8D,CAAC;QAEnF,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAEnD,uBAAuB;QACvB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB,kEAAkE,CACnE,CAAC,GAAG,CAAC,cAAc,CAAsB,CAAC;QAE3C,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAE/E,gDAAgD;QAChD,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAC7B;;0BAEoB,CACrB,CAAC,GAAG,CAAC,cAAc,CAAwC,CAAC;QAE7D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAE3C,gDAAgD;QAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC;QACrD,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAE,CAAC;QACpC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IACrD,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,0EAA0E;AAE1E;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,OAAiC,EAAE;IAEnC,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,IAAI,CAAC;QACH,IAAI,KAAK,GAAG;;sCAEsB,CAAC;QACnC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAAc,EAAE,CAAC;QAE7B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,KAAK,IAAI,UAAU,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChD,CAAC;QACD,KAAK,IAAI,6BAA6B,CAAC;QACvC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,KAAK,IAAI,UAAU,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAG1C,CAAC;QAEH,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;YACpB,mBAAmB;YACnB,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CACtB,gFAAgF,CACjF,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAsD,CAAC;YAEnE,8CAA8C;YAC9C,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB;iDACyC,CAC1C,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAA+C,CAAC;YAE5D,OAAO;gBACL,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,SAAS,EAAE,GAAG,CAAC,UAAU;gBACzB,SAAS,EAAE,GAAG,CAAC,UAAU;gBACzB,OAAO,EAAE,GAAG,CAAC,QAAQ;gBACrB,YAAY,EAAE,KAAK;gBACnB,SAAS,EAAE,OAAO,CAAC,UAAU;gBAC7B,YAAY,EAAE,OAAO,CAAC,UAAU;aACjC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,cAAsB;IAEtB,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB;uCACiC,CAClC,CAAC,GAAG,CAAC,cAAc,CAGP,CAAC;QAEd,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,mBAAmB;QACnB,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CACtB,gFAAgF,CACjF,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAsD,CAAC;QAEnE,6CAA6C;QAC7C,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CACtB;;;;;kCAK4B,CAC7B,CAAC,GAAG,CAAC,cAAc,CAIlB,CAAC;QAEH,+DAA+D;QAC/D,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAChC,4DAA4D;YAC5D,IAAI,MAAM,GAAkB,IAAI,CAAC;YACjC,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAC1B,+CAA+C,CAChD,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAA+C,CAAC;YAE1D,IAAI,SAAS,EAAE,WAAW,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACH,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;oBAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;oBAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;oBACxD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;wBAC9D,MAAM,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC;oBACrC,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,+CAA+C;gBACjD,CAAC;YACH,CAAC;YAED,OAAO;gBACL,SAAS,EAAE,CAAC,CAAC,EAAE;gBACf,UAAU,EAAE,CAAC,CAAC,WAAW;gBACzB,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,MAAM;gBACN,QAAQ,EAAE,CAAC,CAAC,SAAS;gBACrB,OAAO,EAAE,CAAC,CAAC,QAAQ;gBACnB,UAAU,EAAE,CAAC,CAAC,WAAW;gBACzB,SAAS,EAAE,CAAC,CAAC,UAAU;gBACvB,OAAO,EAAE,CAAC,CAAC,QAAQ;aACpB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,UAAU;QACV,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CACxB;+CACyC,CAC1C,CAAC,GAAG,CAAC,cAAc,CAA+C,CAAC;QAEpE,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,SAAS,EAAE,GAAG,CAAC,UAAU;YACzB,OAAO,EAAE,GAAG,CAAC,QAAQ;YACrB,YAAY,EAAE,KAAK;YACnB,SAAS,EAAE,OAAO,CAAC,UAAU;YAC7B,YAAY,EAAE,OAAO,CAAC,UAAU;YAChC,KAAK,EAAE,WAAW;SACnB,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,0EAA0E;AAE1E;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,cAAsB,EACtB,aAAqB;IAErB,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,IAAI,CAAC;QACH,6BAA6B;QAC7B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,8CAA8C,CAC/C,CAAC,GAAG,CAAC,cAAc,CAAyC,CAAC;QAE9D,2CAA2C;QAC3C,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAC5B,mEAAmE,CACpE,CAAC,GAAG,CAAC,aAAa,CAA0D,CAAC;QAE9E,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC;YAC3B,OAAO,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB;kDAC4C,CAC7C,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,QAAQ,CAAiC,CAAC;QAE5E,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAChC,kDAAkD;YAClD,OAAO,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,mDAAmD;QACnD,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB;;;;kCAI4B,CAC7B,CAAC,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,SAAS,CAEtC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAC3B,CAAC;QAED,yCAAyC;QACzC,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAElC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,YAAY,GAAG,0BAA0B,CAAC;YAC9C,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;oBACnD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;wBAC9D,+BAA+B;wBAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,UAAwD,CAAC;wBACnF,IAAI,UAAU,EAAE,CAAC;4BACf,MAAM,SAAS,GAAa,EAAE,CAAC;4BAC/B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gCAC7B,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oCAC7B,MAAM,OAAO,GAAG,GAAG,CAAC,OAA8C,CAAC;oCACnE,MAAM,OAAO,GAAG,OAAO,EAAE,OAAqD,CAAC;oCAC/E,IAAI,OAAO,EAAE,CAAC;wCACZ,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;4CAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gDAC5D,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;4CAC7B,CAAC;wCACH,CAAC;oCACH,CAAC;gCACH,CAAC;4BACH,CAAC;4BACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCACzB,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;4BACpC,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,+CAA+C;gBACjD,CAAC;YACH,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,gBAAgB,MAAM,YAAY,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}