@fdcn/sourcefed 0.3.8 → 0.4.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 (101) hide show
  1. package/README.md +36 -1
  2. package/dist/{chunk-5JL3UV72.js → chunk-L4SMC2NT.js} +29 -6
  3. package/dist/cli.js +4485 -2511
  4. package/dist/daemon.js +31 -6
  5. package/dist/mcp.js +2281 -1105
  6. package/dist/opencode.js +1 -1
  7. package/dist/pi.js +1 -1
  8. package/dist.dts/adapters/opencode/bridge.d.ts +1 -1
  9. package/dist.dts/adapters/opencode/subscriptions.d.ts +2 -2
  10. package/dist.dts/adapters/opencode/tui/sidebar.d.ts +1 -1
  11. package/dist.dts/adapters/pi/src/dialog.d.ts +1 -1
  12. package/dist.dts/adapters/pi/src/monitors-dialog.d.ts +1 -1
  13. package/dist.dts/packages/cli/src/commands/monitor/index.d.ts +1 -1
  14. package/dist.dts/packages/cli/src/utils/daemon.d.ts +1 -1
  15. package/dist.dts/packages/cli/src/utils/format.d.ts +1 -1
  16. package/dist.dts/packages/cli/src/utils/webhooks.d.ts +1 -1
  17. package/dist.dts/packages/core/src/events.d.ts +2 -2
  18. package/dist.dts/packages/core/src/index.d.ts +4 -4
  19. package/dist.dts/packages/core/src/monitors/index.d.ts +3 -3
  20. package/dist.dts/packages/core/src/monitors/monitor.d.ts +6 -6
  21. package/dist.dts/packages/core/src/monitors/poll/monitor.d.ts +5 -5
  22. package/dist.dts/packages/core/src/monitors/poll/types/poll-monitor-options.d.ts +1 -1
  23. package/dist.dts/packages/core/src/monitors/poll/types/poll-runner.d.ts +2 -2
  24. package/dist.dts/packages/core/src/monitors/poll/utils/event-delivery-id.d.ts +1 -1
  25. package/dist.dts/packages/core/src/monitors/poll/utils/tick.d.ts +1 -1
  26. package/dist.dts/packages/core/src/monitors/service.d.ts +3 -3
  27. package/dist.dts/packages/core/src/monitors/utils/monitor-identity.d.ts +3 -3
  28. package/dist.dts/packages/core/src/monitors/webhook/monitor.d.ts +5 -5
  29. package/dist.dts/packages/core/src/monitors/webhook/types/pending-webhook-event.d.ts +1 -1
  30. package/dist.dts/packages/core/src/monitors/webhook/types/webhook-monitor-options.d.ts +1 -1
  31. package/dist.dts/packages/core/src/monitors/webhook/utils/deliver-webhook.d.ts +2 -2
  32. package/dist.dts/packages/core/src/monitors/webhook/utils/handle-webhook.d.ts +1 -1
  33. package/dist.dts/packages/core/src/monitors/webhook/utils/heartbeat-webhooks.d.ts +2 -2
  34. package/dist.dts/packages/core/src/runtime.d.ts +3 -3
  35. package/dist.dts/packages/core/src/sources/index.d.ts +1 -1
  36. package/dist.dts/packages/core/src/sources/types/source-registry.d.ts +1 -1
  37. package/dist.dts/packages/core/src/storage/json.d.ts +2 -2
  38. package/dist.dts/packages/core/src/types/monitor-context.d.ts +2 -2
  39. package/dist.dts/packages/core/src/types/monitor-options.d.ts +1 -1
  40. package/dist.dts/packages/core/src/utils/event-to-text.d.ts +1 -1
  41. package/dist.dts/packages/core/src/utils/to-monitor-event.d.ts +2 -2
  42. package/dist.dts/packages/daemon/src/client.d.ts +1 -1
  43. package/dist.dts/packages/daemon/src/daemon.d.ts +3 -3
  44. package/dist.dts/packages/daemon/src/event-stream.d.ts +1 -1
  45. package/dist.dts/packages/daemon/src/event-transport.d.ts +4 -0
  46. package/dist.dts/packages/daemon/src/event-transport.test.d.ts +1 -0
  47. package/dist.dts/packages/daemon/src/fetch-isolation.test.d.ts +1 -0
  48. package/dist.dts/packages/daemon/src/index.d.ts +3 -3
  49. package/dist.dts/packages/daemon/src/registry.d.ts +5 -5
  50. package/dist.dts/packages/daemon/src/types/client.d.ts +1 -1
  51. package/dist.dts/packages/daemon/src/types/daemon.d.ts +1 -1
  52. package/dist.dts/packages/daemon/src/types/protocol.d.ts +1 -1
  53. package/dist.dts/packages/daemon/src/utils/sink.d.ts +2 -2
  54. package/dist.dts/packages/daemon/src/utils/target.d.ts +1 -1
  55. package/dist.dts/packages/mcp/src/server.d.ts +1 -1
  56. package/dist.dts/packages/mcp/src/uris.d.ts +2 -2
  57. package/dist.dts/providers/github/src/index.d.ts +1 -1
  58. package/dist.dts/providers/github/src/monitor.d.ts +6 -6
  59. package/dist.dts/providers/github/src/poll/index.d.ts +1 -1
  60. package/dist.dts/providers/github/src/poll/monitor.d.ts +2 -2
  61. package/dist.dts/providers/github/src/poll/utils/append-comments.d.ts +1 -1
  62. package/dist.dts/providers/github/src/poll/utils/append-github-ci-event.d.ts +1 -1
  63. package/dist.dts/providers/github/src/poll/utils/append-github-conflict-event.d.ts +1 -1
  64. package/dist.dts/providers/github/src/poll/utils/append-github-reviews.d.ts +1 -1
  65. package/dist.dts/providers/github/src/poll/utils/append-github-state-event.d.ts +1 -1
  66. package/dist.dts/providers/github/src/poll/utils/empty-cursor.d.ts +1 -1
  67. package/dist.dts/providers/github/src/poll/utils/poll-github.d.ts +1 -1
  68. package/dist.dts/providers/github/src/webhook/index.d.ts +2 -2
  69. package/dist.dts/providers/github/src/webhook/monitor.d.ts +2 -2
  70. package/dist.dts/providers/github/src/webhook/utils/github-event-handlers.d.ts +1 -1
  71. package/dist.dts/providers/github/src/webhook/utils/parse-github-webhook.d.ts +1 -1
  72. package/dist.dts/providers/github/src/webhook/utils/update-github-cursor.d.ts +2 -2
  73. package/dist.dts/providers/jira/src/index.d.ts +1 -1
  74. package/dist.dts/providers/jira/src/monitor.d.ts +5 -5
  75. package/dist.dts/providers/jira/src/poll/index.d.ts +1 -1
  76. package/dist.dts/providers/jira/src/poll/monitor.d.ts +2 -2
  77. package/dist.dts/providers/jira/src/poll/utils/append-jira-changelog.d.ts +1 -1
  78. package/dist.dts/providers/jira/src/poll/utils/append-jira-comments.d.ts +1 -1
  79. package/dist.dts/providers/jira/src/poll/utils/append-jira-description.d.ts +1 -1
  80. package/dist.dts/providers/jira/src/poll/utils/empty-cursor.d.ts +1 -1
  81. package/dist.dts/providers/jira/src/poll/utils/jira-changelog-event.d.ts +1 -1
  82. package/dist.dts/providers/jira/src/poll/utils/poll-jira.d.ts +1 -1
  83. package/dist.dts/providers/slack/src/index.d.ts +1 -1
  84. package/dist.dts/providers/slack/src/monitor.d.ts +6 -6
  85. package/dist.dts/providers/slack/src/poll/index.d.ts +1 -1
  86. package/dist.dts/providers/slack/src/poll/monitor.d.ts +2 -2
  87. package/dist.dts/providers/slack/src/poll/utils/parse-slack-read-result.d.ts +1 -1
  88. package/dist.dts/providers/slack/src/poll/utils/poll-slack.d.ts +1 -1
  89. package/dist.dts/providers/slack/src/webhook/index.d.ts +1 -1
  90. package/dist.dts/providers/slack/src/webhook/monitor.d.ts +2 -2
  91. package/dist.dts/providers/slack/src/webhook/utils/parse-slack-webhook.d.ts +1 -1
  92. package/dist.dts/providers/slack/src/webhook/utils/update-slack-cursor.d.ts +2 -2
  93. package/dist.dts/providers/yab/src/index.d.ts +1 -1
  94. package/dist.dts/providers/yab/src/monitor.d.ts +5 -5
  95. package/dist.dts/providers/yab/src/poll/index.d.ts +1 -1
  96. package/dist.dts/providers/yab/src/poll/monitor.d.ts +2 -2
  97. package/dist.dts/providers/yab/src/poll/utils/feed-events.d.ts +1 -1
  98. package/dist.dts/providers/yab/src/poll/utils/parse-feed.d.ts +1 -1
  99. package/dist.dts/providers/yab/src/poll/utils/poll-yab.d.ts +1 -1
  100. package/dist.dts/providers/yab/src/poll/utils/yab-mcp.d.ts +1 -1
  101. package/package.json +27 -9
package/README.md CHANGED
@@ -33,11 +33,46 @@ OpenCode loads this package as both a server and a TUI plugin from one entry:
33
33
 
34
34
  ```json
35
35
  // ~/.config/opencode/opencode.jsonc
36
- { "plugins": ["@fdcn/sourcefed@0.3.8"] }
36
+ { "plugins": ["@fdcn/sourcefed@0.4.0"] }
37
37
  ```
38
38
 
39
39
  The package exposes `./server`, `./tui`, `./opencode`, `./opencode/tui`, and `./pi` entrypoints for hosts that load them directly.
40
40
 
41
+ ## Host dependencies
42
+
43
+ Pi provides `@earendil-works/pi-coding-agent`, `@earendil-works/pi-tui` and
44
+ `typebox` through its extension loader. Sourcefed declares each as an optional
45
+ peer with a `"*"` range and leaves their imports external in `dist/pi.js`, matching
46
+ [Pi’s package contract](https://github.com/earendil-works/pi/blob/main/packages/coding-agent/docs/packages.md#dependencies).
47
+ OpenCode, CLI, daemon and MCP entry points do not import these peers. A plain npm
48
+ install downloads no Pi host packages; a Pi host supplies its own versions.
49
+
50
+ Install the extension through the Pi host:
51
+
52
+ ```sh
53
+ pi install npm:@fdcn/sourcefed@0.4.0
54
+ ```
55
+
56
+ The workspace uses pinned development dependencies to compile and test the Pi
57
+ adapter. Those development tools are separate from the published runtime.
58
+
59
+ From a checkout, verify the packed package:
60
+
61
+ ```sh
62
+ npm run check
63
+
64
+ node scripts/check-optional-pi.mjs
65
+ ```
66
+
67
+ The check packs and installs Sourcefed into fresh temporary directories. It
68
+ verifies the absence of Pi packages, imports the non-Pi libraries, loads the
69
+ installed plugin in a private OpenCode host, and loads the Pi-managed extension
70
+ in RPC mode without a model request. The Pi installer uses an isolated
71
+ `npmCommand` wrapper that substitutes the local tarball for the package’s npm
72
+ spec; the registry contains only published releases. The check needs OpenCode,
73
+ OpenSSL and the workspace’s Pi development host. Its audit output includes
74
+ remaining OpenCode dependencies and does not certify a clean security gate.
75
+
41
76
  ## Skills
42
77
 
43
78
  ```sh
@@ -25,6 +25,9 @@ import { createServer } from "node:http";
25
25
  import { Readable } from "node:stream";
26
26
  import { spawn as spawn2 } from "node:child_process";
27
27
  import path7 from "node:path";
28
+ import { get as getHttp } from "node:http";
29
+ import { get as getHttps } from "node:https";
30
+ import { Readable as Readable2 } from "node:stream";
28
31
  var store$4;
29
32
  var DEFAULT_CONFIG = {
30
33
  lang: void 0,
@@ -12670,6 +12673,28 @@ function parseDaemonFrame(line) {
12670
12673
  return void 0;
12671
12674
  }
12672
12675
  }
12676
+ async function openEventResponse(url, headers, signal) {
12677
+ signal.throwIfAborted();
12678
+ const endpoint = new URL(url);
12679
+ if (endpoint.protocol !== "http:" && endpoint.protocol !== "https:") {
12680
+ throw new Error("event stream requires HTTP or HTTPS");
12681
+ }
12682
+ const get = endpoint.protocol === "https:" ? getHttps : getHttp;
12683
+ const response = await new Promise((resolve, reject) => {
12684
+ const request = get(endpoint, { headers, signal, agent: false }, resolve);
12685
+ request.once("error", reject);
12686
+ });
12687
+ if (!response.statusCode || response.statusCode < 200 || response.statusCode >= 300) {
12688
+ response.destroy();
12689
+ throw new Error("event stream failed: " + response.statusCode);
12690
+ }
12691
+ return response;
12692
+ }
12693
+ function eventReader(response) {
12694
+ return Readable2.toWeb(response, {
12695
+ strategy: { highWaterMark: 64 * 1024, size: (chunk) => chunk.byteLength }
12696
+ }).getReader();
12697
+ }
12673
12698
  var DaemonEventStream = class {
12674
12699
  constructor(url, headers, onEvents, acknowledge, onClose) {
12675
12700
  this.url = url;
@@ -12742,14 +12767,11 @@ var DaemonEventStream = class {
12742
12767
  this.stream = controller;
12743
12768
  this.controller.signal.addEventListener("abort", abort, { once: true });
12744
12769
  let reader;
12770
+ let response;
12745
12771
  try {
12746
12772
  this.controller.signal.throwIfAborted();
12747
- const response = await fetch(this.url, { signal: controller.signal, headers: this.headers });
12748
- if (!response.ok || !response.body) {
12749
- await response.body?.cancel();
12750
- throw new Error(`event stream failed: ${response.status}`);
12751
- }
12752
- reader = response.body.getReader();
12773
+ response = await openEventResponse(this.url, this.headers, controller.signal);
12774
+ reader = eventReader(response);
12753
12775
  const decoder = new TextDecoder();
12754
12776
  let buffer = "";
12755
12777
  while (!controller.signal.aborted) {
@@ -12763,6 +12785,7 @@ var DaemonEventStream = class {
12763
12785
  } finally {
12764
12786
  await reader?.cancel().catch(() => void 0);
12765
12787
  reader?.releaseLock();
12788
+ response?.destroy();
12766
12789
  this.controller.signal.removeEventListener("abort", abort);
12767
12790
  if (this.stream === controller) this.stream = void 0;
12768
12791
  }