@kingcrab/pi-imessage 0.0.43 → 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 (187) hide show
  1. package/README.md +101 -127
  2. package/dist/agent/behavior.js +79 -0
  3. package/dist/agent/chats.js +67 -0
  4. package/dist/agent/commands.js +163 -0
  5. package/dist/agent/compaction.js +51 -0
  6. package/dist/agent/deliver.js +139 -0
  7. package/dist/agent/direct-send.js +68 -0
  8. package/dist/agent/harness.js +79 -0
  9. package/dist/agent/health.js +32 -0
  10. package/dist/agent/models.js +69 -0
  11. package/dist/agent/progress-format.js +87 -0
  12. package/dist/agent/progress.js +135 -0
  13. package/dist/agent/prompt.js +79 -0
  14. package/dist/agent/replies.js +9 -0
  15. package/dist/agent/run.js +159 -0
  16. package/dist/agent/scheduling.js +290 -0
  17. package/dist/agent/time.js +18 -0
  18. package/dist/cli.js +88 -191
  19. package/dist/config/settings.js +60 -0
  20. package/dist/extensions/browser.js +326 -0
  21. package/dist/extensions/final-text.js +23 -0
  22. package/dist/extensions/memory.js +109 -0
  23. package/dist/extensions/message.js +33 -0
  24. package/dist/extensions/read-image.js +72 -0
  25. package/dist/extensions/schedules.js +41 -0
  26. package/dist/extensions/subagent.js +54 -0
  27. package/dist/extensions/web.js +99 -0
  28. package/dist/extensions/workspace.js +98 -0
  29. package/dist/main.js +568 -88
  30. package/dist/transport/attachments.js +37 -0
  31. package/dist/transport/http.js +110 -0
  32. package/dist/{rich-text.js → transport/rich-text.js} +25 -13
  33. package/dist/{send.js → transport/send.js} +13 -13
  34. package/dist/transport/watch.js +124 -0
  35. package/dist/web/app.js +748 -0
  36. package/dist/web/history.js +87 -0
  37. package/dist/web/memory.js +81 -0
  38. package/dist/web/page.js +28 -0
  39. package/dist/web/schedules.js +74 -0
  40. package/dist/web/server.js +348 -0
  41. package/dist/web/style.css +543 -0
  42. package/dist/web/tasks.js +63 -0
  43. package/docs/adr/0001-durable-owns-state.md +11 -0
  44. package/docs/adr/0002-module-layering.md +11 -0
  45. package/docs/adr/0003-replies-at-most-once.md +11 -0
  46. package/docs/adr/0004-native-extensions.md +11 -0
  47. package/docs/adr/0005-history-migration.md +11 -0
  48. package/docs/adr/0006-jsonl-storage.md +11 -0
  49. package/docs/adr/0007-images-by-path.md +11 -0
  50. package/docs/adr/0008-compaction-and-run.md +11 -0
  51. package/docs/adr/0009-one-shot-cutover.md +11 -0
  52. package/docs/adr/0010-test-budget.md +11 -0
  53. package/docs/adr/0011-reconcile-unsent-answers.md +24 -0
  54. package/docs/adr/0012-run-in-owned-conversation.md +22 -0
  55. package/docs/adr/0013-thin-adapters-around-durable.md +18 -0
  56. package/docs/adr/0014-ephemeral-private-storage.md +13 -0
  57. package/docs/adr/0015-ordinary-stop-keeps-native-inbox.md +21 -0
  58. package/docs/adr/0016-process-http-transport.md +21 -0
  59. package/docs/adr/0017-browser-cli-owned-scope.md +22 -0
  60. package/docs/adr/0018-tasks-without-prompt-api.md +19 -0
  61. package/docs/adr/0019-remove-scheduled-services.md +41 -0
  62. package/docs/adr/0020-chat-task-progress.md +41 -0
  63. package/docs/adr/0021-readable-progress-without-link-previews.md +33 -0
  64. package/docs/adr/0022-progress-admission-and-settlement.md +35 -0
  65. package/docs/adr/0023-retain-progress-type-prefixes.md +18 -0
  66. package/docs/adr/0024-status-marker-before-type-prefix.md +13 -0
  67. package/docs/adr/0025-reusable-progress-and-command-preview.md +49 -0
  68. package/docs/adr/0026-inline-command-only-requests.md +16 -0
  69. package/docs/adr/0027-command-preview-width.md +10 -0
  70. package/docs/adr/0028-command-preview-120.md +8 -0
  71. package/docs/adr/0030-shared-web-read-cache.md +33 -0
  72. package/docs/adr/0031-quiet-compaction-progress.md +32 -0
  73. package/docs/adr/0032-native-background-schedules.md +58 -0
  74. package/docs/adr/0033-operator-scheduled-run.md +23 -0
  75. package/docs/adr/0034-machine-local-schedule-time.md +36 -0
  76. package/docs/adr/0035-external-business-task-extensions.md +56 -0
  77. package/docs/adr/0036-workspace-policy-and-neutral-service-id.md +37 -0
  78. package/docs/adr/0037-restart-during-in-flight-work.md +30 -0
  79. package/docs/adr/0038-restart-any-time.md +25 -0
  80. package/docs/adr/0039-rerun-interrupted-tools.md +24 -0
  81. package/docs/adr/0040-chat-progress-notices.md +44 -0
  82. package/docs/adr/0041-restart-and-recovery.md +28 -0
  83. package/docs/adr/0042-background-schedules-and-workspace-extensions.md +44 -0
  84. package/docs/adr/0043-remove-legacy-migration.md +23 -0
  85. package/docs/adr/0044-message-channels.md +32 -0
  86. package/docs/adr/0045-chat-scheduling-tools.md +51 -0
  87. package/docs/adr/0046-selective-command-redaction.md +31 -0
  88. package/docs/adr/0047-one-scheduling-path.md +158 -0
  89. package/docs/adr/README.md +50 -0
  90. package/docs/api.md +92 -0
  91. package/docs/architecture.md +164 -0
  92. package/docs/browser.md +93 -0
  93. package/docs/memory.md +27 -0
  94. package/docs/screenshot.png +0 -0
  95. package/docs/workspace-extensions.md +133 -0
  96. package/examples/workspace-extensions/system-context/index.ts +69 -0
  97. package/examples/workspace-extensions/system-context/package.json +3 -0
  98. package/ops/README.md +267 -0
  99. package/ops/preflight.mjs +28 -0
  100. package/package.json +36 -37
  101. package/dist/agent.d.ts +0 -84
  102. package/dist/agent.d.ts.map +0 -1
  103. package/dist/agent.js +0 -780
  104. package/dist/agent.js.map +0 -1
  105. package/dist/cli.d.ts +0 -15
  106. package/dist/cli.d.ts.map +0 -1
  107. package/dist/cli.js.map +0 -1
  108. package/dist/imessage.d.ts +0 -33
  109. package/dist/imessage.d.ts.map +0 -1
  110. package/dist/imessage.js +0 -76
  111. package/dist/imessage.js.map +0 -1
  112. package/dist/logger.d.ts +0 -33
  113. package/dist/logger.d.ts.map +0 -1
  114. package/dist/logger.js +0 -104
  115. package/dist/logger.js.map +0 -1
  116. package/dist/main.d.ts +0 -5
  117. package/dist/main.d.ts.map +0 -1
  118. package/dist/main.js.map +0 -1
  119. package/dist/memory.d.ts +0 -53
  120. package/dist/memory.d.ts.map +0 -1
  121. package/dist/memory.js +0 -196
  122. package/dist/memory.js.map +0 -1
  123. package/dist/model-health.d.ts +0 -11
  124. package/dist/model-health.d.ts.map +0 -1
  125. package/dist/model-health.js +0 -69
  126. package/dist/model-health.js.map +0 -1
  127. package/dist/pipeline.d.ts +0 -27
  128. package/dist/pipeline.d.ts.map +0 -1
  129. package/dist/pipeline.js +0 -59
  130. package/dist/pipeline.js.map +0 -1
  131. package/dist/queue.d.ts +0 -23
  132. package/dist/queue.d.ts.map +0 -1
  133. package/dist/queue.js +0 -89
  134. package/dist/queue.js.map +0 -1
  135. package/dist/reminders.d.ts +0 -42
  136. package/dist/reminders.d.ts.map +0 -1
  137. package/dist/reminders.js +0 -207
  138. package/dist/reminders.js.map +0 -1
  139. package/dist/rich-text.d.ts +0 -26
  140. package/dist/rich-text.d.ts.map +0 -1
  141. package/dist/rich-text.js.map +0 -1
  142. package/dist/self-echo.d.ts +0 -19
  143. package/dist/self-echo.d.ts.map +0 -1
  144. package/dist/self-echo.js +0 -54
  145. package/dist/self-echo.js.map +0 -1
  146. package/dist/send.d.ts +0 -24
  147. package/dist/send.d.ts.map +0 -1
  148. package/dist/send.js.map +0 -1
  149. package/dist/settings.d.ts +0 -44
  150. package/dist/settings.d.ts.map +0 -1
  151. package/dist/settings.js +0 -80
  152. package/dist/settings.js.map +0 -1
  153. package/dist/store.d.ts +0 -57
  154. package/dist/store.d.ts.map +0 -1
  155. package/dist/store.js +0 -124
  156. package/dist/store.js.map +0 -1
  157. package/dist/tasks.d.ts +0 -95
  158. package/dist/tasks.d.ts.map +0 -1
  159. package/dist/tasks.js +0 -384
  160. package/dist/tasks.js.map +0 -1
  161. package/dist/types.d.ts +0 -93
  162. package/dist/types.d.ts.map +0 -1
  163. package/dist/types.js +0 -38
  164. package/dist/types.js.map +0 -1
  165. package/dist/watch.d.ts +0 -21
  166. package/dist/watch.d.ts.map +0 -1
  167. package/dist/watch.js +0 -219
  168. package/dist/watch.js.map +0 -1
  169. package/dist/web/data.d.ts +0 -11
  170. package/dist/web/data.d.ts.map +0 -1
  171. package/dist/web/data.js +0 -56
  172. package/dist/web/data.js.map +0 -1
  173. package/dist/web/html.d.ts +0 -5
  174. package/dist/web/html.d.ts.map +0 -1
  175. package/dist/web/html.js +0 -16
  176. package/dist/web/html.js.map +0 -1
  177. package/dist/web/index.d.ts +0 -25
  178. package/dist/web/index.d.ts.map +0 -1
  179. package/dist/web/index.js +0 -335
  180. package/dist/web/index.js.map +0 -1
  181. package/dist/web/render.d.ts +0 -11
  182. package/dist/web/render.d.ts.map +0 -1
  183. package/dist/web/render.js +0 -56
  184. package/dist/web/render.js.map +0 -1
  185. package/dist/web/templates/logs.eta +0 -75
  186. package/dist/web/templates/memory.eta +0 -91
  187. package/dist/web/templates/page.eta +0 -98
@@ -1 +0,0 @@
1
- {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- /** Lightweight live check for the currently configured default AI model. */
2
- export interface ModelHealthResult {
3
- ok: boolean;
4
- model: string | null;
5
- latencyMs: number;
6
- checkedAt: string;
7
- error?: string;
8
- }
9
- export type ModelHealthChecker = () => Promise<ModelHealthResult>;
10
- export declare function createModelHealthChecker(workingDir: string): ModelHealthChecker;
11
- //# sourceMappingURL=model-health.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model-health.d.ts","sourceRoot":"","sources":["../src/model-health.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAO5E,MAAM,WAAW,iBAAiB;IACjC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,kBAAkB,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAElE,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,kBAAkB,CAuE/E"}
@@ -1,69 +0,0 @@
1
- /** Lightweight live check for the currently configured default AI model. */
2
- import { ModelRuntime, SettingsManager, getAgentDir } from "@earendil-works/pi-coding-agent";
3
- const CHECK_TIMEOUT_MS = 30_000;
4
- export function createModelHealthChecker(workingDir) {
5
- const agentDir = getAgentDir();
6
- const modelRuntimePromise = ModelRuntime.create({
7
- authPath: `${agentDir}/auth.json`,
8
- modelsPath: `${agentDir}/models.json`,
9
- });
10
- return async () => {
11
- const startedAt = Date.now();
12
- let modelLabel = null;
13
- try {
14
- const modelRuntime = await modelRuntimePromise;
15
- await modelRuntime.refresh();
16
- const settings = SettingsManager.create(workingDir, agentDir);
17
- const provider = settings.getDefaultProvider();
18
- const modelId = settings.getDefaultModel();
19
- if (!provider || !modelId)
20
- throw new Error("No default model configured");
21
- const model = modelRuntime.getModel(provider, modelId);
22
- modelLabel = `${provider}/${modelId}`;
23
- if (!model)
24
- throw new Error(`Default model not found: ${modelLabel}`);
25
- console.log(`[health] model check start: ${modelLabel}`);
26
- const message = {
27
- role: "user",
28
- content: "Reply with exactly OK.",
29
- timestamp: Date.now(),
30
- };
31
- const response = await modelRuntime.complete(model, { messages: [message] }, {
32
- maxTokens: 64,
33
- maxRetries: 0,
34
- timeoutMs: CHECK_TIMEOUT_MS,
35
- signal: AbortSignal.timeout(CHECK_TIMEOUT_MS),
36
- });
37
- if (response.stopReason === "error" || response.stopReason === "aborted") {
38
- throw new Error(response.errorMessage || `Model stopped with reason: ${response.stopReason}`);
39
- }
40
- const text = response.content
41
- .filter((part) => part.type === "text")
42
- .map((part) => part.text)
43
- .join("")
44
- .trim();
45
- if (text !== "OK")
46
- throw new Error(`Model health probe expected OK, received ${JSON.stringify(text)}`);
47
- const result = {
48
- ok: true,
49
- model: modelLabel,
50
- latencyMs: Date.now() - startedAt,
51
- checkedAt: new Date().toISOString(),
52
- };
53
- console.log(`[health] model check ok: ${modelLabel} latency_ms=${result.latencyMs}`);
54
- return result;
55
- }
56
- catch (error) {
57
- const result = {
58
- ok: false,
59
- model: modelLabel,
60
- latencyMs: Date.now() - startedAt,
61
- checkedAt: new Date().toISOString(),
62
- error: error instanceof Error ? error.message : String(error),
63
- };
64
- console.error(`[health] model check failed: ${modelLabel ?? "unknown"} latency_ms=${result.latencyMs} error="${result.error}"`);
65
- return result;
66
- }
67
- };
68
- }
69
- //# sourceMappingURL=model-health.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model-health.js","sourceRoot":"","sources":["../src/model-health.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAG5E,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE7F,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAYhC,MAAM,UAAU,wBAAwB,CAAC,UAAkB;IAC1D,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,mBAAmB,GAAG,YAAY,CAAC,MAAM,CAAC;QAC/C,QAAQ,EAAE,GAAG,QAAQ,YAAY;QACjC,UAAU,EAAE,GAAG,QAAQ,cAAc;KACrC,CAAC,CAAC;IAEH,OAAO,KAAK,IAAgC,EAAE;QAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,IAAI,UAAU,GAAkB,IAAI,CAAC;QAErC,IAAI,CAAC;YACJ,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAAC;YAC/C,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;YAC9D,MAAM,QAAQ,GAAG,QAAQ,CAAC,kBAAkB,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;YAC3C,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAE1E,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACvD,UAAU,GAAG,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC;YACtC,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC;YAEtE,OAAO,CAAC,GAAG,CAAC,+BAA+B,UAAU,EAAE,CAAC,CAAC;YACzD,MAAM,OAAO,GAAgB;gBAC5B,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,wBAAwB;gBACjC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACrB,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,CAC3C,KAAK,EACL,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,EACvB;gBACC,SAAS,EAAE,EAAE;gBACb,UAAU,EAAE,CAAC;gBACb,SAAS,EAAE,gBAAgB;gBAC3B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC;aAC7C,CACD,CAAC;YACF,IAAI,QAAQ,CAAC,UAAU,KAAK,OAAO,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBAC1E,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,IAAI,8BAA8B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAC/F,CAAC;YACD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO;iBAC3B,MAAM,CAAC,CAAC,IAAI,EAAwE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;iBAC5G,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;iBACxB,IAAI,CAAC,EAAE,CAAC;iBACR,IAAI,EAAE,CAAC;YACT,IAAI,IAAI,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAEvG,MAAM,MAAM,GAAsB;gBACjC,EAAE,EAAE,IAAI;gBACR,KAAK,EAAE,UAAU;gBACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBACjC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACnC,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,4BAA4B,UAAU,eAAe,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;YACrF,OAAO,MAAM,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,MAAM,GAAsB;gBACjC,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,UAAU;gBACjB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBACjC,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACnC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC7D,CAAC;YACF,OAAO,CAAC,KAAK,CACZ,gCAAgC,UAAU,IAAI,SAAS,eAAe,MAAM,CAAC,SAAS,WAAW,MAAM,CAAC,KAAK,GAAG,CAChH,CAAC;YACF,OAAO,MAAM,CAAC;QACf,CAAC;IACF,CAAC,CAAC;AACH,CAAC"}
@@ -1,27 +0,0 @@
1
- /**
2
- * Message pipeline — lifecycle-based processing for incoming messages.
3
- *
4
- * before (× 1) ──► start ──┬── emit reply ──► end (× 1)
5
- * ├── emit reply ──► end (× 1)
6
- * └── ...done
7
- *
8
- * before : Filter & prepare. Runs once. Sets shouldContinue=false to drop.
9
- * start : Calls agent. Invokes emit() for each reply produced.
10
- * Sets shouldContinue=false on outgoing to skip remaining start tasks.
11
- * end : Runs once per emitted reply (send, log, store).
12
- * Receives ChatContext (not IncomingMessage) — only chat-level identity.
13
- */
14
- import type { ChatContext, IncomingMessage, OutgoingMessage } from "./types.js";
15
- export type BeforeTask = (chat: ChatContext, incoming: IncomingMessage, outgoing: OutgoingMessage) => Promise<OutgoingMessage> | OutgoingMessage;
16
- /** emit() queues end-phase processing for one reply. Synchronous — does not block the caller. */
17
- export type EmitFn = (outgoing: OutgoingMessage) => void;
18
- export type StartTask = (chat: ChatContext, incoming: IncomingMessage, outgoing: OutgoingMessage, emit: EmitFn) => Promise<void>;
19
- export type EndTask = (chat: ChatContext, outgoing: OutgoingMessage) => Promise<OutgoingMessage> | OutgoingMessage;
20
- export interface MessagePipeline {
21
- before(task: BeforeTask): void;
22
- start(task: StartTask): void;
23
- end(task: EndTask): void;
24
- process(incoming: IncomingMessage): Promise<OutgoingMessage>;
25
- }
26
- export declare function createMessagePipeline(): MessagePipeline;
27
- //# sourceMappingURL=pipeline.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGhF,MAAM,MAAM,UAAU,GAAG,CACxB,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,eAAe,KACrB,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AAEhD,iGAAiG;AACjG,MAAM,MAAM,MAAM,GAAG,CAAC,QAAQ,EAAE,eAAe,KAAK,IAAI,CAAC;AACzD,MAAM,MAAM,SAAS,GAAG,CACvB,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,eAAe,EACzB,IAAI,EAAE,MAAM,KACR,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,KAAK,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,CAAC;AAEnH,MAAM,WAAW,eAAe;IAC/B,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC7D;AAED,wBAAgB,qBAAqB,IAAI,eAAe,CA8CvD"}
package/dist/pipeline.js DELETED
@@ -1,59 +0,0 @@
1
- /**
2
- * Message pipeline — lifecycle-based processing for incoming messages.
3
- *
4
- * before (× 1) ──► start ──┬── emit reply ──► end (× 1)
5
- * ├── emit reply ──► end (× 1)
6
- * └── ...done
7
- *
8
- * before : Filter & prepare. Runs once. Sets shouldContinue=false to drop.
9
- * start : Calls agent. Invokes emit() for each reply produced.
10
- * Sets shouldContinue=false on outgoing to skip remaining start tasks.
11
- * end : Runs once per emitted reply (send, log, store).
12
- * Receives ChatContext (not IncomingMessage) — only chat-level identity.
13
- */
14
- import { createOutgoingMessage, toChatContext } from "./types.js";
15
- export function createMessagePipeline() {
16
- const beforeTasks = [];
17
- const startTasks = [];
18
- const endTasks = [];
19
- async function runEndTasks(chat, outgoing) {
20
- let result = outgoing;
21
- for (const task of endTasks) {
22
- result = await task(chat, result);
23
- if (!result.shouldContinue)
24
- return;
25
- }
26
- }
27
- async function process(incoming) {
28
- const chat = toChatContext(incoming);
29
- let outgoing = createOutgoingMessage();
30
- for (const task of beforeTasks) {
31
- outgoing = await task(chat, incoming, outgoing);
32
- if (!outgoing.shouldContinue)
33
- return outgoing;
34
- }
35
- // emit() is sync — queues end tasks onto endChain for serialized execution
36
- let endChain = Promise.resolve();
37
- const emit = (out) => {
38
- endChain = endChain
39
- .then(() => runEndTasks(chat, out))
40
- .catch((error) => {
41
- console.error(`[pipeline] end task error for ${chat.chatGuid}:`, error);
42
- });
43
- };
44
- for (const task of startTasks) {
45
- await task(chat, incoming, outgoing, emit);
46
- if (!outgoing.shouldContinue)
47
- break;
48
- }
49
- await endChain;
50
- return outgoing;
51
- }
52
- return {
53
- before: (task) => beforeTasks.push(task),
54
- start: (task) => startTasks.push(task),
55
- end: (task) => endTasks.push(task),
56
- process,
57
- };
58
- }
59
- //# sourceMappingURL=pipeline.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA0BlE,MAAM,UAAU,qBAAqB;IACpC,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,KAAK,UAAU,WAAW,CAAC,IAAiB,EAAE,QAAyB;QACtE,IAAI,MAAM,GAAG,QAAQ,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAClC,IAAI,CAAC,MAAM,CAAC,cAAc;gBAAE,OAAO;QACpC,CAAC;IACF,CAAC;IAED,KAAK,UAAU,OAAO,CAAC,QAAyB;QAC/C,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,QAAQ,GAAG,qBAAqB,EAAE,CAAC;QAEvC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAChC,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAChD,IAAI,CAAC,QAAQ,CAAC,cAAc;gBAAE,OAAO,QAAQ,CAAC;QAC/C,CAAC;QAED,2EAA2E;QAC3E,IAAI,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,IAAI,GAAW,CAAC,GAAG,EAAE,EAAE;YAC5B,QAAQ,GAAG,QAAQ;iBACjB,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;iBAClC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBAChB,OAAO,CAAC,KAAK,CAAC,iCAAiC,IAAI,CAAC,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;YACzE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QACF,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,QAAQ,CAAC,cAAc;gBAAE,MAAM;QACrC,CAAC;QACD,MAAM,QAAQ,CAAC;QAEf,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED,OAAO;QACN,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QACxC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QACtC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC,OAAO;KACP,CAAC;AACH,CAAC"}
package/dist/queue.d.ts DELETED
@@ -1,23 +0,0 @@
1
- /**
2
- * Queue primitives.
3
- *
4
- * AsyncQueue — generic unbounded async queue (push/pull/close).
5
- * KeyedQueue — keyed serial executor (same key serialized, different keys concurrent).
6
- */
7
- export declare class QueueClosedError extends Error {
8
- constructor();
9
- }
10
- export interface AsyncQueue<T> {
11
- push(item: T): void;
12
- pull(): Promise<T>;
13
- close(): void;
14
- }
15
- /**
16
- * Create an async queue with optional file-based persistence.
17
- * When `persistPath` is provided, the buffer is restored on creation
18
- * and flushed to disk after every push/pull.
19
- */
20
- export declare function createAsyncQueue<T>(persistPath?: string): AsyncQueue<T>;
21
- /** Same key → serial. Different keys → concurrent. */
22
- export declare function createKeyedQueue(): (key: string, task: () => Promise<void>) => void;
23
- //# sourceMappingURL=queue.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,qBAAa,gBAAiB,SAAQ,KAAK;;CAK1C;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACpB,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IACnB,KAAK,IAAI,IAAI,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CA4DvE;AAID,sDAAsD;AACtD,wBAAgB,gBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAKnF"}
package/dist/queue.js DELETED
@@ -1,89 +0,0 @@
1
- /**
2
- * Queue primitives.
3
- *
4
- * AsyncQueue — generic unbounded async queue (push/pull/close).
5
- * KeyedQueue — keyed serial executor (same key serialized, different keys concurrent).
6
- */
7
- import { existsSync, readFileSync, writeFileSync } from "node:fs";
8
- export class QueueClosedError extends Error {
9
- constructor() {
10
- super("Queue closed");
11
- this.name = "QueueClosedError";
12
- }
13
- }
14
- /**
15
- * Create an async queue with optional file-based persistence.
16
- * When `persistPath` is provided, the buffer is restored on creation
17
- * and flushed to disk after every push/pull.
18
- */
19
- export function createAsyncQueue(persistPath) {
20
- const buffer = [];
21
- const waiters = [];
22
- let closed = false;
23
- // Restore persisted items on startup
24
- if (persistPath && existsSync(persistPath)) {
25
- try {
26
- const items = JSON.parse(readFileSync(persistPath, "utf-8"));
27
- if (Array.isArray(items)) {
28
- buffer.push(...items);
29
- console.log(`[queue] restored ${items.length} item(s) from ${persistPath}`);
30
- }
31
- }
32
- catch (error) {
33
- console.error(`[queue] failed to restore from ${persistPath}:`, error);
34
- }
35
- }
36
- function flush() {
37
- if (!persistPath)
38
- return;
39
- try {
40
- writeFileSync(persistPath, JSON.stringify(buffer));
41
- }
42
- catch (error) {
43
- console.error(`[queue] failed to persist to ${persistPath}:`, error);
44
- }
45
- }
46
- return {
47
- push(item) {
48
- if (closed)
49
- return;
50
- const waiter = waiters.shift();
51
- if (waiter) {
52
- waiter.resolve(item);
53
- // Item bypassed buffer, but still flush (buffer unchanged)
54
- }
55
- else {
56
- buffer.push(item);
57
- flush();
58
- }
59
- },
60
- pull() {
61
- if (closed)
62
- return Promise.reject(new QueueClosedError());
63
- const item = buffer.shift();
64
- if (item !== undefined) {
65
- flush();
66
- return Promise.resolve(item);
67
- }
68
- return new Promise((resolve, reject) => waiters.push({ resolve, reject }));
69
- },
70
- close() {
71
- closed = true;
72
- for (const waiter of waiters) {
73
- waiter.reject(new QueueClosedError());
74
- }
75
- waiters.length = 0;
76
- buffer.length = 0;
77
- flush();
78
- },
79
- };
80
- }
81
- // ── KeyedQueue ────────────────────────────────────────────────────────────────
82
- /** Same key → serial. Different keys → concurrent. */
83
- export function createKeyedQueue() {
84
- const chains = new Map();
85
- return (key, task) => {
86
- chains.set(key, (chains.get(key) ?? Promise.resolve()).then(task, task));
87
- };
88
- }
89
- //# sourceMappingURL=queue.js.map
package/dist/queue.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"queue.js","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
@@ -1,42 +0,0 @@
1
- export declare const REMINDER_STATUSES: readonly ["pending", "delivered", "cancelled", "failed"];
2
- export type ReminderStatus = (typeof REMINDER_STATUSES)[number];
3
- export interface Reminder {
4
- id: string;
5
- chatGuid: string;
6
- text: string;
7
- scheduledAt: string;
8
- status: ReminderStatus;
9
- attempts: number;
10
- createdAt: string;
11
- deliveredAt: string | null;
12
- cancelledAt: string | null;
13
- lastError: string | null;
14
- idempotencyKey: string | null;
15
- }
16
- export interface CreateReminderInput {
17
- chatGuid: string;
18
- text: string;
19
- scheduledAt: string;
20
- idempotencyKey?: string;
21
- }
22
- export interface CreateReminderResult {
23
- reminder: Reminder;
24
- created: boolean;
25
- }
26
- export interface ReminderService {
27
- start(): void;
28
- stop(): Promise<void>;
29
- create(input: CreateReminderInput): CreateReminderResult;
30
- list(status?: ReminderStatus): Reminder[];
31
- cancel(id: string): Reminder | null;
32
- }
33
- export interface ReminderServiceConfig {
34
- workingDir: string;
35
- deliver: (reminder: Reminder) => Promise<void>;
36
- now?: () => number;
37
- retryBaseMs?: number;
38
- maxAttempts?: number;
39
- }
40
- export declare function parseReminderTime(value: string): number;
41
- export declare function createReminderService(config: ReminderServiceConfig): ReminderService;
42
- //# sourceMappingURL=reminders.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reminders.d.ts","sourceRoot":"","sources":["../src/reminders.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,iBAAiB,0DAA2D,CAAC;AAC1F,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,MAAM,WAAW,QAAQ;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC/B,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,QAAQ,EAAE,CAAC;IAC1C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAsBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOvD;AAsBD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,eAAe,CAiLpF"}
package/dist/reminders.js DELETED
@@ -1,207 +0,0 @@
1
- import { randomUUID } from "node:crypto";
2
- import { mkdirSync } from "node:fs";
3
- import { join } from "node:path";
4
- import Database from "better-sqlite3";
5
- export const REMINDER_STATUSES = ["pending", "delivered", "cancelled", "failed"];
6
- const MAX_TIMER_DELAY_MS = 2_147_000_000;
7
- const DEFAULT_RETRY_BASE_MS = 30_000;
8
- const DEFAULT_MAX_ATTEMPTS = 10;
9
- const EXPLICIT_TIMEZONE_PATTERN = /(Z|[+-]\d{2}:?\d{2})$/i;
10
- export function parseReminderTime(value) {
11
- if (!EXPLICIT_TIMEZONE_PATTERN.test(value)) {
12
- throw new Error("scheduledAt must be ISO 8601 with an explicit timezone, for example 2026-08-08T21:30:00+08:00");
13
- }
14
- const timestamp = Date.parse(value);
15
- if (!Number.isFinite(timestamp))
16
- throw new Error("scheduledAt is not a valid ISO 8601 timestamp");
17
- return timestamp;
18
- }
19
- function iso(timestamp) {
20
- return timestamp === null ? null : new Date(timestamp).toISOString();
21
- }
22
- function mapRow(row) {
23
- return {
24
- id: row.id,
25
- chatGuid: row.chat_guid,
26
- text: row.text,
27
- scheduledAt: new Date(row.scheduled_at).toISOString(),
28
- status: row.status,
29
- attempts: row.attempts,
30
- createdAt: new Date(row.created_at).toISOString(),
31
- deliveredAt: iso(row.delivered_at),
32
- cancelledAt: iso(row.cancelled_at),
33
- lastError: row.last_error,
34
- idempotencyKey: row.idempotency_key,
35
- };
36
- }
37
- export function createReminderService(config) {
38
- const now = config.now ?? Date.now;
39
- const retryBaseMs = config.retryBaseMs ?? DEFAULT_RETRY_BASE_MS;
40
- const maxAttempts = config.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
41
- mkdirSync(config.workingDir, { recursive: true });
42
- const db = new Database(join(config.workingDir, "reminders.db"));
43
- db.pragma("journal_mode = WAL");
44
- db.exec(`
45
- CREATE TABLE IF NOT EXISTS reminders (
46
- id TEXT PRIMARY KEY,
47
- chat_guid TEXT NOT NULL,
48
- text TEXT NOT NULL,
49
- scheduled_at INTEGER NOT NULL,
50
- status TEXT NOT NULL CHECK (status IN ('pending', 'delivered', 'cancelled', 'failed')),
51
- attempts INTEGER NOT NULL DEFAULT 0,
52
- created_at INTEGER NOT NULL,
53
- delivered_at INTEGER,
54
- cancelled_at INTEGER,
55
- last_error TEXT,
56
- idempotency_key TEXT UNIQUE,
57
- next_attempt_at INTEGER NOT NULL
58
- );
59
- CREATE INDEX IF NOT EXISTS reminders_due_idx ON reminders(status, next_attempt_at);
60
- `);
61
- const findById = db.prepare("SELECT * FROM reminders WHERE id = ?");
62
- const findByIdempotencyKey = db.prepare("SELECT * FROM reminders WHERE idempotency_key = ?");
63
- const insert = db.prepare(`
64
- INSERT INTO reminders (
65
- id, chat_guid, text, scheduled_at, status, attempts, created_at,
66
- delivered_at, cancelled_at, last_error, idempotency_key, next_attempt_at
67
- ) VALUES (?, ?, ?, ?, 'pending', 0, ?, NULL, NULL, NULL, ?, ?)
68
- `);
69
- const listAll = db.prepare("SELECT * FROM reminders ORDER BY scheduled_at ASC, created_at ASC");
70
- const listByStatus = db.prepare("SELECT * FROM reminders WHERE status = ? ORDER BY scheduled_at ASC, created_at ASC");
71
- const nextPending = db.prepare("SELECT * FROM reminders WHERE status = 'pending' ORDER BY next_attempt_at ASC, created_at ASC LIMIT 1");
72
- const duePending = db.prepare("SELECT * FROM reminders WHERE status = 'pending' AND next_attempt_at <= ? ORDER BY next_attempt_at ASC, created_at ASC");
73
- const incrementAttempt = db.prepare("UPDATE reminders SET attempts = attempts + 1, last_error = NULL WHERE id = ? AND status = 'pending'");
74
- const markDelivered = db.prepare("UPDATE reminders SET status = 'delivered', delivered_at = ?, last_error = NULL WHERE id = ? AND status = 'pending'");
75
- const markRetry = db.prepare("UPDATE reminders SET next_attempt_at = ?, last_error = ? WHERE id = ? AND status = 'pending'");
76
- const markFailed = db.prepare("UPDATE reminders SET status = 'failed', last_error = ? WHERE id = ? AND status = 'pending'");
77
- const markCancelled = db.prepare("UPDATE reminders SET status = 'cancelled', cancelled_at = ? WHERE id = ? AND status = 'pending'");
78
- let timer = null;
79
- let started = false;
80
- let processing = false;
81
- let activeRun = null;
82
- let closed = false;
83
- function rowById(id) {
84
- return findById.get(id);
85
- }
86
- function clearTimer() {
87
- if (timer)
88
- clearTimeout(timer);
89
- timer = null;
90
- }
91
- function schedule() {
92
- if (!started || processing)
93
- return;
94
- clearTimer();
95
- const next = nextPending.get();
96
- if (!next)
97
- return;
98
- const delay = Math.min(Math.max(0, next.next_attempt_at - now()), MAX_TIMER_DELAY_MS);
99
- timer = setTimeout(() => {
100
- timer = null;
101
- activeRun = processDue()
102
- .catch((error) => console.error("[reminder] scheduler error:", error))
103
- .finally(() => {
104
- activeRun = null;
105
- });
106
- }, delay);
107
- timer.unref();
108
- }
109
- async function processDue() {
110
- if (!started || processing)
111
- return;
112
- processing = true;
113
- try {
114
- const rows = duePending.all(now());
115
- for (const row of rows) {
116
- if (!started)
117
- break;
118
- incrementAttempt.run(row.id);
119
- const current = rowById(row.id);
120
- if (!current || current.status !== "pending")
121
- continue;
122
- const reminder = mapRow(current);
123
- try {
124
- await config.deliver(reminder);
125
- markDelivered.run(now(), row.id);
126
- console.log(`[reminder] delivered ${row.id} to ${row.chat_guid}`);
127
- }
128
- catch (error) {
129
- const message = error instanceof Error ? error.message : String(error);
130
- if (current.attempts >= maxAttempts) {
131
- markFailed.run(message, row.id);
132
- console.error(`[reminder] permanently failed ${row.id} after ${current.attempts} attempts: ${message}`);
133
- }
134
- else {
135
- const retryDelay = Math.min(retryBaseMs * 2 ** Math.max(0, current.attempts - 1), 60 * 60 * 1000);
136
- markRetry.run(now() + retryDelay, message, row.id);
137
- console.warn(`[reminder] delivery failed ${row.id}; retrying in ${retryDelay}ms: ${message}`);
138
- }
139
- }
140
- }
141
- }
142
- finally {
143
- processing = false;
144
- schedule();
145
- }
146
- }
147
- return {
148
- start() {
149
- if (started)
150
- return;
151
- if (closed)
152
- throw new Error("reminder service is closed");
153
- started = true;
154
- console.log(`[reminder] scheduler started (${join(config.workingDir, "reminders.db")})`);
155
- schedule();
156
- },
157
- async stop() {
158
- if (closed)
159
- return;
160
- started = false;
161
- clearTimer();
162
- await activeRun;
163
- db.close();
164
- closed = true;
165
- },
166
- create(input) {
167
- const chatGuid = input.chatGuid.trim();
168
- const text = input.text.trim();
169
- const idempotencyKey = input.idempotencyKey?.trim() || null;
170
- if (!chatGuid)
171
- throw new Error("chatGuid is required");
172
- if (!text)
173
- throw new Error("text is required");
174
- const scheduledAt = parseReminderTime(input.scheduledAt);
175
- if (idempotencyKey) {
176
- const existing = findByIdempotencyKey.get(idempotencyKey);
177
- if (existing) {
178
- if (existing.chat_guid !== chatGuid || existing.text !== text || existing.scheduled_at !== scheduledAt) {
179
- throw new Error("idempotencyKey already exists with different reminder data");
180
- }
181
- return { reminder: mapRow(existing), created: false };
182
- }
183
- }
184
- const id = randomUUID();
185
- const createdAt = now();
186
- insert.run(id, chatGuid, text, scheduledAt, createdAt, idempotencyKey, scheduledAt);
187
- const reminder = mapRow(rowById(id));
188
- console.log(`[reminder] scheduled ${id} for ${reminder.scheduledAt} to ${chatGuid}`);
189
- schedule();
190
- return { reminder, created: true };
191
- },
192
- list(status) {
193
- const rows = status ? listByStatus.all(status) : listAll.all();
194
- return rows.map(mapRow);
195
- },
196
- cancel(id) {
197
- const result = markCancelled.run(now(), id);
198
- if (result.changes === 0)
199
- return null;
200
- const reminder = mapRow(rowById(id));
201
- console.log(`[reminder] cancelled ${id}`);
202
- schedule();
203
- return reminder;
204
- },
205
- };
206
- }
207
- //# sourceMappingURL=reminders.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reminders.js","sourceRoot":"","sources":["../src/reminders.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- /**
2
- * Rich-text sending for Messages.app.
3
- *
4
- * Why this exists:
5
- * - AppleScript can send plain text to Messages.app, but it does not provide a
6
- * good way to construct and send formatted rich text.
7
- * - Node.js can drive shell commands and UI automation, but it cannot natively
8
- * create an AppKit NSAttributedString or write RTF to the macOS pasteboard.
9
- *
10
- * How it works:
11
- * 1. Parse the input text into styled spans (currently basic markdown markers).
12
- * 2. Generate a tiny temporary Swift/AppKit program at runtime.
13
- * 3. Run that Swift helper to place both RTF and plain text on the pasteboard.
14
- * 4. Open the target Messages conversation and paste/send via UI automation.
15
- *
16
- * Notes:
17
- * - This is intentionally self-contained: there is no checked-in Swift helper file.
18
- * - Because sending uses UI automation, it is best-effort and can be disrupted if
19
- * the user is actively interacting with Messages or changing app focus.
20
- * - This path is currently intended for direct-message iMessage chats.
21
- */
22
- export interface RichTextOptions {
23
- markdown?: boolean;
24
- }
25
- export declare function sendRichTextMessage(chatGuid: string, text: string, options?: RichTextOptions): Promise<void>;
26
- //# sourceMappingURL=rich-text.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rich-text.d.ts","sourceRoot":"","sources":["../src/rich-text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAWH,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAqJD,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAWlH"}