@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.
- package/LICENSE +21 -0
- package/README.md +51 -0
- package/dist/chunk-B7T6IZYS.js +5155 -0
- package/dist/chunk-MLKGABMK.js +9 -0
- package/dist/chunk-NGJ6F5ST.js +766 -0
- package/dist/cli.js +30491 -0
- package/dist/core-storage.js +13 -0
- package/dist/core.js +643 -0
- package/dist/daemon.js +5190 -0
- package/dist/data/core/SKILL.md +71 -0
- package/dist/data/core/references/commands.md +75 -0
- package/dist/data/sourcefed/SKILL.md +31 -0
- package/dist/guidance.md +71 -0
- package/dist/mcp.js +4800 -0
- package/dist/opencode.js +12646 -0
- package/dist/pi.js +249 -0
- package/dist/tui-compiled.mjs +4096 -0
- package/dist.dts/adapters/opencode/bridge.d.ts +20 -0
- package/dist.dts/adapters/opencode/index.d.ts +3 -0
- package/dist.dts/adapters/opencode/tool-result.d.ts +1 -0
- package/dist.dts/adapters/opencode/tools/monitor_create.d.ts +3 -0
- package/dist.dts/adapters/opencode/tools/monitor_list.d.ts +3 -0
- package/dist.dts/adapters/opencode/tools/monitor_start.d.ts +3 -0
- package/dist.dts/adapters/opencode/tools/monitor_status.d.ts +3 -0
- package/dist.dts/adapters/opencode/tools/monitor_stop.d.ts +3 -0
- package/dist.dts/adapters/opencode/tui/plugin.d.ts +3 -0
- package/dist.dts/adapters/opencode/tui/sidebar.d.ts +13 -0
- package/dist.dts/adapters/opencode/tui.d.ts +7 -0
- package/dist.dts/adapters/pi/src/dialog.d.ts +12 -0
- package/dist.dts/adapters/pi/src/index.d.ts +2 -0
- package/dist.dts/index.d.ts +1 -0
- package/dist.dts/packages/cli/src/index.d.ts +2 -0
- package/dist.dts/packages/cli/src/skills/command.d.ts +1 -0
- package/dist.dts/packages/cli/src/skills/discovery.d.ts +7 -0
- package/dist.dts/packages/cli/src/skills/frontmatter.d.ts +5 -0
- package/dist.dts/packages/cli/src/skills/index.d.ts +1 -0
- package/dist.dts/packages/core/src/events.d.ts +24 -0
- package/dist.dts/packages/core/src/events.test.d.ts +1 -0
- package/dist.dts/packages/core/src/index.d.ts +9 -0
- package/dist.dts/packages/core/src/monitors/index.d.ts +6 -0
- package/dist.dts/packages/core/src/monitors/monitor.d.ts +26 -0
- package/dist.dts/packages/core/src/monitors/poll/index.d.ts +1 -0
- package/dist.dts/packages/core/src/monitors/poll/monitor.d.ts +12 -0
- package/dist.dts/packages/core/src/monitors/poll/types/index.d.ts +2 -0
- package/dist.dts/packages/core/src/monitors/poll/types/poll-monitor-options.d.ts +6 -0
- package/dist.dts/packages/core/src/monitors/poll/types/poll-runner.d.ts +3 -0
- package/dist.dts/packages/core/src/monitors/poll/types/routed-event-cursor.d.ts +2 -0
- package/dist.dts/packages/core/src/monitors/poll/utils/event-delivery-id.d.ts +2 -0
- package/dist.dts/packages/core/src/monitors/poll/utils/tick.d.ts +2 -0
- package/dist.dts/packages/core/src/monitors/schema.d.ts +37 -0
- package/dist.dts/packages/core/src/monitors/service.d.ts +35 -0
- package/dist.dts/packages/core/src/monitors/service.test.d.ts +1 -0
- package/dist.dts/packages/core/src/monitors/transport.test.d.ts +1 -0
- package/dist.dts/packages/core/src/monitors/types/index.d.ts +2 -0
- package/dist.dts/packages/core/src/monitors/types/monitor-record.d.ts +3 -0
- package/dist.dts/packages/core/src/monitors/types/monitor-registry.d.ts +3 -0
- package/dist.dts/packages/core/src/monitors/utils/monitor-identity.d.ts +5 -0
- package/dist.dts/packages/core/src/monitors/utils/monitor-identity.test.d.ts +1 -0
- package/dist.dts/packages/core/src/monitors/webhook/index.d.ts +1 -0
- package/dist.dts/packages/core/src/monitors/webhook/monitor.d.ts +24 -0
- package/dist.dts/packages/core/src/monitors/webhook/types/index.d.ts +3 -0
- package/dist.dts/packages/core/src/monitors/webhook/types/pending-webhook-event.d.ts +19 -0
- package/dist.dts/packages/core/src/monitors/webhook/types/webhook-monitor-options.d.ts +13 -0
- package/dist.dts/packages/core/src/monitors/webhook/utils/constants.d.ts +2 -0
- package/dist.dts/packages/core/src/monitors/webhook/utils/deliver-webhook.d.ts +3 -0
- package/dist.dts/packages/core/src/monitors/webhook/utils/handle-webhook.d.ts +2 -0
- package/dist.dts/packages/core/src/monitors/webhook/utils/handle-webhook.test.d.ts +1 -0
- package/dist.dts/packages/core/src/monitors/webhook/utils/heartbeat-webhooks.d.ts +3 -0
- package/dist.dts/packages/core/src/runtime.d.ts +23 -0
- package/dist.dts/packages/core/src/runtime.test.d.ts +1 -0
- package/dist.dts/packages/core/src/sources/index.d.ts +1 -0
- package/dist.dts/packages/core/src/sources/schema.d.ts +4 -0
- package/dist.dts/packages/core/src/sources/types/index.d.ts +3 -0
- package/dist.dts/packages/core/src/sources/types/monitor-source.d.ts +3 -0
- package/dist.dts/packages/core/src/sources/types/source-input.d.ts +4 -0
- package/dist.dts/packages/core/src/sources/types/source-registry.d.ts +2 -0
- package/dist.dts/packages/core/src/storage/in-memory-monitor-store.d.ts +8 -0
- package/dist.dts/packages/core/src/storage/index.d.ts +2 -0
- package/dist.dts/packages/core/src/storage/json.d.ts +30 -0
- package/dist.dts/packages/core/src/storage/json.test.d.ts +1 -0
- package/dist.dts/packages/core/src/types/delivery.d.ts +1 -0
- package/dist.dts/packages/core/src/types/event-sink.d.ts +12 -0
- package/dist.dts/packages/core/src/types/index.d.ts +11 -0
- package/dist.dts/packages/core/src/types/monitor-context.d.ts +10 -0
- package/dist.dts/packages/core/src/types/monitor-create-input.d.ts +8 -0
- package/dist.dts/packages/core/src/types/monitor-event-queue.d.ts +18 -0
- package/dist.dts/packages/core/src/types/monitor-event.d.ts +10 -0
- package/dist.dts/packages/core/src/types/monitor-options.d.ts +7 -0
- package/dist.dts/packages/core/src/types/monitor-store.d.ts +6 -0
- package/dist.dts/packages/core/src/types/monitor-target.d.ts +4 -0
- package/dist.dts/packages/core/src/types/source-event.d.ts +9 -0
- package/dist.dts/packages/core/src/types/source-poll-result.d.ts +6 -0
- package/dist.dts/packages/core/src/utils/event-to-text.d.ts +2 -0
- package/dist.dts/packages/core/src/utils/to-monitor-event.d.ts +3 -0
- package/dist.dts/packages/daemon/src/client.d.ts +2 -0
- package/dist.dts/packages/daemon/src/client.test.d.ts +1 -0
- package/dist.dts/packages/daemon/src/daemon.d.ts +36 -0
- package/dist.dts/packages/daemon/src/daemon.test.d.ts +1 -0
- package/dist.dts/packages/daemon/src/dispatch.d.ts +2 -0
- package/dist.dts/packages/daemon/src/http.d.ts +5 -0
- package/dist.dts/packages/daemon/src/index.d.ts +8 -0
- package/dist.dts/packages/daemon/src/registry.d.ts +14 -0
- package/dist.dts/packages/daemon/src/types/client.d.ts +21 -0
- package/dist.dts/packages/daemon/src/types/daemon.d.ts +58 -0
- package/dist.dts/packages/daemon/src/types/index.d.ts +3 -0
- package/dist.dts/packages/daemon/src/types/protocol.d.ts +21 -0
- package/dist.dts/packages/daemon/src/utils/env.d.ts +1 -0
- package/dist.dts/packages/daemon/src/utils/http-server.d.ts +10 -0
- package/dist.dts/packages/daemon/src/utils/index.d.ts +6 -0
- package/dist.dts/packages/daemon/src/utils/request-router.d.ts +11 -0
- package/dist.dts/packages/daemon/src/utils/sink.d.ts +13 -0
- package/dist.dts/packages/daemon/src/utils/spawn.d.ts +19 -0
- package/dist.dts/packages/daemon/src/utils/target.d.ts +4 -0
- package/dist.dts/packages/mcp/src/index.d.ts +2 -0
- package/dist.dts/packages/mcp/src/server.d.ts +14 -0
- package/dist.dts/packages/mcp/src/server.test.d.ts +1 -0
- package/dist.dts/packages/mcp/src/uris.d.ts +3 -0
- package/dist.dts/packages/sourcefed/src/server.d.ts +7 -0
- package/dist.dts/providers/github/src/api/client.d.ts +3 -0
- package/dist.dts/providers/github/src/api/comments.d.ts +1 -0
- package/dist.dts/providers/github/src/api/github-api.test.d.ts +1 -0
- package/dist.dts/providers/github/src/api/index.d.ts +4 -0
- package/dist.dts/providers/github/src/api/logs.d.ts +5 -0
- package/dist.dts/providers/github/src/api/pr.d.ts +8 -0
- package/dist.dts/providers/github/src/github.test.d.ts +1 -0
- package/dist.dts/providers/github/src/index.d.ts +2 -0
- package/dist.dts/providers/github/src/monitor.d.ts +15 -0
- package/dist.dts/providers/github/src/poll/index.d.ts +2 -0
- package/dist.dts/providers/github/src/poll/monitor.d.ts +3 -0
- package/dist.dts/providers/github/src/poll/utils/append-comments.d.ts +2 -0
- package/dist.dts/providers/github/src/poll/utils/append-github-ci-event.d.ts +2 -0
- package/dist.dts/providers/github/src/poll/utils/append-github-conflict-event.d.ts +2 -0
- package/dist.dts/providers/github/src/poll/utils/append-github-reviews.d.ts +2 -0
- package/dist.dts/providers/github/src/poll/utils/append-github-state-event.d.ts +2 -0
- package/dist.dts/providers/github/src/poll/utils/ci-failure-detail.d.ts +1 -0
- package/dist.dts/providers/github/src/poll/utils/clean-ci-log.d.ts +1 -0
- package/dist.dts/providers/github/src/poll/utils/confirm-still-failing.d.ts +1 -0
- package/dist.dts/providers/github/src/poll/utils/empty-cursor.d.ts +2 -0
- package/dist.dts/providers/github/src/poll/utils/failure-run-ids.d.ts +1 -0
- package/dist.dts/providers/github/src/poll/utils/failure-run-log.d.ts +1 -0
- package/dist.dts/providers/github/src/poll/utils/format-failed-check.d.ts +1 -0
- package/dist.dts/providers/github/src/poll/utils/index.d.ts +1 -0
- package/dist.dts/providers/github/src/poll/utils/poll-github.d.ts +6 -0
- package/dist.dts/providers/github/src/poll/utils/poll-helpers.test.d.ts +1 -0
- package/dist.dts/providers/github/src/schema.d.ts +17 -0
- package/dist.dts/providers/github/src/types/cursor.d.ts +11 -0
- package/dist.dts/providers/github/src/types/event.d.ts +11 -0
- package/dist.dts/providers/github/src/types/index.d.ts +3 -0
- package/dist.dts/providers/github/src/types/source-record.d.ts +5 -0
- package/dist.dts/providers/github/src/webhook/index.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/monitor.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/types/context.d.ts +7 -0
- package/dist.dts/providers/github/src/webhook/types/event-handler.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/types/event-shape.d.ts +7 -0
- package/dist.dts/providers/github/src/webhook/types/index.d.ts +1 -0
- package/dist.dts/providers/github/src/webhook/utils/fallback-github-event.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/utils/github-event-handlers.d.ts +2 -0
- package/dist.dts/providers/github/src/webhook/utils/index.d.ts +2 -0
- package/dist.dts/providers/github/src/webhook/utils/parse-check-run.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/utils/parse-check-suite.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/utils/parse-github-comment.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/utils/parse-github-webhook.d.ts +2 -0
- package/dist.dts/providers/github/src/webhook/utils/parse-pull-request-review.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/utils/parse-pull-request.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/utils/pull-request-number.d.ts +1 -0
- package/dist.dts/providers/github/src/webhook/utils/update-github-cursor.d.ts +3 -0
- package/dist.dts/providers/github/src/webhook/utils/verify-github-webhook.d.ts +1 -0
- package/dist.dts/providers/github/src/webhook/utils/verify-hmac.d.ts +1 -0
- package/dist.dts/providers/jira/src/index.d.ts +2 -0
- package/dist.dts/providers/jira/src/monitor.d.ts +14 -0
- package/dist.dts/providers/jira/src/poll/index.d.ts +2 -0
- package/dist.dts/providers/jira/src/poll/monitor.d.ts +3 -0
- package/dist.dts/providers/jira/src/poll/utils/adf-text.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/append-jira-changelog.d.ts +2 -0
- package/dist.dts/providers/jira/src/poll/utils/append-jira-comments.d.ts +2 -0
- package/dist.dts/providers/jira/src/poll/utils/append-jira-description.d.ts +2 -0
- package/dist.dts/providers/jira/src/poll/utils/empty-cursor.d.ts +2 -0
- package/dist.dts/providers/jira/src/poll/utils/format-jira-changelog-item.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/index.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/is-terminal-status.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/jira-auth.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/jira-change-value.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/jira-changelog-event.d.ts +2 -0
- package/dist.dts/providers/jira/src/poll/utils/jira-fetch.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/meaningful-changelog-items.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/poll-helpers.test.d.ts +1 -0
- package/dist.dts/providers/jira/src/poll/utils/poll-jira.d.ts +6 -0
- package/dist.dts/providers/jira/src/schema.d.ts +10 -0
- package/dist.dts/providers/jira/src/types/cursor.d.ts +5 -0
- package/dist.dts/providers/jira/src/types/event.d.ts +11 -0
- package/dist.dts/providers/jira/src/types/index.d.ts +3 -0
- package/dist.dts/providers/jira/src/types/source-record.d.ts +4 -0
- package/dist.dts/providers/slack/src/index.d.ts +2 -0
- package/dist.dts/providers/slack/src/monitor.d.ts +15 -0
- package/dist.dts/providers/slack/src/poll/index.d.ts +2 -0
- package/dist.dts/providers/slack/src/poll/monitor.d.ts +3 -0
- package/dist.dts/providers/slack/src/poll/utils/index.d.ts +2 -0
- package/dist.dts/providers/slack/src/poll/utils/parse-slack-read-result.d.ts +5 -0
- package/dist.dts/providers/slack/src/poll/utils/poll-slack.d.ts +6 -0
- package/dist.dts/providers/slack/src/poll/utils/slack-api.d.ts +4 -0
- package/dist.dts/providers/slack/src/schema.d.ts +11 -0
- package/dist.dts/providers/slack/src/slack.test.d.ts +1 -0
- package/dist.dts/providers/slack/src/types/cursor.d.ts +5 -0
- package/dist.dts/providers/slack/src/types/event.d.ts +8 -0
- package/dist.dts/providers/slack/src/types/index.d.ts +4 -0
- package/dist.dts/providers/slack/src/types/message.d.ts +6 -0
- package/dist.dts/providers/slack/src/types/read-result.d.ts +10 -0
- package/dist.dts/providers/slack/src/types/source-record.d.ts +5 -0
- package/dist.dts/providers/slack/src/utils/index.d.ts +2 -0
- package/dist.dts/providers/slack/src/utils/message-at.d.ts +1 -0
- package/dist.dts/providers/slack/src/utils/message-timestamp.d.ts +1 -0
- package/dist.dts/providers/slack/src/webhook/index.d.ts +2 -0
- package/dist.dts/providers/slack/src/webhook/monitor.d.ts +3 -0
- package/dist.dts/providers/slack/src/webhook/utils/index.d.ts +3 -0
- package/dist.dts/providers/slack/src/webhook/utils/parse-slack-webhook.d.ts +2 -0
- package/dist.dts/providers/slack/src/webhook/utils/slack-signature.d.ts +1 -0
- package/dist.dts/providers/slack/src/webhook/utils/update-slack-cursor.d.ts +3 -0
- package/dist.dts/providers/slack/src/webhook/utils/valid-slack-signature.d.ts +1 -0
- package/dist.dts/tui.d.ts +1 -0
- package/package.json +68 -0
package/dist/pi.js
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import {
|
|
2
|
+
connectDaemonClient,
|
|
3
|
+
daemonCommand,
|
|
4
|
+
daemonEnvironment,
|
|
5
|
+
spawnLocalDaemon
|
|
6
|
+
} from "./chunk-B7T6IZYS.js";
|
|
7
|
+
import "./chunk-MLKGABMK.js";
|
|
8
|
+
|
|
9
|
+
// adapters/pi/src/index.ts
|
|
10
|
+
import { fileURLToPath } from "node:url";
|
|
11
|
+
import { Type } from "typebox";
|
|
12
|
+
|
|
13
|
+
// adapters/pi/src/dialog.ts
|
|
14
|
+
import { Container, Spacer, Text, truncateToWidth } from "@earendil-works/pi-tui";
|
|
15
|
+
import { DynamicBorder } from "@earendil-works/pi-coding-agent";
|
|
16
|
+
function showSourcefedDialog(_tui, theme, done, title, lines) {
|
|
17
|
+
const container = new Container();
|
|
18
|
+
container.addChild(new DynamicBorder((s) => theme.fg("accent", s)));
|
|
19
|
+
container.addChild(new Text(theme.fg("accent", theme.bold(title)), 1, 0));
|
|
20
|
+
container.addChild(new Spacer(1));
|
|
21
|
+
for (const line of lines) {
|
|
22
|
+
container.addChild(new Text(line.text, 1, 0));
|
|
23
|
+
}
|
|
24
|
+
container.addChild(new Spacer(1));
|
|
25
|
+
container.addChild(new Text(theme.fg("dim", "esc to close"), 1, 0));
|
|
26
|
+
container.addChild(new DynamicBorder((s) => theme.fg("accent", s)));
|
|
27
|
+
return {
|
|
28
|
+
render: (width) => {
|
|
29
|
+
const rendered = container.render(width);
|
|
30
|
+
return rendered.map((line) => truncateToWidth(line, width));
|
|
31
|
+
},
|
|
32
|
+
invalidate: () => container.invalidate(),
|
|
33
|
+
handleInput: (data) => {
|
|
34
|
+
if (data === "\x1B" || data === "\r") done(null);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function monitorLines(monitors, theme) {
|
|
39
|
+
const active = monitors.filter((monitor) => monitor.enabled);
|
|
40
|
+
if (active.length === 0) return [{ text: theme.fg("dim", "No active monitors") }];
|
|
41
|
+
return active.map((monitor) => {
|
|
42
|
+
const status = monitor.unresponsive ? theme.fg("error", "\u25CF") : theme.fg("success", "\u25CF");
|
|
43
|
+
const describe = theme.fg("text", monitor.describe);
|
|
44
|
+
const detail = monitor.detail ? theme.fg("muted", monitor.detail) : "";
|
|
45
|
+
return { text: `${status} ${monitor.icon} ${describe}${detail}` };
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
function logLines(logs, theme) {
|
|
49
|
+
if (logs.length === 0) return [{ text: theme.fg("dim", "No notifications sent yet") }];
|
|
50
|
+
return logs.flatMap((entry) => {
|
|
51
|
+
const time = new Date(entry.at).toLocaleString();
|
|
52
|
+
const marker = entry.actionable ? theme.fg("warning", "\u25B6") : theme.fg("dim", "\xB7");
|
|
53
|
+
const summary = theme.fg("text", entry.summary);
|
|
54
|
+
const lines = [{ text: `${marker} ${entry.icon} ${theme.fg("muted", time)} ${summary}` }];
|
|
55
|
+
if (entry.body) lines.push({ text: theme.fg("muted", ` ${entry.body}`) });
|
|
56
|
+
return lines;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// adapters/pi/src/index.ts
|
|
61
|
+
var STATUS_REFRESH_MS = 3e3;
|
|
62
|
+
var SOURCE_ICONS = {
|
|
63
|
+
jira: "\u{F0303}",
|
|
64
|
+
github: "\u{F02A4}",
|
|
65
|
+
slack: "\u{F04B1}"
|
|
66
|
+
};
|
|
67
|
+
async function sourcefedExtension(pi) {
|
|
68
|
+
const listeners = /* @__PURE__ */ new Map();
|
|
69
|
+
let client;
|
|
70
|
+
let lastAttemptAt = 0;
|
|
71
|
+
let lastError;
|
|
72
|
+
let statusTimer;
|
|
73
|
+
let statusCtx;
|
|
74
|
+
pi.on("session_start", async (_event, ctx) => {
|
|
75
|
+
statusCtx = ctx;
|
|
76
|
+
await ensureTarget(ctx);
|
|
77
|
+
void refreshStatus();
|
|
78
|
+
statusTimer = setInterval(() => void refreshStatus(), STATUS_REFRESH_MS);
|
|
79
|
+
});
|
|
80
|
+
pi.on("session_shutdown", async () => {
|
|
81
|
+
if (statusTimer) clearInterval(statusTimer);
|
|
82
|
+
statusTimer = void 0;
|
|
83
|
+
statusCtx = void 0;
|
|
84
|
+
for (const listener of listeners.values()) await listener.close();
|
|
85
|
+
listeners.clear();
|
|
86
|
+
await client?.close();
|
|
87
|
+
client = void 0;
|
|
88
|
+
});
|
|
89
|
+
pi.registerTool({
|
|
90
|
+
name: "sourcefed_monitor_create",
|
|
91
|
+
label: "Sourcefed monitor create",
|
|
92
|
+
description: "Create or reuse a Sourcefed monitor for the current Pi session.",
|
|
93
|
+
parameters: Type.Object({
|
|
94
|
+
name: Type.String(),
|
|
95
|
+
sourceType: Type.Unsafe({ type: "string", enum: ["jira", "github", "slack"] }),
|
|
96
|
+
issueKey: Type.Optional(Type.String()),
|
|
97
|
+
repo: Type.Optional(Type.String()),
|
|
98
|
+
prNumber: Type.Optional(Type.Number()),
|
|
99
|
+
channelId: Type.Optional(Type.String()),
|
|
100
|
+
threadTs: Type.Optional(Type.String()),
|
|
101
|
+
threadUrl: Type.Optional(Type.String()),
|
|
102
|
+
pollIntervalSec: Type.Optional(Type.Number())
|
|
103
|
+
}),
|
|
104
|
+
execute: async (_toolCallID, input, _signal, _onUpdate, ctx) => toolResult(await call(ctx, "monitor_create", input))
|
|
105
|
+
});
|
|
106
|
+
pi.registerTool({
|
|
107
|
+
name: "sourcefed_monitor_list",
|
|
108
|
+
label: "Sourcefed monitor list",
|
|
109
|
+
description: "List Sourcefed monitors for the current Pi session.",
|
|
110
|
+
parameters: Type.Object({}),
|
|
111
|
+
execute: async (_toolCallID, _input, _signal, _onUpdate, ctx) => toolResult(await call(ctx, "monitor_list", {}))
|
|
112
|
+
});
|
|
113
|
+
pi.registerTool({
|
|
114
|
+
name: "sourcefed_monitor_status",
|
|
115
|
+
label: "Sourcefed monitor status",
|
|
116
|
+
description: "Read one Sourcefed monitor for the current Pi session.",
|
|
117
|
+
parameters: Type.Object({ id: Type.String() }),
|
|
118
|
+
execute: async (_toolCallID, input, _signal, _onUpdate, ctx) => toolResult(await call(ctx, "monitor_status", input))
|
|
119
|
+
});
|
|
120
|
+
pi.registerTool({
|
|
121
|
+
name: "sourcefed_monitor_stop",
|
|
122
|
+
label: "Sourcefed monitor stop",
|
|
123
|
+
description: "Stop one Sourcefed monitor for the current Pi session.",
|
|
124
|
+
parameters: Type.Object({ id: Type.String() }),
|
|
125
|
+
execute: async (_toolCallID, input, _signal, _onUpdate, ctx) => toolResult(await call(ctx, "monitor_stop", input))
|
|
126
|
+
});
|
|
127
|
+
pi.registerTool({
|
|
128
|
+
name: "sourcefed_monitor_start",
|
|
129
|
+
label: "Sourcefed monitor start",
|
|
130
|
+
description: "Start (re-enable) a stopped Sourcefed monitor for the current Pi session.",
|
|
131
|
+
parameters: Type.Object({ id: Type.String() }),
|
|
132
|
+
execute: async (_toolCallID, input, _signal, _onUpdate, ctx) => toolResult(await call(ctx, "monitor_start", input))
|
|
133
|
+
});
|
|
134
|
+
pi.registerCommand("sourcefed", {
|
|
135
|
+
description: "List Sourcefed monitors for the current Pi session",
|
|
136
|
+
handler: async (_args, ctx) => {
|
|
137
|
+
const result = await call(ctx, "monitor_list", {});
|
|
138
|
+
const monitors = Array.isArray(result?.monitors) ? result.monitors : [];
|
|
139
|
+
await ctx.ui.custom(
|
|
140
|
+
(tui, theme, _keybindings, done) => showSourcefedDialog(tui, theme, done, `Sourcefed monitors (${monitors.length})`, monitorLines(monitors, theme))
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
pi.registerCommand("sourcefed logs", {
|
|
145
|
+
description: "Show recent Sourcefed notifications for the current Pi session",
|
|
146
|
+
handler: async (_args, ctx) => {
|
|
147
|
+
const result = await call(ctx, "monitor_logs", {});
|
|
148
|
+
const logs = Array.isArray(result?.logs) ? result.logs : [];
|
|
149
|
+
await ctx.ui.custom(
|
|
150
|
+
(tui, theme, _keybindings, done) => showSourcefedDialog(tui, theme, done, `Sourcefed notifications (${logs.length})`, logLines(logs, theme))
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
async function refreshStatus() {
|
|
155
|
+
const ctx = statusCtx;
|
|
156
|
+
if (!ctx) return;
|
|
157
|
+
const result = await call(ctx, "monitor_list", {});
|
|
158
|
+
const monitors = Array.isArray(result?.monitors) ? result.monitors : [];
|
|
159
|
+
const active = monitors.filter((monitor) => monitor.enabled);
|
|
160
|
+
if (active.length === 0) {
|
|
161
|
+
ctx.ui.setStatus("sourcefed", void 0);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const bySource = /* @__PURE__ */ new Map();
|
|
165
|
+
for (const monitor of active) {
|
|
166
|
+
const type = String(monitor.source && typeof monitor.source === "object" && "type" in monitor.source ? monitor.source.type : "");
|
|
167
|
+
const entry = bySource.get(type) ?? { count: 0, unresponsive: false };
|
|
168
|
+
entry.count += 1;
|
|
169
|
+
if (monitor.unresponsive) entry.unresponsive = true;
|
|
170
|
+
bySource.set(type, entry);
|
|
171
|
+
}
|
|
172
|
+
const parts = [...bySource.entries()].map(([type, entry]) => {
|
|
173
|
+
const icon = SOURCE_ICONS[type] ?? "?";
|
|
174
|
+
const colored = entry.unresponsive ? ctx.ui.theme.fg("error", icon) : ctx.ui.theme.fg("success", icon);
|
|
175
|
+
return `${colored}${entry.count}`;
|
|
176
|
+
});
|
|
177
|
+
ctx.ui.setStatus("sourcefed", parts.join(" "));
|
|
178
|
+
}
|
|
179
|
+
async function call(ctx, name, args) {
|
|
180
|
+
const target = await ensureTarget(ctx);
|
|
181
|
+
if (!client) return { ok: false, error: `sourcefed daemon unavailable: ${lastError ?? "not started"}` };
|
|
182
|
+
return client.request(name.replace(/_/g, "."), { ...args, target });
|
|
183
|
+
}
|
|
184
|
+
async function ensureTarget(ctx) {
|
|
185
|
+
await ensureClient();
|
|
186
|
+
const target = { kind: "pi-session", id: ctx.sessionManager.getSessionId() };
|
|
187
|
+
if (client && !listeners.has(target.id)) {
|
|
188
|
+
const listener = await client.subscribe(target, async (events) => {
|
|
189
|
+
await routeEvents(pi, events, target, client);
|
|
190
|
+
});
|
|
191
|
+
listeners.set(target.id, listener);
|
|
192
|
+
}
|
|
193
|
+
return target;
|
|
194
|
+
}
|
|
195
|
+
async function ensureClient() {
|
|
196
|
+
if (client) return;
|
|
197
|
+
if (Date.now() - lastAttemptAt < 15e3) return;
|
|
198
|
+
lastAttemptAt = Date.now();
|
|
199
|
+
try {
|
|
200
|
+
const url = process.env.SOURCEFED_DAEMON_URL;
|
|
201
|
+
if (url) {
|
|
202
|
+
client = await connectDaemonClient({ name: "sourcefed-pi", url });
|
|
203
|
+
} else {
|
|
204
|
+
const local = daemonCommand(cliEntry());
|
|
205
|
+
const spawned = await spawnLocalDaemon({
|
|
206
|
+
command: local.command,
|
|
207
|
+
args: local.args,
|
|
208
|
+
env: daemonEnvironment()
|
|
209
|
+
});
|
|
210
|
+
client = await connectDaemonClient({ name: "sourcefed-pi", url: spawned.url });
|
|
211
|
+
}
|
|
212
|
+
} catch (error) {
|
|
213
|
+
lastError = error instanceof Error ? error.message : String(error);
|
|
214
|
+
console.error(`[sourcefed] daemon unavailable: ${lastError}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
async function routeEvents(pi, events, target, daemon) {
|
|
219
|
+
const delivered = [];
|
|
220
|
+
for (const queued of events) {
|
|
221
|
+
await pi.sendMessage({
|
|
222
|
+
customType: "sourcefed-monitor",
|
|
223
|
+
content: `[sourcefed monitor] ${queued.event.summary}${queued.event.body ? `
|
|
224
|
+
|
|
225
|
+
${queued.event.body}` : ""}`,
|
|
226
|
+
display: true,
|
|
227
|
+
details: { actionable: queued.event.actionable, eventID: queued.id }
|
|
228
|
+
}, { triggerTurn: queued.event.actionable, deliverAs: "steer" });
|
|
229
|
+
delivered.push(queued);
|
|
230
|
+
}
|
|
231
|
+
if (delivered.length > 0) {
|
|
232
|
+
await daemon.request("monitor.ack", {
|
|
233
|
+
target,
|
|
234
|
+
eventIDs: delivered.map((queued) => queued.id)
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
function cliEntry() {
|
|
239
|
+
return fileURLToPath(import.meta.resolve("@sourcefed/cli"));
|
|
240
|
+
}
|
|
241
|
+
function toolResult(result) {
|
|
242
|
+
return {
|
|
243
|
+
content: [{ type: "text", text: JSON.stringify(result) }],
|
|
244
|
+
details: {}
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
export {
|
|
248
|
+
sourcefedExtension as default
|
|
249
|
+
};
|