@cmodjs/core 0.3.0 → 1.0.0

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 (271) hide show
  1. package/docs/commands.md +50 -10
  2. package/docs/dependencies.md +12 -12
  3. package/docs/hooks.md +39 -27
  4. package/docs/index.md +29 -25
  5. package/docs/install-steps.md +9 -7
  6. package/docs/jobs.md +59 -111
  7. package/docs/mod.md +200 -174
  8. package/docs/options.md +2 -2
  9. package/docs/permissions.md +27 -16
  10. package/docs/session.md +248 -0
  11. package/docs/state.md +11 -7
  12. package/docs/testing.md +65 -22
  13. package/docs/ui.md +108 -76
  14. package/jobs/check.d.ts.map +1 -1
  15. package/jobs/check.js +5 -2
  16. package/jobs/context.d.ts +7 -8
  17. package/jobs/context.d.ts.map +1 -1
  18. package/jobs/context.js +23 -73
  19. package/jobs/permissions/decide-permission.d.ts +5 -3
  20. package/jobs/permissions/decide-permission.d.ts.map +1 -1
  21. package/jobs/permissions/decide-permission.js +6 -4
  22. package/jobs/permissions/find-project-scope.d.ts +1 -1
  23. package/jobs/permissions/find-project-scope.d.ts.map +1 -1
  24. package/jobs/permissions/find-project-scope.js +8 -11
  25. package/jobs/permissions/match-target.d.ts +2 -2
  26. package/jobs/permissions/match-target.d.ts.map +1 -1
  27. package/jobs/permissions.d.ts +1 -1
  28. package/jobs/permissions.d.ts.map +1 -1
  29. package/jobs/permissions.js +6 -4
  30. package/jobs/program.d.ts.map +1 -1
  31. package/jobs/program.js +8 -3
  32. package/jobs/prompt.d.ts +4 -2
  33. package/jobs/prompt.d.ts.map +1 -1
  34. package/jobs/prompt.js +16 -15
  35. package/jobs/schedule.d.ts +2 -2
  36. package/jobs/schedule.d.ts.map +1 -1
  37. package/jobs/schedule.js +9 -9
  38. package/jobs/slash-command.d.ts +4 -4
  39. package/jobs/slash-command.d.ts.map +1 -1
  40. package/jobs/slash-command.js +14 -9
  41. package/jobs/status-line.d.ts +1 -11
  42. package/jobs/status-line.d.ts.map +1 -1
  43. package/jobs/status-line.js +8 -12
  44. package/jobs/tool.d.ts +2 -2
  45. package/jobs/tool.d.ts.map +1 -1
  46. package/jobs/tool.js +15 -9
  47. package/mod.d.ts +154 -75
  48. package/mod.d.ts.map +1 -1
  49. package/mod.js +94 -3
  50. package/options.d.ts +2 -2
  51. package/options.js +19 -19
  52. package/package.json +3 -3
  53. package/records.d.ts +10 -8
  54. package/records.d.ts.map +1 -1
  55. package/records.js +28 -17
  56. package/register.d.ts.map +1 -1
  57. package/register.js +17 -5
  58. package/runtime/announce.d.ts +18 -0
  59. package/runtime/announce.d.ts.map +1 -0
  60. package/runtime/announce.js +66 -0
  61. package/runtime/bound.d.ts +4 -0
  62. package/runtime/bound.d.ts.map +1 -0
  63. package/runtime/bound.js +9 -0
  64. package/runtime/claude.d.ts +3 -2
  65. package/runtime/claude.d.ts.map +1 -1
  66. package/runtime/conversations.d.ts +16 -0
  67. package/runtime/conversations.d.ts.map +1 -0
  68. package/runtime/conversations.js +291 -0
  69. package/runtime/deadline.d.ts +0 -1
  70. package/runtime/deadline.d.ts.map +1 -1
  71. package/runtime/deadline.js +1 -1
  72. package/runtime/dependencies.d.ts +2 -0
  73. package/runtime/dependencies.d.ts.map +1 -1
  74. package/runtime/dependencies.js +9 -0
  75. package/runtime/engine.d.ts +17 -0
  76. package/runtime/engine.d.ts.map +1 -0
  77. package/runtime/engine.js +10 -0
  78. package/runtime/grants.d.ts +4 -0
  79. package/runtime/grants.d.ts.map +1 -1
  80. package/runtime/grants.js +63 -26
  81. package/runtime/hooks.d.ts +5 -4
  82. package/runtime/hooks.d.ts.map +1 -1
  83. package/runtime/hooks.js +10 -5
  84. package/runtime/installer.d.ts.map +1 -1
  85. package/runtime/installer.js +11 -9
  86. package/runtime/lifecycle.d.ts +3 -1
  87. package/runtime/lifecycle.d.ts.map +1 -1
  88. package/runtime/lifecycle.js +316 -185
  89. package/runtime/metadata.d.ts +3 -1
  90. package/runtime/metadata.d.ts.map +1 -1
  91. package/runtime/metadata.js +21 -11
  92. package/runtime/options.d.ts +3 -1
  93. package/runtime/options.d.ts.map +1 -1
  94. package/runtime/options.js +4 -4
  95. package/runtime/programs.d.ts +8 -0
  96. package/runtime/programs.d.ts.map +1 -1
  97. package/runtime/programs.js +39 -1
  98. package/runtime/router.d.ts +2 -1
  99. package/runtime/router.d.ts.map +1 -1
  100. package/runtime/router.js +11 -3
  101. package/runtime/sessions.d.ts +36 -0
  102. package/runtime/sessions.d.ts.map +1 -0
  103. package/runtime/sessions.js +235 -0
  104. package/runtime/state.d.ts +6 -2
  105. package/runtime/state.d.ts.map +1 -1
  106. package/runtime/state.js +46 -13
  107. package/runtime/toaster.d.ts +31 -0
  108. package/runtime/toaster.d.ts.map +1 -0
  109. package/runtime/toaster.js +176 -0
  110. package/runtime/ui.d.ts +6 -17
  111. package/runtime/ui.d.ts.map +1 -1
  112. package/runtime/ui.js +36 -112
  113. package/session/context/context.d.ts +10 -0
  114. package/session/context/context.d.ts.map +1 -0
  115. package/session/context/context.js +2 -0
  116. package/session/context/turn/message/document.d.ts +7 -0
  117. package/session/context/turn/message/document.d.ts.map +1 -0
  118. package/session/context/turn/message/document.js +1 -0
  119. package/session/context/turn/message/message.d.ts +54 -0
  120. package/session/context/turn/message/message.d.ts.map +1 -0
  121. package/session/context/turn/message/message.js +137 -0
  122. package/session/context/turn/message/note.d.ts +8 -0
  123. package/session/context/turn/message/note.d.ts.map +1 -0
  124. package/session/context/turn/message/note.js +1 -0
  125. package/session/context/turn/message/notice.d.ts +6 -0
  126. package/session/context/turn/message/notice.d.ts.map +1 -0
  127. package/session/context/turn/message/notice.js +1 -0
  128. package/session/context/turn/message/prompt.d.ts +8 -0
  129. package/session/context/turn/message/prompt.d.ts.map +1 -0
  130. package/session/context/turn/message/prompt.js +1 -0
  131. package/session/context/turn/message/reply.d.ts +6 -0
  132. package/session/context/turn/message/reply.d.ts.map +1 -0
  133. package/session/context/turn/message/reply.js +1 -0
  134. package/session/context/turn/message/sender.d.ts +14 -0
  135. package/session/context/turn/message/sender.d.ts.map +1 -0
  136. package/session/context/turn/message/sender.js +30 -0
  137. package/session/context/turn/message/skill.d.ts +7 -0
  138. package/session/context/turn/message/skill.d.ts.map +1 -0
  139. package/session/context/turn/message/skill.js +1 -0
  140. package/session/context/turn/message/tool-call.d.ts +9 -0
  141. package/session/context/turn/message/tool-call.d.ts.map +1 -0
  142. package/session/context/turn/message/tool-call.js +1 -0
  143. package/session/context/turn/message/tool-result.d.ts +8 -0
  144. package/session/context/turn/message/tool-result.d.ts.map +1 -0
  145. package/session/context/turn/message/tool-result.js +1 -0
  146. package/session/context/turn/turn.d.ts +12 -0
  147. package/session/context/turn/turn.d.ts.map +1 -0
  148. package/session/context/turn/turn.js +2 -0
  149. package/session/conversation.d.ts +64 -0
  150. package/session/conversation.d.ts.map +1 -0
  151. package/session/conversation.js +123 -0
  152. package/session/goal/goal.d.ts +10 -0
  153. package/session/goal/goal.d.ts.map +1 -0
  154. package/session/goal/goal.js +1 -0
  155. package/session/goal/task.d.ts +16 -0
  156. package/session/goal/task.d.ts.map +1 -0
  157. package/session/goal/task.js +3 -0
  158. package/session/session.d.ts +99 -0
  159. package/session/session.d.ts.map +1 -0
  160. package/session/session.js +1 -0
  161. package/src/jobs/check.ts +7 -4
  162. package/src/jobs/context.ts +24 -82
  163. package/src/jobs/permissions/decide-permission.ts +10 -8
  164. package/src/jobs/permissions/find-project-scope.ts +8 -14
  165. package/src/jobs/permissions/match-target.ts +3 -3
  166. package/src/jobs/permissions.ts +8 -6
  167. package/src/jobs/program.ts +7 -3
  168. package/src/jobs/prompt.ts +21 -24
  169. package/src/jobs/schedule.ts +14 -14
  170. package/src/jobs/slash-command.ts +20 -14
  171. package/src/jobs/status-line.ts +9 -21
  172. package/src/jobs/tool.ts +17 -11
  173. package/src/mod.ts +209 -97
  174. package/src/options.ts +22 -22
  175. package/src/records.ts +35 -23
  176. package/src/register.ts +17 -5
  177. package/src/runtime/announce.ts +74 -0
  178. package/src/runtime/bound.ts +12 -0
  179. package/src/runtime/claude.ts +4 -2
  180. package/src/runtime/conversations.ts +302 -0
  181. package/src/runtime/deadline.ts +2 -2
  182. package/src/runtime/dependencies.ts +12 -0
  183. package/src/runtime/engine.ts +22 -0
  184. package/src/runtime/grants.ts +66 -24
  185. package/src/runtime/hooks.ts +19 -10
  186. package/src/runtime/installer.ts +10 -9
  187. package/src/runtime/lifecycle.ts +312 -180
  188. package/src/runtime/metadata.ts +33 -11
  189. package/src/runtime/options.ts +19 -4
  190. package/src/runtime/programs.ts +40 -1
  191. package/src/runtime/router.ts +11 -4
  192. package/src/runtime/sessions.ts +242 -0
  193. package/src/runtime/state.ts +50 -14
  194. package/src/runtime/toaster.ts +218 -0
  195. package/src/runtime/ui.ts +42 -139
  196. package/src/session/context/context.ts +12 -0
  197. package/src/session/context/turn/message/document.ts +8 -0
  198. package/src/session/context/turn/message/message.ts +165 -0
  199. package/src/session/context/turn/message/note.ts +9 -0
  200. package/src/session/context/turn/message/notice.ts +7 -0
  201. package/src/session/context/turn/message/prompt.ts +9 -0
  202. package/src/session/context/turn/message/reply.ts +7 -0
  203. package/src/session/context/turn/message/sender.ts +38 -0
  204. package/src/session/context/turn/message/skill.ts +8 -0
  205. package/src/session/context/turn/message/tool-call.ts +10 -0
  206. package/src/session/context/turn/message/tool-result.ts +9 -0
  207. package/src/session/context/turn/turn.ts +14 -0
  208. package/src/session/conversation.ts +169 -0
  209. package/src/session/goal/goal.ts +9 -0
  210. package/src/session/goal/task.ts +19 -0
  211. package/src/session/session.ts +94 -0
  212. package/src/testing/fake-claude.ts +22 -16
  213. package/src/testing/fake-elements.ts +3 -2
  214. package/src/testing/fake-files.ts +1 -1
  215. package/src/testing/fake-sessions.ts +203 -0
  216. package/src/testing.ts +112 -33
  217. package/src/ui/components.ts +3 -3
  218. package/src/ui/elements.ts +22 -8
  219. package/src/ui/markdown.ts +22 -26
  220. package/src/ui/places.ts +49 -0
  221. package/src/utils/call-effects.ts +3 -3
  222. package/src/utils/changelog.ts +32 -0
  223. package/src/utils/matcher.ts +37 -0
  224. package/src/utils/metadata.ts +17 -15
  225. package/src/utils/parse-shell.ts +9 -8
  226. package/src/utils/paths.ts +15 -1
  227. package/src/utils/text.ts +4 -0
  228. package/testing/fake-claude.d.ts +4 -1
  229. package/testing/fake-claude.d.ts.map +1 -1
  230. package/testing/fake-claude.js +18 -11
  231. package/testing/fake-elements.js +4 -2
  232. package/testing/fake-files.js +1 -1
  233. package/testing/fake-sessions.d.ts +74 -0
  234. package/testing/fake-sessions.d.ts.map +1 -0
  235. package/testing/fake-sessions.js +170 -0
  236. package/testing.d.ts +33 -13
  237. package/testing.d.ts.map +1 -1
  238. package/testing.js +92 -21
  239. package/ui/components.d.ts +2 -3
  240. package/ui/components.d.ts.map +1 -1
  241. package/ui/components.js +3 -3
  242. package/ui/elements.d.ts.map +1 -1
  243. package/ui/elements.js +19 -9
  244. package/ui/markdown.d.ts +35 -33
  245. package/ui/markdown.d.ts.map +1 -1
  246. package/ui/markdown.js +14 -16
  247. package/ui/places.d.ts +43 -0
  248. package/ui/places.d.ts.map +1 -0
  249. package/ui/places.js +31 -0
  250. package/utils/call-effects.d.ts +1 -1
  251. package/utils/call-effects.d.ts.map +1 -1
  252. package/utils/call-effects.js +2 -2
  253. package/utils/changelog.d.ts +9 -0
  254. package/utils/changelog.d.ts.map +1 -0
  255. package/utils/changelog.js +29 -0
  256. package/utils/matcher.d.ts +13 -0
  257. package/utils/matcher.d.ts.map +1 -0
  258. package/utils/matcher.js +32 -0
  259. package/utils/metadata.d.ts +3 -3
  260. package/utils/metadata.js +18 -14
  261. package/utils/parse-shell.js +9 -7
  262. package/utils/paths.d.ts +2 -0
  263. package/utils/paths.d.ts.map +1 -1
  264. package/utils/paths.js +13 -1
  265. package/utils/text.d.ts +1 -0
  266. package/utils/text.d.ts.map +1 -1
  267. package/utils/text.js +3 -0
  268. package/src/ui/slots.ts +0 -36
  269. package/ui/slots.d.ts +0 -208
  270. package/ui/slots.d.ts.map +0 -1
  271. package/ui/slots.js +0 -19
@@ -0,0 +1,54 @@
1
+ import { Document } from './document.js';
2
+ import { Note } from './note.js';
3
+ import { Notice } from './notice.js';
4
+ import { Prompt } from './prompt.js';
5
+ import { Reply } from './reply.js';
6
+ import { Skill } from './skill.js';
7
+ import { ToolCall } from './tool-call.js';
8
+ import { ToolResult } from './tool-result.js';
9
+ export declare const Message = "message";
10
+ export type MessageType = typeof Prompt | typeof Note | typeof Reply | typeof ToolCall | typeof ToolResult | typeof Skill | typeof Document | typeof Notice;
11
+ export type MessageOf<Type extends MessageType> = {
12
+ readonly id: string;
13
+ readonly type: Type;
14
+ readonly at: string;
15
+ readonly session: string;
16
+ readonly context: number;
17
+ readonly turn?: string;
18
+ readonly task?: string;
19
+ };
20
+ export type Message = Prompt | Note | Reply | ToolCall | ToolResult | Skill | Document | Notice;
21
+ export type Placed = 'session' | 'context' | 'turn' | 'task';
22
+ export type Unplaced<M extends Message = Message> = M extends Message ? Omit<M, Placed> : never;
23
+ export type Row = {
24
+ readonly id: string;
25
+ readonly at: string;
26
+ readonly type: 'user' | 'assistant' | 'attachment' | 'system';
27
+ readonly name?: string;
28
+ readonly isMeta: boolean;
29
+ readonly isSummary: boolean;
30
+ readonly content: readonly unknown[];
31
+ readonly origin?: unknown;
32
+ readonly cwd?: string;
33
+ readonly path?: string;
34
+ readonly model?: string;
35
+ };
36
+ export declare const messageTypes: readonly MessageType[];
37
+ export declare const skillPrefix = "Base directory for this skill:";
38
+ export declare function rowOfLine(row: Readonly<Record<string, unknown>>): Row | undefined;
39
+ export declare function rowOfAppend(append: {
40
+ readonly uuid: string;
41
+ readonly door: string;
42
+ readonly origin: unknown;
43
+ readonly message: {
44
+ readonly type: Row['type'];
45
+ readonly name?: string;
46
+ readonly isMeta?: true;
47
+ readonly content: readonly unknown[];
48
+ };
49
+ }, at: string, cwd: string): Row;
50
+ export declare function messagesOf(row: Row, isInTask: boolean): Unplaced[];
51
+ export declare function textOf(content: unknown): string;
52
+ export declare function tagOf(text: string, tag: string): string | undefined;
53
+ export declare function searchText(message: Unplaced): string;
54
+ //# sourceMappingURL=message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../../../src/session/context/turn/message/message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ import { isObject } from '../../../../records.js';
2
+ import { Task } from '../../../goal/task.js';
3
+ import { Document } from './document.js';
4
+ import { Note } from './note.js';
5
+ import { Notice } from './notice.js';
6
+ import { Prompt } from './prompt.js';
7
+ import { Reply } from './reply.js';
8
+ import { senderOf } from './sender.js';
9
+ import { Skill } from './skill.js';
10
+ import { ToolCall } from './tool-call.js';
11
+ import { ToolResult } from './tool-result.js';
12
+ export const Message = 'message';
13
+ export const messageTypes = [Prompt, Note, Reply, ToolCall, ToolResult, Skill, Document, Notice];
14
+ export const skillPrefix = 'Base directory for this skill:';
15
+ const rowTypes = ['user', 'assistant', 'attachment', 'system'];
16
+ const memoryPath = /^Contents of (.+?) \(/;
17
+ export function rowOfLine(row) {
18
+ const { uuid, timestamp, type } = row;
19
+ if (typeof uuid !== 'string' || typeof timestamp !== 'string' || typeof type !== 'string' || !rowTypes.includes(type))
20
+ return undefined;
21
+ const message = isObject(row['message']) ? row['message'] : {};
22
+ const attachment = isObject(row['attachment']) ? row['attachment'] : {};
23
+ const content = type === 'attachment' ? attachment['content'] : type === 'system' ? row['content'] : message['content'];
24
+ const name = type === 'attachment' ? attachment['type'] : row['subtype'];
25
+ return {
26
+ id: uuid,
27
+ at: timestamp,
28
+ type: type,
29
+ ...(typeof name === 'string' ? { name } : {}),
30
+ isMeta: row['isMeta'] === true,
31
+ isSummary: row['isCompactSummary'] === true,
32
+ content: blocksOf(content),
33
+ ...(row['origin'] === undefined ? {} : { origin: row['origin'] }),
34
+ ...(typeof row['cwd'] === 'string' ? { cwd: row['cwd'] } : {}),
35
+ ...(typeof attachment['path'] === 'string' ? { path: attachment['path'] } : {}),
36
+ ...(typeof message['model'] === 'string' ? { model: message['model'] } : {}),
37
+ };
38
+ }
39
+ export function rowOfAppend(append, at, cwd) {
40
+ const { message, origin } = append;
41
+ const text = textOf(message.content);
42
+ const path = message.type === 'attachment' ? memoryPath.exec(text)?.[1] : undefined;
43
+ const model = isObject(origin) && origin['kind'] === 'model' && typeof origin['model'] === 'string' ? origin['model'] : undefined;
44
+ return {
45
+ id: append.uuid,
46
+ at,
47
+ type: message.type,
48
+ ...(message.name === undefined ? {} : { name: message.name }),
49
+ isMeta: message.isMeta === true,
50
+ isSummary: append.door === 'compaction',
51
+ content: message.content,
52
+ origin,
53
+ cwd,
54
+ ...(path === undefined ? {} : { path }),
55
+ ...(model === undefined ? {} : { model }),
56
+ };
57
+ }
58
+ export function messagesOf(row, isInTask) {
59
+ const found = unplacedOf(row, isInTask);
60
+ return found.length === 1 ? found : found.map((message, index) => ({ ...message, id: `${row.id}:${index}` }));
61
+ }
62
+ function unplacedOf(row, isInTask) {
63
+ const base = { id: row.id, at: row.at };
64
+ const text = textOf(row.content).trim();
65
+ if (row.type === 'system')
66
+ return row.name === 'turn_duration' || row.name === 'compact_boundary' || text === '' ? [] : [{ ...base, type: Notice, text }];
67
+ if (row.type === 'attachment')
68
+ return row.name === 'nested_memory' ? [{ ...base, type: Document, path: row.path ?? '', text }] : [];
69
+ if (row.type === 'assistant') {
70
+ return row.content.filter(isObject).flatMap((block) => {
71
+ if (block['type'] === 'text' && typeof block['text'] === 'string' && block['text'].trim() !== '')
72
+ return [{ ...base, type: Reply, text: block['text'].trim() }];
73
+ if (block['type'] !== 'tool_use' || typeof block['id'] !== 'string' || typeof block['name'] !== 'string')
74
+ return [];
75
+ return [{ ...base, type: ToolCall, callId: block['id'], name: block['name'], input: isObject(block['input']) ? block['input'] : {}, cwd: row.cwd ?? '' }];
76
+ });
77
+ }
78
+ if (row.isSummary)
79
+ return [];
80
+ const results = row.content.filter((block) => isObject(block) && block['type'] === 'tool_result' && typeof block['tool_use_id'] === 'string');
81
+ if (results.length > 0)
82
+ return results.map((block) => ({ ...base, type: ToolResult, callId: block['tool_use_id'], text: textOf(block['content']), isError: block['is_error'] === true }));
83
+ if (text === '')
84
+ return [];
85
+ if (text.startsWith(skillPrefix))
86
+ return [{ ...base, type: Skill, name: basename(text.slice(skillPrefix.length).split('\n')[0]?.trim() ?? ''), text }];
87
+ if (text.startsWith('<task-notification'))
88
+ return [{ ...base, type: Note, text: tagOf(text, 'summary') ?? text, from: { type: Task } }];
89
+ if (row.isMeta)
90
+ return [{ ...base, type: Note, text, from: senderOf(row.origin, isInTask) }];
91
+ const prompt = promptText(text);
92
+ return prompt === undefined ? [] : [{ ...base, type: Prompt, text: prompt, from: senderOf(row.origin, isInTask) }];
93
+ }
94
+ export function textOf(content) {
95
+ if (typeof content === 'string')
96
+ return content;
97
+ if (!Array.isArray(content))
98
+ return '';
99
+ return content.flatMap((block) => (isObject(block) && block['type'] === 'text' && typeof block['text'] === 'string' ? [block['text']] : [])).join('\n');
100
+ }
101
+ export function tagOf(text, tag) {
102
+ return new RegExp(`<${tag}>([\\s\\S]*?)</${tag}>`).exec(text)?.[1]?.trim();
103
+ }
104
+ const toolValueChars = 1024;
105
+ export function searchText(message) {
106
+ if (message.type === ToolCall)
107
+ return [message.name, ...stringsIn(message.input).map((value) => value.slice(0, toolValueChars))].join('\n');
108
+ if (message.type === ToolResult)
109
+ return '';
110
+ if (message.type === Document)
111
+ return `${message.path}\n${message.text}`;
112
+ return message.text;
113
+ }
114
+ function blocksOf(content) {
115
+ if (Array.isArray(content))
116
+ return content;
117
+ return typeof content === 'string' && content !== '' ? [{ type: 'text', text: content }] : [];
118
+ }
119
+ function promptText(text) {
120
+ if (text.startsWith('<local-command-') || text.startsWith('<bash-stdout') || text.startsWith('<bash-stderr'))
121
+ return undefined;
122
+ const command = tagOf(text, 'command-name');
123
+ if (command === undefined)
124
+ return text;
125
+ const args = tagOf(text, 'command-args') ?? '';
126
+ return args === '' ? command : `${command} ${args}`;
127
+ }
128
+ function basename(path) {
129
+ return path.slice(path.lastIndexOf('/') + 1);
130
+ }
131
+ function stringsIn(value) {
132
+ if (typeof value === 'string')
133
+ return [value];
134
+ if (Array.isArray(value))
135
+ return value.flatMap(stringsIn);
136
+ return isObject(value) ? Object.values(value).flatMap(stringsIn) : [];
137
+ }
@@ -0,0 +1,8 @@
1
+ import type { MessageOf } from './message.js';
2
+ import type { Sender } from './sender.js';
3
+ export declare const Note = "note";
4
+ export type Note = MessageOf<typeof Note> & {
5
+ readonly text: string;
6
+ readonly from: Sender;
7
+ };
8
+ //# sourceMappingURL=note.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"note.d.ts","sourceRoot":"","sources":["../../../../src/session/context/turn/message/note.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,eAAO,MAAM,IAAI,SAAS,CAAA;AAE1B,MAAM,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,IAAI,CAAC,GAAG;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB,CAAA"}
@@ -0,0 +1 @@
1
+ export const Note = 'note';
@@ -0,0 +1,6 @@
1
+ import type { MessageOf } from './message.js';
2
+ export declare const Notice = "notice";
3
+ export type Notice = MessageOf<typeof Notice> & {
4
+ readonly text: string;
5
+ };
6
+ //# sourceMappingURL=notice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notice.d.ts","sourceRoot":"","sources":["../../../../src/session/context/turn/message/notice.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,eAAO,MAAM,MAAM,WAAW,CAAA;AAE9B,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,MAAM,CAAC,GAAG;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB,CAAA"}
@@ -0,0 +1 @@
1
+ export const Notice = 'notice';
@@ -0,0 +1,8 @@
1
+ import type { MessageOf } from './message.js';
2
+ import type { Sender } from './sender.js';
3
+ export declare const Prompt = "prompt";
4
+ export type Prompt = MessageOf<typeof Prompt> & {
5
+ readonly text: string;
6
+ readonly from: Sender;
7
+ };
8
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../../src/session/context/turn/message/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,eAAO,MAAM,MAAM,WAAW,CAAA;AAE9B,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,MAAM,CAAC,GAAG;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB,CAAA"}
@@ -0,0 +1 @@
1
+ export const Prompt = 'prompt';
@@ -0,0 +1,6 @@
1
+ import type { MessageOf } from './message.js';
2
+ export declare const Reply = "reply";
3
+ export type Reply = MessageOf<typeof Reply> & {
4
+ readonly text: string;
5
+ };
6
+ //# sourceMappingURL=reply.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reply.d.ts","sourceRoot":"","sources":["../../../../src/session/context/turn/message/reply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,eAAO,MAAM,KAAK,UAAU,CAAA;AAE5B,MAAM,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,KAAK,CAAC,GAAG;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB,CAAA"}
@@ -0,0 +1 @@
1
+ export const Reply = 'reply';
@@ -0,0 +1,14 @@
1
+ import { Task } from '../../../goal/task.js';
2
+ export declare const Person = "person";
3
+ export declare const Mod = "mod";
4
+ export declare const Schedule = "schedule";
5
+ export declare const Channel = "channel";
6
+ export declare const Sdk = "sdk";
7
+ export type SenderType = typeof Person | typeof Mod | 'session' | typeof Task | typeof Schedule | typeof Channel | typeof Sdk;
8
+ export type Sender = {
9
+ readonly type: SenderType;
10
+ readonly name?: string;
11
+ readonly as?: typeof Person;
12
+ };
13
+ export declare function senderOf(origin: unknown, isInTask: boolean): Sender;
14
+ //# sourceMappingURL=sender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sender.d.ts","sourceRoot":"","sources":["../../../../src/session/context/turn/message/sender.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAE5C,eAAO,MAAM,MAAM,WAAW,CAAA;AAE9B,eAAO,MAAM,GAAG,QAAQ,CAAA;AAExB,eAAO,MAAM,QAAQ,aAAa,CAAA;AAElC,eAAO,MAAM,OAAO,YAAY,CAAA;AAEhC,eAAO,MAAM,GAAG,QAAQ,CAAA;AAExB,MAAM,MAAM,UAAU,GAAG,OAAO,MAAM,GAAG,OAAO,GAAG,GAAG,SAAS,GAAG,OAAO,IAAI,GAAG,OAAO,QAAQ,GAAG,OAAO,OAAO,GAAG,OAAO,GAAG,CAAA;AAE7H,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAA;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,MAAM,CAAA;CAC5B,CAAA;AAMD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAYnE"}
@@ -0,0 +1,30 @@
1
+ import { isObject } from '../../../../records.js';
2
+ import { Task } from '../../../goal/task.js';
3
+ export const Person = 'person';
4
+ export const Mod = 'mod';
5
+ export const Schedule = 'schedule';
6
+ export const Channel = 'channel';
7
+ export const Sdk = 'sdk';
8
+ const personOrigins = ['human', 'composer', 'bridge', 'slack-ping', 'auto-continuation'];
9
+ const sessionOrigins = ['peer', 'peer-send-message', 'coordinator', 'projects-relay', 'observer', 'observer-activity'];
10
+ export function senderOf(origin, isInTask) {
11
+ const fields = isObject(origin) ? origin : {};
12
+ const kind = typeof fields['kind'] === 'string' ? fields['kind'] : undefined;
13
+ if (kind === undefined)
14
+ return { type: isInTask ? Task : Person };
15
+ if (personOrigins.includes(kind))
16
+ return { type: Person };
17
+ if (sessionOrigins.includes(kind))
18
+ return { type: 'session' };
19
+ if (kind === 'plugin' && typeof fields['name'] === 'string')
20
+ return { type: Mod, name: fields['name'], ...(fields['asUser'] === true ? { as: Person } : {}) };
21
+ if (kind === 'scheduled-trigger')
22
+ return { type: Schedule };
23
+ if (kind === 'channel' && typeof fields['server'] === 'string')
24
+ return { type: Channel, name: fields['server'] };
25
+ if (kind === 'sdk')
26
+ return { type: Sdk };
27
+ if (kind === 'task-notification')
28
+ return { type: Task };
29
+ return { type: isInTask ? Task : Person };
30
+ }
@@ -0,0 +1,7 @@
1
+ import type { MessageOf } from './message.js';
2
+ export declare const Skill = "skill";
3
+ export type Skill = MessageOf<typeof Skill> & {
4
+ readonly name: string;
5
+ readonly text: string;
6
+ };
7
+ //# sourceMappingURL=skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../../../src/session/context/turn/message/skill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,eAAO,MAAM,KAAK,UAAU,CAAA;AAE5B,MAAM,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,KAAK,CAAC,GAAG;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB,CAAA"}
@@ -0,0 +1 @@
1
+ export const Skill = 'skill';
@@ -0,0 +1,9 @@
1
+ import type { MessageOf } from './message.js';
2
+ export declare const ToolCall = "toolCall";
3
+ export type ToolCall = MessageOf<typeof ToolCall> & {
4
+ readonly callId: string;
5
+ readonly name: string;
6
+ readonly input: Readonly<Record<string, unknown>>;
7
+ readonly cwd: string;
8
+ };
9
+ //# sourceMappingURL=tool-call.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-call.d.ts","sourceRoot":"","sources":["../../../../src/session/context/turn/message/tool-call.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,eAAO,MAAM,QAAQ,aAAa,CAAA;AAElC,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,QAAQ,CAAC,GAAG;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACjD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB,CAAA"}
@@ -0,0 +1 @@
1
+ export const ToolCall = 'toolCall';
@@ -0,0 +1,8 @@
1
+ import type { MessageOf } from './message.js';
2
+ export declare const ToolResult = "toolResult";
3
+ export type ToolResult = MessageOf<typeof ToolResult> & {
4
+ readonly callId: string;
5
+ readonly text: string;
6
+ readonly isError: boolean;
7
+ };
8
+ //# sourceMappingURL=tool-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-result.d.ts","sourceRoot":"","sources":["../../../../src/session/context/turn/message/tool-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,eAAO,MAAM,UAAU,eAAe,CAAA;AAEtC,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,UAAU,CAAC,GAAG;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B,CAAA"}
@@ -0,0 +1 @@
1
+ export const ToolResult = 'toolResult';
@@ -0,0 +1,12 @@
1
+ import type { Message } from './message/message.js';
2
+ import type { Prompt } from './message/prompt.js';
3
+ export declare const TurnStart = "turnStart";
4
+ export declare const TurnEnd = "turnEnd";
5
+ export type Turn = {
6
+ readonly prompt: Prompt;
7
+ readonly context: number;
8
+ readonly openedAt: string;
9
+ readonly closedAt?: string;
10
+ messages(): Promise<Message[]>;
11
+ };
12
+ //# sourceMappingURL=turn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn.d.ts","sourceRoot":"","sources":["../../../src/session/context/turn/turn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAEjD,eAAO,MAAM,SAAS,cAAc,CAAA;AAEpC,eAAO,MAAM,OAAO,YAAY,CAAA;AAEhC,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;CAC/B,CAAA"}
@@ -0,0 +1,2 @@
1
+ export const TurnStart = 'turnStart';
2
+ export const TurnEnd = 'turnEnd';
@@ -0,0 +1,64 @@
1
+ import { ContextEnd, ContextStart, type Context } from './context/context.js';
2
+ import { Message, type Row } from './context/turn/message/message.js';
3
+ import { TurnEnd, TurnStart, type Turn } from './context/turn/turn.js';
4
+ import { GoalChange, type Goal } from './goal/goal.js';
5
+ import { Task, TaskEnd, TaskStart } from './goal/task.js';
6
+ export type SessionData = {
7
+ readonly id: string;
8
+ readonly title: string;
9
+ readonly project: string;
10
+ readonly cwd: string;
11
+ readonly model: string;
12
+ readonly startedAt: string;
13
+ readonly lastAt: string;
14
+ readonly forkedFrom?: string;
15
+ readonly isRunning: boolean;
16
+ };
17
+ export type ContextData = Omit<Context, 'turns'>;
18
+ export type TurnData = Omit<Turn, 'messages'>;
19
+ export type TaskData = Omit<Task, 'messages' | 'tasks'> & {
20
+ readonly parent?: string;
21
+ };
22
+ export type GoalData = Omit<Goal, 'update' | 'tasks'>;
23
+ export type SessionChange = {
24
+ readonly type: typeof Message;
25
+ readonly message: Message;
26
+ } | {
27
+ readonly type: typeof TurnStart | typeof TurnEnd;
28
+ readonly turn: TurnData;
29
+ } | {
30
+ readonly type: typeof ContextStart | typeof ContextEnd;
31
+ readonly context: ContextData;
32
+ } | {
33
+ readonly type: typeof TaskStart | typeof TaskEnd;
34
+ readonly task: TaskData & {
35
+ readonly context: number;
36
+ };
37
+ } | {
38
+ readonly type: typeof GoalChange;
39
+ readonly goal: GoalData;
40
+ };
41
+ export type ConversationState = {
42
+ readonly session: string;
43
+ readonly context: number;
44
+ readonly contextOpenedAt: string;
45
+ readonly turn?: TurnData;
46
+ readonly goal?: string;
47
+ readonly agentCalls: readonly string[];
48
+ readonly endedCalls: Readonly<Record<string, string>>;
49
+ readonly tasks: Readonly<Record<string, TaskData & {
50
+ readonly context: number;
51
+ }>>;
52
+ };
53
+ export type Conversation = {
54
+ add(row: Row, task?: string): SessionChange[];
55
+ startTask(task: TaskData): SessionChange[];
56
+ endContext(at: string): SessionChange[];
57
+ startContext(at: string): SessionChange[];
58
+ changeGoal(text: string): SessionChange[];
59
+ readonly state: ConversationState;
60
+ };
61
+ export declare const searchLimit = 50;
62
+ export declare function emptyConversation(session: string): ConversationState;
63
+ export declare function createConversation(start: ConversationState): Conversation;
64
+ //# sourceMappingURL=conversation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../src/session/conversation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ import { ContextEnd, ContextStart } from './context/context.js';
2
+ import { Message, messagesOf, tagOf, textOf } from './context/turn/message/message.js';
3
+ import { Note } from './context/turn/message/note.js';
4
+ import { Prompt } from './context/turn/message/prompt.js';
5
+ import { ToolCall } from './context/turn/message/tool-call.js';
6
+ import { ToolResult } from './context/turn/message/tool-result.js';
7
+ import { TurnEnd, TurnStart } from './context/turn/turn.js';
8
+ import { GoalChange } from './goal/goal.js';
9
+ import { Task, TaskEnd, TaskStart } from './goal/task.js';
10
+ export const searchLimit = 50;
11
+ const agentTools = ['Agent', 'Task'];
12
+ const asyncLaunch = 'Async agent launched';
13
+ export function emptyConversation(session) {
14
+ return { session, context: 0, contextOpenedAt: '', agentCalls: [], endedCalls: {}, tasks: {} };
15
+ }
16
+ export function createConversation(start) {
17
+ let { context, contextOpenedAt, turn, goal } = start;
18
+ const agentCalls = new Set(start.agentCalls);
19
+ const endedCalls = new Map(Object.entries(start.endedCalls));
20
+ const tasks = new Map(Object.entries(start.tasks));
21
+ const startContext = (at) => {
22
+ context += 1;
23
+ contextOpenedAt = at;
24
+ return [{ type: ContextStart, context: { number: context, openedAt: at } }];
25
+ };
26
+ const endContext = (at) => (context === 0 ? [] : [{ type: ContextEnd, context: { number: context, openedAt: contextOpenedAt, closedAt: at } }]);
27
+ const endTurn = (at) => {
28
+ if (turn === undefined)
29
+ return [];
30
+ const ended = { ...turn, closedAt: at };
31
+ turn = undefined;
32
+ return [{ type: TurnEnd, turn: ended }];
33
+ };
34
+ const endTask = (call, at) => {
35
+ const task = [...tasks.values()].find((each) => each.openedBy === call);
36
+ if (task === undefined) {
37
+ if (agentCalls.has(call))
38
+ endedCalls.set(call, at);
39
+ return [];
40
+ }
41
+ if (task.closedAt !== undefined)
42
+ return [];
43
+ const ended = { ...task, closedAt: at };
44
+ tasks.set(task.id, ended);
45
+ agentCalls.delete(call);
46
+ return [{ type: TaskEnd, task: ended }];
47
+ };
48
+ const changeGoal = (text) => {
49
+ goal = text;
50
+ return [{ type: GoalChange, goal: { text } }];
51
+ };
52
+ return {
53
+ add(row, task) {
54
+ const changes = [];
55
+ if (task === undefined && context === 0)
56
+ changes.push(...startContext(row.at));
57
+ if (task === undefined && row.type === 'system' && row.name === 'turn_duration')
58
+ return [...changes, ...endTurn(row.at)];
59
+ if (task === undefined && row.type === 'system' && row.name === 'compact_boundary')
60
+ return [...changes, ...endContext(row.at), ...startContext(row.at)];
61
+ const owner = task === undefined ? undefined : tasks.get(task);
62
+ for (const unplaced of messagesOf(row, task !== undefined)) {
63
+ if (task === undefined && unplaced.type === Prompt) {
64
+ changes.push(...endTurn(row.at));
65
+ const opened = { prompt: { ...unplaced, session: start.session, context, turn: unplaced.id }, context, openedAt: row.at };
66
+ turn = opened;
67
+ changes.push({ type: TurnStart, turn: opened });
68
+ if (goal === undefined)
69
+ changes.push(...changeGoal(unplaced.text));
70
+ }
71
+ const placed = {
72
+ ...unplaced,
73
+ session: start.session,
74
+ context: owner?.context ?? context,
75
+ ...(task === undefined && turn !== undefined ? { turn: turn.prompt.id } : {}),
76
+ ...(task === undefined ? {} : { task }),
77
+ };
78
+ changes.push({ type: Message, message: placed });
79
+ if (task !== undefined)
80
+ continue;
81
+ if (placed.type === ToolCall && agentTools.includes(placed.name))
82
+ agentCalls.add(placed.callId);
83
+ if (placed.type === ToolResult && agentCalls.has(placed.callId) && !placed.text.startsWith(asyncLaunch))
84
+ changes.push(...endTask(placed.callId, row.at));
85
+ if (placed.type === Note && placed.from.type === Task) {
86
+ const call = tagOf(textOf(row.content), 'tool-use-id');
87
+ if (call !== undefined && agentCalls.has(call))
88
+ changes.push(...endTask(call, row.at));
89
+ }
90
+ }
91
+ return changes;
92
+ },
93
+ startTask(data) {
94
+ if (tasks.has(data.id))
95
+ return [];
96
+ const started = { ...data, context };
97
+ tasks.set(data.id, started);
98
+ agentCalls.add(data.openedBy);
99
+ const changes = [{ type: TaskStart, task: started }];
100
+ const endedAt = endedCalls.get(data.openedBy);
101
+ if (endedAt !== undefined) {
102
+ endedCalls.delete(data.openedBy);
103
+ changes.push(...endTask(data.openedBy, endedAt));
104
+ }
105
+ return changes;
106
+ },
107
+ endContext,
108
+ startContext,
109
+ changeGoal,
110
+ get state() {
111
+ return {
112
+ session: start.session,
113
+ context,
114
+ contextOpenedAt,
115
+ ...(turn === undefined ? {} : { turn }),
116
+ ...(goal === undefined ? {} : { goal }),
117
+ agentCalls: [...agentCalls],
118
+ endedCalls: Object.fromEntries(endedCalls),
119
+ tasks: Object.fromEntries(tasks),
120
+ };
121
+ },
122
+ };
123
+ }
@@ -0,0 +1,10 @@
1
+ import type { Task } from './task.js';
2
+ export declare const GoalChange = "goalChange";
3
+ export type Goal = {
4
+ readonly text: string;
5
+ update(change: {
6
+ readonly text: string;
7
+ }): Promise<void>;
8
+ tasks(): Promise<Task[]>;
9
+ };
10
+ //# sourceMappingURL=goal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"goal.d.ts","sourceRoot":"","sources":["../../src/session/goal/goal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAErC,eAAO,MAAM,UAAU,eAAe,CAAA;AAEtC,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACxD,KAAK,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;CACzB,CAAA"}
@@ -0,0 +1 @@
1
+ export const GoalChange = 'goalChange';
@@ -0,0 +1,16 @@
1
+ import type { Message } from '../context/turn/message/message.js';
2
+ export declare const Task = "task";
3
+ export declare const TaskStart = "taskStart";
4
+ export declare const TaskEnd = "taskEnd";
5
+ export type Task = {
6
+ readonly id: string;
7
+ readonly title: string;
8
+ readonly agentType: string;
9
+ readonly model?: string;
10
+ readonly openedBy: string;
11
+ readonly openedAt: string;
12
+ readonly closedAt?: string;
13
+ messages(): Promise<Message[]>;
14
+ tasks(): Promise<Task[]>;
15
+ };
16
+ //# sourceMappingURL=task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../src/session/goal/task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAA;AAEjE,eAAO,MAAM,IAAI,SAAS,CAAA;AAE1B,eAAO,MAAM,SAAS,cAAc,CAAA;AAEpC,eAAO,MAAM,OAAO,YAAY,CAAA;AAEhC,MAAM,MAAM,IAAI,GAAG;IACjB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;CACzB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export const Task = 'task';
2
+ export const TaskStart = 'taskStart';
3
+ export const TaskEnd = 'taskEnd';