@fdcn/sourcefed 0.2.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 (220) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +51 -0
  3. package/dist/chunk-B7T6IZYS.js +5155 -0
  4. package/dist/chunk-MLKGABMK.js +9 -0
  5. package/dist/chunk-NGJ6F5ST.js +766 -0
  6. package/dist/cli.js +30491 -0
  7. package/dist/core-storage.js +13 -0
  8. package/dist/core.js +643 -0
  9. package/dist/daemon.js +5190 -0
  10. package/dist/data/core/SKILL.md +71 -0
  11. package/dist/data/core/references/commands.md +75 -0
  12. package/dist/data/sourcefed/SKILL.md +31 -0
  13. package/dist/guidance.md +71 -0
  14. package/dist/mcp.js +4800 -0
  15. package/dist/opencode.js +12646 -0
  16. package/dist/pi.js +249 -0
  17. package/dist/tui-compiled.mjs +4096 -0
  18. package/dist.dts/adapters/opencode/bridge.d.ts +20 -0
  19. package/dist.dts/adapters/opencode/index.d.ts +3 -0
  20. package/dist.dts/adapters/opencode/tool-result.d.ts +1 -0
  21. package/dist.dts/adapters/opencode/tools/monitor_create.d.ts +3 -0
  22. package/dist.dts/adapters/opencode/tools/monitor_list.d.ts +3 -0
  23. package/dist.dts/adapters/opencode/tools/monitor_start.d.ts +3 -0
  24. package/dist.dts/adapters/opencode/tools/monitor_status.d.ts +3 -0
  25. package/dist.dts/adapters/opencode/tools/monitor_stop.d.ts +3 -0
  26. package/dist.dts/adapters/opencode/tui/plugin.d.ts +3 -0
  27. package/dist.dts/adapters/opencode/tui/sidebar.d.ts +13 -0
  28. package/dist.dts/adapters/opencode/tui.d.ts +7 -0
  29. package/dist.dts/adapters/pi/src/dialog.d.ts +12 -0
  30. package/dist.dts/adapters/pi/src/index.d.ts +2 -0
  31. package/dist.dts/index.d.ts +1 -0
  32. package/dist.dts/packages/cli/src/index.d.ts +2 -0
  33. package/dist.dts/packages/cli/src/skills/command.d.ts +1 -0
  34. package/dist.dts/packages/cli/src/skills/discovery.d.ts +7 -0
  35. package/dist.dts/packages/cli/src/skills/frontmatter.d.ts +5 -0
  36. package/dist.dts/packages/cli/src/skills/index.d.ts +1 -0
  37. package/dist.dts/packages/core/src/events.d.ts +24 -0
  38. package/dist.dts/packages/core/src/events.test.d.ts +1 -0
  39. package/dist.dts/packages/core/src/index.d.ts +9 -0
  40. package/dist.dts/packages/core/src/monitors/index.d.ts +6 -0
  41. package/dist.dts/packages/core/src/monitors/monitor.d.ts +26 -0
  42. package/dist.dts/packages/core/src/monitors/poll/index.d.ts +1 -0
  43. package/dist.dts/packages/core/src/monitors/poll/monitor.d.ts +12 -0
  44. package/dist.dts/packages/core/src/monitors/poll/types/index.d.ts +2 -0
  45. package/dist.dts/packages/core/src/monitors/poll/types/poll-monitor-options.d.ts +6 -0
  46. package/dist.dts/packages/core/src/monitors/poll/types/poll-runner.d.ts +3 -0
  47. package/dist.dts/packages/core/src/monitors/poll/types/routed-event-cursor.d.ts +2 -0
  48. package/dist.dts/packages/core/src/monitors/poll/utils/event-delivery-id.d.ts +2 -0
  49. package/dist.dts/packages/core/src/monitors/poll/utils/tick.d.ts +2 -0
  50. package/dist.dts/packages/core/src/monitors/schema.d.ts +37 -0
  51. package/dist.dts/packages/core/src/monitors/service.d.ts +35 -0
  52. package/dist.dts/packages/core/src/monitors/service.test.d.ts +1 -0
  53. package/dist.dts/packages/core/src/monitors/transport.test.d.ts +1 -0
  54. package/dist.dts/packages/core/src/monitors/types/index.d.ts +2 -0
  55. package/dist.dts/packages/core/src/monitors/types/monitor-record.d.ts +3 -0
  56. package/dist.dts/packages/core/src/monitors/types/monitor-registry.d.ts +3 -0
  57. package/dist.dts/packages/core/src/monitors/utils/monitor-identity.d.ts +5 -0
  58. package/dist.dts/packages/core/src/monitors/utils/monitor-identity.test.d.ts +1 -0
  59. package/dist.dts/packages/core/src/monitors/webhook/index.d.ts +1 -0
  60. package/dist.dts/packages/core/src/monitors/webhook/monitor.d.ts +24 -0
  61. package/dist.dts/packages/core/src/monitors/webhook/types/index.d.ts +3 -0
  62. package/dist.dts/packages/core/src/monitors/webhook/types/pending-webhook-event.d.ts +19 -0
  63. package/dist.dts/packages/core/src/monitors/webhook/types/webhook-monitor-options.d.ts +13 -0
  64. package/dist.dts/packages/core/src/monitors/webhook/utils/constants.d.ts +2 -0
  65. package/dist.dts/packages/core/src/monitors/webhook/utils/deliver-webhook.d.ts +3 -0
  66. package/dist.dts/packages/core/src/monitors/webhook/utils/handle-webhook.d.ts +2 -0
  67. package/dist.dts/packages/core/src/monitors/webhook/utils/handle-webhook.test.d.ts +1 -0
  68. package/dist.dts/packages/core/src/monitors/webhook/utils/heartbeat-webhooks.d.ts +3 -0
  69. package/dist.dts/packages/core/src/runtime.d.ts +23 -0
  70. package/dist.dts/packages/core/src/runtime.test.d.ts +1 -0
  71. package/dist.dts/packages/core/src/sources/index.d.ts +1 -0
  72. package/dist.dts/packages/core/src/sources/schema.d.ts +4 -0
  73. package/dist.dts/packages/core/src/sources/types/index.d.ts +3 -0
  74. package/dist.dts/packages/core/src/sources/types/monitor-source.d.ts +3 -0
  75. package/dist.dts/packages/core/src/sources/types/source-input.d.ts +4 -0
  76. package/dist.dts/packages/core/src/sources/types/source-registry.d.ts +2 -0
  77. package/dist.dts/packages/core/src/storage/in-memory-monitor-store.d.ts +8 -0
  78. package/dist.dts/packages/core/src/storage/index.d.ts +2 -0
  79. package/dist.dts/packages/core/src/storage/json.d.ts +30 -0
  80. package/dist.dts/packages/core/src/storage/json.test.d.ts +1 -0
  81. package/dist.dts/packages/core/src/types/delivery.d.ts +1 -0
  82. package/dist.dts/packages/core/src/types/event-sink.d.ts +12 -0
  83. package/dist.dts/packages/core/src/types/index.d.ts +11 -0
  84. package/dist.dts/packages/core/src/types/monitor-context.d.ts +10 -0
  85. package/dist.dts/packages/core/src/types/monitor-create-input.d.ts +8 -0
  86. package/dist.dts/packages/core/src/types/monitor-event-queue.d.ts +18 -0
  87. package/dist.dts/packages/core/src/types/monitor-event.d.ts +10 -0
  88. package/dist.dts/packages/core/src/types/monitor-options.d.ts +7 -0
  89. package/dist.dts/packages/core/src/types/monitor-store.d.ts +6 -0
  90. package/dist.dts/packages/core/src/types/monitor-target.d.ts +4 -0
  91. package/dist.dts/packages/core/src/types/source-event.d.ts +9 -0
  92. package/dist.dts/packages/core/src/types/source-poll-result.d.ts +6 -0
  93. package/dist.dts/packages/core/src/utils/event-to-text.d.ts +2 -0
  94. package/dist.dts/packages/core/src/utils/to-monitor-event.d.ts +3 -0
  95. package/dist.dts/packages/daemon/src/client.d.ts +2 -0
  96. package/dist.dts/packages/daemon/src/client.test.d.ts +1 -0
  97. package/dist.dts/packages/daemon/src/daemon.d.ts +36 -0
  98. package/dist.dts/packages/daemon/src/daemon.test.d.ts +1 -0
  99. package/dist.dts/packages/daemon/src/dispatch.d.ts +2 -0
  100. package/dist.dts/packages/daemon/src/http.d.ts +5 -0
  101. package/dist.dts/packages/daemon/src/index.d.ts +8 -0
  102. package/dist.dts/packages/daemon/src/registry.d.ts +14 -0
  103. package/dist.dts/packages/daemon/src/types/client.d.ts +21 -0
  104. package/dist.dts/packages/daemon/src/types/daemon.d.ts +58 -0
  105. package/dist.dts/packages/daemon/src/types/index.d.ts +3 -0
  106. package/dist.dts/packages/daemon/src/types/protocol.d.ts +21 -0
  107. package/dist.dts/packages/daemon/src/utils/env.d.ts +1 -0
  108. package/dist.dts/packages/daemon/src/utils/http-server.d.ts +10 -0
  109. package/dist.dts/packages/daemon/src/utils/index.d.ts +6 -0
  110. package/dist.dts/packages/daemon/src/utils/request-router.d.ts +11 -0
  111. package/dist.dts/packages/daemon/src/utils/sink.d.ts +13 -0
  112. package/dist.dts/packages/daemon/src/utils/spawn.d.ts +19 -0
  113. package/dist.dts/packages/daemon/src/utils/target.d.ts +4 -0
  114. package/dist.dts/packages/mcp/src/index.d.ts +2 -0
  115. package/dist.dts/packages/mcp/src/server.d.ts +14 -0
  116. package/dist.dts/packages/mcp/src/server.test.d.ts +1 -0
  117. package/dist.dts/packages/mcp/src/uris.d.ts +3 -0
  118. package/dist.dts/packages/sourcefed/src/server.d.ts +7 -0
  119. package/dist.dts/providers/github/src/api/client.d.ts +3 -0
  120. package/dist.dts/providers/github/src/api/comments.d.ts +1 -0
  121. package/dist.dts/providers/github/src/api/github-api.test.d.ts +1 -0
  122. package/dist.dts/providers/github/src/api/index.d.ts +4 -0
  123. package/dist.dts/providers/github/src/api/logs.d.ts +5 -0
  124. package/dist.dts/providers/github/src/api/pr.d.ts +8 -0
  125. package/dist.dts/providers/github/src/github.test.d.ts +1 -0
  126. package/dist.dts/providers/github/src/index.d.ts +2 -0
  127. package/dist.dts/providers/github/src/monitor.d.ts +15 -0
  128. package/dist.dts/providers/github/src/poll/index.d.ts +2 -0
  129. package/dist.dts/providers/github/src/poll/monitor.d.ts +3 -0
  130. package/dist.dts/providers/github/src/poll/utils/append-comments.d.ts +2 -0
  131. package/dist.dts/providers/github/src/poll/utils/append-github-ci-event.d.ts +2 -0
  132. package/dist.dts/providers/github/src/poll/utils/append-github-conflict-event.d.ts +2 -0
  133. package/dist.dts/providers/github/src/poll/utils/append-github-reviews.d.ts +2 -0
  134. package/dist.dts/providers/github/src/poll/utils/append-github-state-event.d.ts +2 -0
  135. package/dist.dts/providers/github/src/poll/utils/ci-failure-detail.d.ts +1 -0
  136. package/dist.dts/providers/github/src/poll/utils/clean-ci-log.d.ts +1 -0
  137. package/dist.dts/providers/github/src/poll/utils/confirm-still-failing.d.ts +1 -0
  138. package/dist.dts/providers/github/src/poll/utils/empty-cursor.d.ts +2 -0
  139. package/dist.dts/providers/github/src/poll/utils/failure-run-ids.d.ts +1 -0
  140. package/dist.dts/providers/github/src/poll/utils/failure-run-log.d.ts +1 -0
  141. package/dist.dts/providers/github/src/poll/utils/format-failed-check.d.ts +1 -0
  142. package/dist.dts/providers/github/src/poll/utils/index.d.ts +1 -0
  143. package/dist.dts/providers/github/src/poll/utils/poll-github.d.ts +6 -0
  144. package/dist.dts/providers/github/src/poll/utils/poll-helpers.test.d.ts +1 -0
  145. package/dist.dts/providers/github/src/schema.d.ts +17 -0
  146. package/dist.dts/providers/github/src/types/cursor.d.ts +11 -0
  147. package/dist.dts/providers/github/src/types/event.d.ts +11 -0
  148. package/dist.dts/providers/github/src/types/index.d.ts +3 -0
  149. package/dist.dts/providers/github/src/types/source-record.d.ts +5 -0
  150. package/dist.dts/providers/github/src/webhook/index.d.ts +3 -0
  151. package/dist.dts/providers/github/src/webhook/monitor.d.ts +3 -0
  152. package/dist.dts/providers/github/src/webhook/types/context.d.ts +7 -0
  153. package/dist.dts/providers/github/src/webhook/types/event-handler.d.ts +3 -0
  154. package/dist.dts/providers/github/src/webhook/types/event-shape.d.ts +7 -0
  155. package/dist.dts/providers/github/src/webhook/types/index.d.ts +1 -0
  156. package/dist.dts/providers/github/src/webhook/utils/fallback-github-event.d.ts +3 -0
  157. package/dist.dts/providers/github/src/webhook/utils/github-event-handlers.d.ts +2 -0
  158. package/dist.dts/providers/github/src/webhook/utils/index.d.ts +2 -0
  159. package/dist.dts/providers/github/src/webhook/utils/parse-check-run.d.ts +3 -0
  160. package/dist.dts/providers/github/src/webhook/utils/parse-check-suite.d.ts +3 -0
  161. package/dist.dts/providers/github/src/webhook/utils/parse-github-comment.d.ts +3 -0
  162. package/dist.dts/providers/github/src/webhook/utils/parse-github-webhook.d.ts +2 -0
  163. package/dist.dts/providers/github/src/webhook/utils/parse-pull-request-review.d.ts +3 -0
  164. package/dist.dts/providers/github/src/webhook/utils/parse-pull-request.d.ts +3 -0
  165. package/dist.dts/providers/github/src/webhook/utils/pull-request-number.d.ts +1 -0
  166. package/dist.dts/providers/github/src/webhook/utils/update-github-cursor.d.ts +3 -0
  167. package/dist.dts/providers/github/src/webhook/utils/verify-github-webhook.d.ts +1 -0
  168. package/dist.dts/providers/github/src/webhook/utils/verify-hmac.d.ts +1 -0
  169. package/dist.dts/providers/jira/src/index.d.ts +2 -0
  170. package/dist.dts/providers/jira/src/monitor.d.ts +14 -0
  171. package/dist.dts/providers/jira/src/poll/index.d.ts +2 -0
  172. package/dist.dts/providers/jira/src/poll/monitor.d.ts +3 -0
  173. package/dist.dts/providers/jira/src/poll/utils/adf-text.d.ts +1 -0
  174. package/dist.dts/providers/jira/src/poll/utils/append-jira-changelog.d.ts +2 -0
  175. package/dist.dts/providers/jira/src/poll/utils/append-jira-comments.d.ts +2 -0
  176. package/dist.dts/providers/jira/src/poll/utils/append-jira-description.d.ts +2 -0
  177. package/dist.dts/providers/jira/src/poll/utils/empty-cursor.d.ts +2 -0
  178. package/dist.dts/providers/jira/src/poll/utils/format-jira-changelog-item.d.ts +1 -0
  179. package/dist.dts/providers/jira/src/poll/utils/index.d.ts +1 -0
  180. package/dist.dts/providers/jira/src/poll/utils/is-terminal-status.d.ts +1 -0
  181. package/dist.dts/providers/jira/src/poll/utils/jira-auth.d.ts +1 -0
  182. package/dist.dts/providers/jira/src/poll/utils/jira-change-value.d.ts +1 -0
  183. package/dist.dts/providers/jira/src/poll/utils/jira-changelog-event.d.ts +2 -0
  184. package/dist.dts/providers/jira/src/poll/utils/jira-fetch.d.ts +1 -0
  185. package/dist.dts/providers/jira/src/poll/utils/meaningful-changelog-items.d.ts +1 -0
  186. package/dist.dts/providers/jira/src/poll/utils/poll-helpers.test.d.ts +1 -0
  187. package/dist.dts/providers/jira/src/poll/utils/poll-jira.d.ts +6 -0
  188. package/dist.dts/providers/jira/src/schema.d.ts +10 -0
  189. package/dist.dts/providers/jira/src/types/cursor.d.ts +5 -0
  190. package/dist.dts/providers/jira/src/types/event.d.ts +11 -0
  191. package/dist.dts/providers/jira/src/types/index.d.ts +3 -0
  192. package/dist.dts/providers/jira/src/types/source-record.d.ts +4 -0
  193. package/dist.dts/providers/slack/src/index.d.ts +2 -0
  194. package/dist.dts/providers/slack/src/monitor.d.ts +15 -0
  195. package/dist.dts/providers/slack/src/poll/index.d.ts +2 -0
  196. package/dist.dts/providers/slack/src/poll/monitor.d.ts +3 -0
  197. package/dist.dts/providers/slack/src/poll/utils/index.d.ts +2 -0
  198. package/dist.dts/providers/slack/src/poll/utils/parse-slack-read-result.d.ts +5 -0
  199. package/dist.dts/providers/slack/src/poll/utils/poll-slack.d.ts +6 -0
  200. package/dist.dts/providers/slack/src/poll/utils/slack-api.d.ts +4 -0
  201. package/dist.dts/providers/slack/src/schema.d.ts +11 -0
  202. package/dist.dts/providers/slack/src/slack.test.d.ts +1 -0
  203. package/dist.dts/providers/slack/src/types/cursor.d.ts +5 -0
  204. package/dist.dts/providers/slack/src/types/event.d.ts +8 -0
  205. package/dist.dts/providers/slack/src/types/index.d.ts +4 -0
  206. package/dist.dts/providers/slack/src/types/message.d.ts +6 -0
  207. package/dist.dts/providers/slack/src/types/read-result.d.ts +10 -0
  208. package/dist.dts/providers/slack/src/types/source-record.d.ts +5 -0
  209. package/dist.dts/providers/slack/src/utils/index.d.ts +2 -0
  210. package/dist.dts/providers/slack/src/utils/message-at.d.ts +1 -0
  211. package/dist.dts/providers/slack/src/utils/message-timestamp.d.ts +1 -0
  212. package/dist.dts/providers/slack/src/webhook/index.d.ts +2 -0
  213. package/dist.dts/providers/slack/src/webhook/monitor.d.ts +3 -0
  214. package/dist.dts/providers/slack/src/webhook/utils/index.d.ts +3 -0
  215. package/dist.dts/providers/slack/src/webhook/utils/parse-slack-webhook.d.ts +2 -0
  216. package/dist.dts/providers/slack/src/webhook/utils/slack-signature.d.ts +1 -0
  217. package/dist.dts/providers/slack/src/webhook/utils/update-slack-cursor.d.ts +3 -0
  218. package/dist.dts/providers/slack/src/webhook/utils/valid-slack-signature.d.ts +1 -0
  219. package/dist.dts/tui.d.ts +1 -0
  220. package/package.json +68 -0
@@ -0,0 +1,20 @@
1
+ import type { createOpencodeClient } from "@opencode-ai/sdk";
2
+ type OpenCodeClient = ReturnType<typeof createOpencodeClient>;
3
+ export declare class OpenCodeBridge {
4
+ private readonly opencode;
5
+ private daemon?;
6
+ private readonly listeners;
7
+ private lastAttemptAt;
8
+ private lastError;
9
+ constructor(opencode: OpenCodeClient);
10
+ start(): Promise<void>;
11
+ ensureTarget(sessionID: string): Promise<void>;
12
+ callTool(name: string, arguments_: Record<string, unknown>, sessionID: string): Promise<unknown>;
13
+ close(): Promise<void>;
14
+ private ensureDaemon;
15
+ private routeEvents;
16
+ private target;
17
+ }
18
+ export declare function setOpenCodeBridge(bridge: OpenCodeBridge): void;
19
+ export declare function getOpenCodeBridge(): OpenCodeBridge;
20
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { Plugin } from "@opencode-ai/plugin";
2
+ export declare const Sourcefed: Plugin;
3
+ export default Sourcefed;
@@ -0,0 +1 @@
1
+ export declare function callMonitorTool(name: string, arguments_: Record<string, unknown>, sessionID: string): Promise<string>;
@@ -0,0 +1,3 @@
1
+ import { type ToolDefinition } from "@opencode-ai/plugin";
2
+ declare const definition: ToolDefinition;
3
+ export default definition;
@@ -0,0 +1,3 @@
1
+ import { type ToolDefinition } from "@opencode-ai/plugin";
2
+ declare const definition: ToolDefinition;
3
+ export default definition;
@@ -0,0 +1,3 @@
1
+ import { type ToolDefinition } from "@opencode-ai/plugin";
2
+ declare const definition: ToolDefinition;
3
+ export default definition;
@@ -0,0 +1,3 @@
1
+ import { type ToolDefinition } from "@opencode-ai/plugin";
2
+ declare const definition: ToolDefinition;
3
+ export default definition;
@@ -0,0 +1,3 @@
1
+ import { type ToolDefinition } from "@opencode-ai/plugin";
2
+ declare const definition: ToolDefinition;
3
+ export default definition;
@@ -0,0 +1,3 @@
1
+ /** @jsxImportSource @opentui/solid */
2
+ import type { TuiPlugin } from "@opencode-ai/plugin/tui";
3
+ export declare const sourcefedTui: TuiPlugin;
@@ -0,0 +1,13 @@
1
+ /** @jsxImportSource @opentui/solid */
2
+ import { type MonitorView } from "@fdcn/sourcefed/daemon";
3
+ import type { TuiPluginApi, TuiThemeCurrent } from "@opencode-ai/plugin/tui";
4
+ export type SidebarProps = {
5
+ api: TuiPluginApi;
6
+ sessionID: string;
7
+ };
8
+ export declare function Sidebar(props: SidebarProps): import("solid-js").JSX.Element;
9
+ export declare function MonitorRows(props: {
10
+ monitors: () => MonitorView[];
11
+ theme: TuiThemeCurrent;
12
+ compact?: boolean;
13
+ }): import("solid-js").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import type { TuiPlugin } from "@opencode-ai/plugin/tui";
2
+ export declare const id = "sourcefed-tui";
3
+ declare const _default: {
4
+ id: string;
5
+ tui: TuiPlugin;
6
+ };
7
+ export default _default;
@@ -0,0 +1,12 @@
1
+ import type { Theme } from "@earendil-works/pi-coding-agent";
2
+ import type { Component, TUI } from "@earendil-works/pi-tui";
3
+ import type { LogEntryView, MonitorView } from "@fdcn/sourcefed/daemon";
4
+ type Line = {
5
+ text: string;
6
+ };
7
+ export declare function showSourcefedDialog(_tui: TUI, theme: Theme, done: (result: null) => void, title: string, lines: Line[]): Component & {
8
+ handleInput(data: string): void;
9
+ };
10
+ export declare function monitorLines(monitors: MonitorView[], theme: Theme): Line[];
11
+ export declare function logLines(logs: LogEntryView[], theme: Theme): Line[];
12
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
2
+ export default function sourcefedExtension(pi: ExtensionAPI): Promise<void>;
@@ -0,0 +1 @@
1
+ export { default, Sourcefed } from "./adapters/opencode/index.js";
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export declare function main(argv?: string[]): Promise<void>;
@@ -0,0 +1 @@
1
+ export declare function runSkillsCommand(args: string[]): Promise<void>;
@@ -0,0 +1,7 @@
1
+ export type SkillInfo = {
2
+ name: string;
3
+ description: string;
4
+ dir: string;
5
+ hidden: boolean;
6
+ };
7
+ export declare function discoverSkills(): Promise<SkillInfo[]>;
@@ -0,0 +1,5 @@
1
+ export declare function parseFrontmatter(content: string): {
2
+ name: string;
3
+ description: string;
4
+ hidden: boolean;
5
+ } | undefined;
@@ -0,0 +1 @@
1
+ export { runSkillsCommand } from "./command.js";
@@ -0,0 +1,24 @@
1
+ import type { MonitorRecord } from "./monitors";
2
+ import type { MonitorEvent, MonitorEventQueue, MonitorEventSink, MonitorTarget, QueuedMonitorEvent } from "./types";
3
+ export declare class QueueMonitorEventSink implements MonitorEventSink {
4
+ readonly queue: MonitorEventQueue;
5
+ constructor(queue: MonitorEventQueue);
6
+ deliver(input: {
7
+ monitor: MonitorRecord;
8
+ event: MonitorEvent;
9
+ }): Promise<{
10
+ ok: boolean;
11
+ error?: string;
12
+ }>;
13
+ }
14
+ export declare class InMemoryMonitorEventQueue implements MonitorEventQueue {
15
+ private readonly events;
16
+ enqueue(input: {
17
+ monitor: MonitorRecord;
18
+ event: MonitorEvent;
19
+ }): Promise<QueuedMonitorEvent>;
20
+ read(target: MonitorTarget): Promise<QueuedMonitorEvent[]>;
21
+ acknowledge(target: MonitorTarget, eventIDs: string[]): Promise<void>;
22
+ }
23
+ export declare function createQueuedMonitorEvent(monitor: MonitorRecord, event: MonitorEvent): QueuedMonitorEvent;
24
+ export declare function monitorEventID(event: MonitorEvent): string;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ export * from "./monitors";
2
+ export * from "./runtime.js";
3
+ export * from "./events.js";
4
+ export * from "./sources";
5
+ export * from "./types";
6
+ export * from "./storage";
7
+ export { eventToText } from "./utils/event-to-text.js";
8
+ export { toMonitorEvent } from "./utils/to-monitor-event.js";
9
+ export { MonitorRecordSchema, MonitorRegistrySchema } from "./monitors/schema.js";
@@ -0,0 +1,6 @@
1
+ export { Monitor } from "./monitor.js";
2
+ export { MonitorService, type CreateMonitorInput, type CreateMonitorResult } from "./service.js";
3
+ export { dedupeActiveMonitors, monitorIdentity } from "./utils/monitor-identity.js";
4
+ export { PollMonitor, mergeCursors } from "./poll";
5
+ export { WebhookMonitor } from "./webhook";
6
+ export type { MonitorRecord, MonitorRegistry } from "./types";
@@ -0,0 +1,26 @@
1
+ import type { MonitorContext, MonitorEvent, MonitorOptions } from "#sourcefed/types";
2
+ import type { MonitorSource, SourceInput } from "#sourcefed/sources";
3
+ import type { Delivery, MonitorCreateInput } from "#sourcefed/types";
4
+ import type { MonitorRecord } from "./types";
5
+ import type { PollMonitor } from "./poll";
6
+ import type { WebhookMonitor } from "./webhook";
7
+ export declare abstract class Monitor<TSource extends MonitorSource = MonitorSource> {
8
+ readonly type: TSource["type"];
9
+ private readonly schema;
10
+ abstract readonly key: (source: TSource) => string;
11
+ abstract build(input: MonitorCreateInput): SourceInput;
12
+ /** Provider-specific display surface (nerd font icon, labels, describe). */
13
+ abstract readonly icon: string;
14
+ abstract readonly label: (source: TSource) => string;
15
+ abstract readonly detail: (source: TSource) => string;
16
+ abstract readonly describe: (source: TSource) => string;
17
+ readonly poll?: PollMonitor<TSource>;
18
+ readonly webhook?: WebhookMonitor<TSource>;
19
+ protected constructor(options: MonitorOptions<TSource>);
20
+ validateSource(source: unknown): TSource;
21
+ initialDelivery(source: unknown): Delivery;
22
+ resolveDelivery(monitor: MonitorRecord): Delivery | undefined;
23
+ tick(context: MonitorContext, record: MonitorRecord): Promise<number>;
24
+ deliver(context: MonitorContext, record: MonitorRecord, event: MonitorEvent, deliveryId: string): Promise<number>;
25
+ unresponsive(record: MonitorRecord, now?: number): boolean;
26
+ }
@@ -0,0 +1 @@
1
+ export { PollMonitor, mergeCursors } from "./monitor.js";
@@ -0,0 +1,12 @@
1
+ import type { MonitorSource } from "#sourcefed/sources";
2
+ import type { MonitorContext } from "#sourcefed/types";
3
+ import type { MonitorRecord } from "../types";
4
+ import type { Monitor } from "../monitor";
5
+ import { type PollMonitorOptions } from "./types";
6
+ export declare class PollMonitor<TSource extends MonitorSource = MonitorSource> {
7
+ private readonly options;
8
+ constructor(options: PollMonitorOptions<TSource>);
9
+ run(context: MonitorContext, source: Monitor<TSource>, record: MonitorRecord): Promise<number>;
10
+ isUnresponsive(record: MonitorRecord, now: number): boolean;
11
+ }
12
+ export declare function mergeCursors(current: unknown, result: unknown): unknown;
@@ -0,0 +1,2 @@
1
+ export type { PollMonitorOptions } from "./poll-monitor-options.js";
2
+ export { RoutedEventCursorSchema } from "./routed-event-cursor.js";
@@ -0,0 +1,6 @@
1
+ import type { MonitorSource } from "#sourcefed/sources";
2
+ import type { PollRunner } from "./poll-runner.js";
3
+ export type PollMonitorOptions<TSource extends MonitorSource> = {
4
+ run: PollRunner<TSource>;
5
+ mergeCursor?: (current: unknown, result: unknown) => unknown;
6
+ };
@@ -0,0 +1,3 @@
1
+ import type { MonitorSource } from "#sourcefed/sources";
2
+ import type { SourcePollResult } from "#sourcefed/types";
3
+ export type PollRunner<TSource extends MonitorSource> = (source: TSource, cursor: unknown) => Promise<SourcePollResult>;
@@ -0,0 +1,2 @@
1
+ import * as v from "valibot";
2
+ export declare const RoutedEventCursorSchema: v.ArraySchema<v.StringSchema<undefined>, undefined>;
@@ -0,0 +1,2 @@
1
+ import type { MonitorEvent } from "#sourcefed/types";
2
+ export declare function eventDeliveryId(event: MonitorEvent): string;
@@ -0,0 +1,2 @@
1
+ import type { MonitorContext } from "#sourcefed/types";
2
+ export declare function tick(context: MonitorContext): Promise<void>;
@@ -0,0 +1,37 @@
1
+ import * as v from "valibot";
2
+ export declare const MonitorRecordSchema: v.ObjectSchema<{
3
+ readonly id: v.StringSchema<undefined>;
4
+ readonly name: v.StringSchema<undefined>;
5
+ readonly source: v.IntersectSchema<[v.ObjectSchema<{
6
+ readonly type: v.StringSchema<undefined>;
7
+ }, undefined>, v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>], undefined>;
8
+ readonly delivery: v.PicklistSchema<["poll", "webhook"], undefined>;
9
+ readonly target: v.ObjectSchema<{
10
+ readonly kind: v.StringSchema<undefined>;
11
+ readonly id: v.StringSchema<undefined>;
12
+ }, undefined>;
13
+ readonly pollIntervalSec: v.NumberSchema<undefined>;
14
+ readonly enabled: v.BooleanSchema<undefined>;
15
+ readonly createdAt: v.StringSchema<undefined>;
16
+ readonly updatedAt: v.StringSchema<undefined>;
17
+ readonly cursors: v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>;
18
+ }, undefined>;
19
+ export declare const MonitorRegistrySchema: v.ObjectSchema<{
20
+ readonly monitors: v.ArraySchema<v.ObjectSchema<{
21
+ readonly id: v.StringSchema<undefined>;
22
+ readonly name: v.StringSchema<undefined>;
23
+ readonly source: v.IntersectSchema<[v.ObjectSchema<{
24
+ readonly type: v.StringSchema<undefined>;
25
+ }, undefined>, v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>], undefined>;
26
+ readonly delivery: v.PicklistSchema<["poll", "webhook"], undefined>;
27
+ readonly target: v.ObjectSchema<{
28
+ readonly kind: v.StringSchema<undefined>;
29
+ readonly id: v.StringSchema<undefined>;
30
+ }, undefined>;
31
+ readonly pollIntervalSec: v.NumberSchema<undefined>;
32
+ readonly enabled: v.BooleanSchema<undefined>;
33
+ readonly createdAt: v.StringSchema<undefined>;
34
+ readonly updatedAt: v.StringSchema<undefined>;
35
+ readonly cursors: v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>;
36
+ }, undefined>, undefined>;
37
+ }, undefined>;
@@ -0,0 +1,35 @@
1
+ import type { MonitorSource } from "#sourcefed/sources";
2
+ import type { MonitorStore, MonitorTarget } from "#sourcefed/types";
3
+ import type { MonitorRecord } from "./types";
4
+ export type CreateMonitorInput = {
5
+ name: string;
6
+ source: MonitorSource;
7
+ delivery: "poll" | "webhook";
8
+ target: MonitorTarget;
9
+ pollIntervalSec: number;
10
+ };
11
+ export type CreateMonitorResult = {
12
+ monitor: MonitorRecord;
13
+ created: boolean;
14
+ };
15
+ export declare class MonitorService {
16
+ readonly store: MonitorStore;
17
+ private registryQueue;
18
+ constructor(store: MonitorStore);
19
+ list(): Promise<MonitorRecord[]>;
20
+ get(id: string): Promise<MonitorRecord | undefined>;
21
+ create(input: CreateMonitorInput): Promise<CreateMonitorResult>;
22
+ stop(id: string): Promise<MonitorRecord | {
23
+ error: string;
24
+ }>;
25
+ start(id: string): Promise<MonitorRecord | {
26
+ error: string;
27
+ }>;
28
+ remove(id: string): Promise<void>;
29
+ setDelivery(id: string, delivery: "poll" | "webhook"): Promise<void>;
30
+ updateCursor(monitor: MonitorRecord, key: string, value: unknown): Promise<void>;
31
+ updateCursorValue(monitor: MonitorRecord, key: string, update: (cursor: unknown) => unknown): Promise<void>;
32
+ dedupe(): Promise<number>;
33
+ private updateMonitor;
34
+ private transact;
35
+ }
@@ -0,0 +1,2 @@
1
+ export type { MonitorRecord } from "./monitor-record.js";
2
+ export type { MonitorRegistry } from "./monitor-registry.js";
@@ -0,0 +1,3 @@
1
+ import type * as v from "valibot";
2
+ import type { MonitorRecordSchema } from "../schema.js";
3
+ export type MonitorRecord = v.InferOutput<typeof MonitorRecordSchema>;
@@ -0,0 +1,3 @@
1
+ import type * as v from "valibot";
2
+ import type { MonitorRegistrySchema } from "../schema.js";
3
+ export type MonitorRegistry = v.InferOutput<typeof MonitorRegistrySchema>;
@@ -0,0 +1,5 @@
1
+ import type { MonitorSource } from "#sourcefed/sources";
2
+ import type { MonitorTarget } from "#sourcefed/types";
3
+ import type { MonitorRecord } from "../types";
4
+ export declare function monitorIdentity(target: MonitorTarget, source: MonitorSource): string;
5
+ export declare function dedupeActiveMonitors(monitors: MonitorRecord[]): MonitorRecord[];
@@ -0,0 +1 @@
1
+ export { WebhookMonitor } from "./monitor.js";
@@ -0,0 +1,24 @@
1
+ import type { MonitorContext, MonitorEvent } from "#sourcefed/types";
2
+ import type { MonitorSource } from "#sourcefed/sources";
3
+ import type { MonitorRecord } from "../types";
4
+ import type { Monitor } from "../monitor";
5
+ import { type WebhookMonitorOptions } from "./types";
6
+ export declare class WebhookMonitor<TSource extends MonitorSource = MonitorSource> {
7
+ readonly path: string;
8
+ readonly preferred: boolean;
9
+ readonly configured: () => boolean;
10
+ readonly verify: (body: string, request: Request) => boolean;
11
+ readonly acknowledgeBeforeDelivery: boolean;
12
+ readonly challenge?: (payload: unknown) => Record<string, string> | undefined;
13
+ readonly deliveryId: (request: Request, payload: unknown) => string | undefined;
14
+ readonly eventName: (request: Request, payload: unknown) => string;
15
+ readonly parse: (payload: unknown, eventName: string, deliveryId: string) => MonitorEvent | undefined;
16
+ readonly updateCursor?: (event: MonitorEvent, cursor: unknown) => unknown;
17
+ constructor(options: WebhookMonitorOptions);
18
+ isHealthy(record: MonitorRecord): boolean;
19
+ isUnresponsive(record: MonitorRecord, now: number): boolean;
20
+ retryPending(context: MonitorContext, source: Monitor<TSource>, record: MonitorRecord): Promise<number>;
21
+ private addPending;
22
+ private removePending;
23
+ deliver(context: MonitorContext, source: Monitor<TSource>, record: MonitorRecord, event: MonitorEvent, deliveryId: string): Promise<number>;
24
+ }
@@ -0,0 +1,3 @@
1
+ export type { WebhookMonitorOptions } from "./webhook-monitor-options.js";
2
+ export { PendingWebhookEventsSchema } from "./pending-webhook-event.js";
3
+ export type { PendingWebhookEvent } from "./pending-webhook-event.js";
@@ -0,0 +1,19 @@
1
+ import * as v from "valibot";
2
+ import type { MonitorEvent } from "#sourcefed/types";
3
+ export type PendingWebhookEvent = {
4
+ deliveryId: string;
5
+ event: MonitorEvent;
6
+ };
7
+ export declare const PendingWebhookEventsSchema: v.ArraySchema<v.ObjectSchema<{
8
+ readonly deliveryId: v.StringSchema<undefined>;
9
+ readonly event: v.ObjectSchema<{
10
+ readonly source: v.UnknownSchema;
11
+ readonly kind: v.StringSchema<undefined>;
12
+ readonly id: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
13
+ readonly at: v.StringSchema<undefined>;
14
+ readonly summary: v.StringSchema<undefined>;
15
+ readonly body: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
16
+ readonly actionable: v.BooleanSchema<undefined>;
17
+ readonly terminal: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
18
+ }, undefined>;
19
+ }, undefined>, undefined>;
@@ -0,0 +1,13 @@
1
+ import type { MonitorEvent } from "#sourcefed/types";
2
+ export type WebhookMonitorOptions = {
3
+ path: string;
4
+ preferred?: boolean;
5
+ configured: () => boolean;
6
+ verify: (body: string, request: Request) => boolean;
7
+ acknowledgeBeforeDelivery?: boolean;
8
+ challenge?: (payload: unknown) => Record<string, string> | undefined;
9
+ deliveryId: (request: Request, payload: unknown) => string | undefined;
10
+ eventName: (request: Request, payload: unknown) => string;
11
+ parse: (payload: unknown, eventName: string, deliveryId: string) => MonitorEvent | undefined;
12
+ updateCursor?: (event: MonitorEvent, cursor: unknown) => unknown;
13
+ };
@@ -0,0 +1,2 @@
1
+ export declare const WEBHOOK_STALE_MS = 90000;
2
+ export declare const WEBHOOK_STARTUP_GRACE_MS = 120000;
@@ -0,0 +1,3 @@
1
+ import type { MonitorContext, MonitorEvent } from "#sourcefed/types";
2
+ import type { Monitor } from "../../monitor";
3
+ export declare function deliverWebhook(context: MonitorContext, source: Monitor, event: MonitorEvent, deliveryId: string): Promise<number>;
@@ -0,0 +1,2 @@
1
+ import type { MonitorContext } from "#sourcefed/types";
2
+ export declare function handleWebhook(request: Request, context: MonitorContext): Promise<Response>;
@@ -0,0 +1,3 @@
1
+ import type { MonitorContext } from "#sourcefed/types";
2
+ import type { Monitor } from "../../monitor";
3
+ export declare function heartbeatWebhooks(context: MonitorContext, source: Monitor, eventSource: unknown): Promise<void>;
@@ -0,0 +1,23 @@
1
+ import type { MonitorContext, MonitorEventSink, MonitorStore } from "./types";
2
+ import type { MonitorSourceRegistry } from "./sources";
3
+ import { MonitorService } from "./monitors/service.js";
4
+ import type { Monitor } from "./monitors";
5
+ export type MonitorRuntimeOptions = {
6
+ store: MonitorStore;
7
+ sink: MonitorEventSink;
8
+ sources: MonitorSourceRegistry;
9
+ sourceForWebhookPath: (path: string) => Monitor | undefined;
10
+ pollLoopSec?: number;
11
+ };
12
+ export declare class MonitorRuntime {
13
+ readonly service: MonitorService;
14
+ readonly context: MonitorContext;
15
+ private timer?;
16
+ private readonly activeTicks;
17
+ constructor(options: MonitorRuntimeOptions);
18
+ private readonly pollLoopSec;
19
+ start(): Promise<void>;
20
+ tick(): Promise<void>;
21
+ webhook(request: Request): Promise<Response>;
22
+ stop(): Promise<boolean>;
23
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export type { MonitorSource, MonitorSourceRegistry, SourceInput } from "./types";
@@ -0,0 +1,4 @@
1
+ import * as v from "valibot";
2
+ export declare const MonitorSourceSchema: v.IntersectSchema<[v.ObjectSchema<{
3
+ readonly type: v.StringSchema<undefined>;
4
+ }, undefined>, v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>], undefined>;
@@ -0,0 +1,3 @@
1
+ export type { MonitorSource } from "./monitor-source.js";
2
+ export type { MonitorSourceRegistry } from "./source-registry.js";
3
+ export type { SourceInput } from "./source-input.js";
@@ -0,0 +1,3 @@
1
+ export type MonitorSource = {
2
+ type: string;
3
+ } & Record<string, unknown>;
@@ -0,0 +1,4 @@
1
+ import type { MonitorSource } from "./monitor-source.js";
2
+ export type SourceInput = MonitorSource | {
3
+ error: string;
4
+ };
@@ -0,0 +1,2 @@
1
+ import type { Monitor } from "#sourcefed/monitors";
2
+ export type MonitorSourceRegistry = Record<string, Monitor<any>>;
@@ -0,0 +1,8 @@
1
+ import type { MonitorStore } from "../types/monitor-store.js";
2
+ import type { MonitorRegistry } from "../monitors/types/monitor-registry.js";
3
+ export declare class InMemoryMonitorStore implements MonitorStore {
4
+ private registry;
5
+ constructor(initial?: MonitorRegistry);
6
+ load(): Promise<MonitorRegistry>;
7
+ save(registry: MonitorRegistry): Promise<void>;
8
+ }
@@ -0,0 +1,2 @@
1
+ export { InMemoryMonitorStore } from "./in-memory-monitor-store.js";
2
+ export { JsonMonitorEventQueue, JsonMonitorStore, defaultJsonMonitorStore, type JsonMonitorStoreOptions, } from "./json.js";
@@ -0,0 +1,30 @@
1
+ import type { MonitorRecord, MonitorRegistry } from "../monitors/types";
2
+ import type { MonitorEvent, MonitorEventQueue, MonitorStore, MonitorTarget, QueuedMonitorEvent } from "../types";
3
+ export type JsonMonitorStoreOptions = {
4
+ stateDir?: string;
5
+ };
6
+ export declare class JsonMonitorStore implements MonitorStore {
7
+ readonly stateDir: string;
8
+ readonly stateFile: string;
9
+ constructor(options?: JsonMonitorStoreOptions);
10
+ load(): Promise<MonitorRegistry>;
11
+ acquireExclusive(): Promise<() => Promise<void>>;
12
+ save(registry: MonitorRegistry): Promise<void>;
13
+ private readRaw;
14
+ }
15
+ export declare function defaultJsonMonitorStore(options?: JsonMonitorStoreOptions): JsonMonitorStore;
16
+ export declare class JsonMonitorEventQueue implements MonitorEventQueue {
17
+ readonly stateDir: string;
18
+ readonly eventsFile: string;
19
+ private queue;
20
+ constructor(stateDir: string);
21
+ enqueue(input: {
22
+ monitor: MonitorRecord;
23
+ event: MonitorEvent;
24
+ }): Promise<QueuedMonitorEvent>;
25
+ read(target: MonitorTarget): Promise<QueuedMonitorEvent[]>;
26
+ acknowledge(target: MonitorTarget, eventIDs: string[]): Promise<void>;
27
+ private transact;
28
+ private loadEvents;
29
+ private saveEvents;
30
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export type Delivery = "poll" | "webhook";
@@ -0,0 +1,12 @@
1
+ import type { MonitorEvent } from "./monitor-event.js";
2
+ import type { MonitorRecord } from "../monitors/types/monitor-record.js";
3
+ export type EventDeliveryResult = {
4
+ ok: boolean;
5
+ error?: string;
6
+ };
7
+ export interface MonitorEventSink {
8
+ deliver(input: {
9
+ monitor: MonitorRecord;
10
+ event: MonitorEvent;
11
+ }): Promise<EventDeliveryResult>;
12
+ }
@@ -0,0 +1,11 @@
1
+ export type { Delivery } from "./delivery.js";
2
+ export type { EventDeliveryResult, MonitorEventSink } from "./event-sink.js";
3
+ export type { MonitorCreateInput } from "./monitor-create-input.js";
4
+ export type { MonitorEvent } from "./monitor-event.js";
5
+ export type { MonitorContext } from "./monitor-context.js";
6
+ export type { MonitorEventQueue, QueuedMonitorEvent } from "./monitor-event-queue.js";
7
+ export type { MonitorStore } from "./monitor-store.js";
8
+ export type { MonitorTarget } from "./monitor-target.js";
9
+ export type { SourceEvent } from "./source-event.js";
10
+ export type { SourcePollResult } from "./source-poll-result.js";
11
+ export type { MonitorOptions, MonitorSchema } from "./monitor-options.js";
@@ -0,0 +1,10 @@
1
+ import type { MonitorEventSink } from "./event-sink.js";
2
+ import type { Monitor } from "#sourcefed/monitors";
3
+ import type { MonitorSourceRegistry } from "#sourcefed/sources";
4
+ import type { MonitorService } from "../monitors/service.js";
5
+ export type MonitorContext = {
6
+ service: MonitorService;
7
+ sink: MonitorEventSink;
8
+ sources: MonitorSourceRegistry;
9
+ sourceForWebhookPath: (path: string) => Monitor | undefined;
10
+ };
@@ -0,0 +1,8 @@
1
+ export type MonitorCreateInput = {
2
+ issueKey?: string;
3
+ repo?: string;
4
+ prNumber?: number;
5
+ channelId?: string;
6
+ threadTs?: string;
7
+ threadUrl?: string;
8
+ };