@skaile/workspaces 0.26.0 → 0.28.1
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/CHANGELOG.md +65 -0
- package/dist/{asset-feeds-WMVTI7KW.js → asset-feeds-2V7LZIG7.js} +17 -10
- package/dist/asset-feeds-2V7LZIG7.js.map +1 -0
- package/dist/asset-manager/index.js +7 -7
- package/dist/asset-manager/installer.js +6 -6
- package/dist/bridge/drivers/claude-sdk.js +2 -2
- package/dist/bridge/drivers/codex.js +1 -1
- package/dist/bridge/drivers/continue.d.ts +2 -0
- package/dist/bridge/drivers/continue.js +103 -0
- package/dist/bridge/drivers/continue.js.map +1 -0
- package/dist/bridge/drivers/echo.js +1 -1
- package/dist/bridge/drivers/gemini.d.ts +2 -0
- package/dist/bridge/drivers/gemini.js +10 -0
- package/dist/bridge/drivers/gemini.js.map +1 -0
- package/dist/bridge/drivers/goose.d.ts +2 -0
- package/dist/bridge/drivers/goose.js +88 -0
- package/dist/bridge/drivers/goose.js.map +1 -0
- package/dist/bridge/drivers/omp.js +1 -1
- package/dist/bridge/drivers/opencode.d.ts +2 -0
- package/dist/bridge/drivers/opencode.js +99 -0
- package/dist/bridge/drivers/opencode.js.map +1 -0
- package/dist/bridge/drivers/qwen.d.ts +2 -0
- package/dist/bridge/drivers/qwen.js +57 -0
- package/dist/bridge/drivers/qwen.js.map +1 -0
- package/dist/bridge/index.js +3 -3
- package/dist/bridge/src/drivers/_subprocess-cli.d.ts +136 -0
- package/dist/bridge/src/drivers/_subprocess-cli.d.ts.map +1 -0
- package/dist/bridge/src/drivers/continue.d.ts +43 -0
- package/dist/bridge/src/drivers/continue.d.ts.map +1 -0
- package/dist/bridge/src/drivers/gemini.d.ts +55 -0
- package/dist/bridge/src/drivers/gemini.d.ts.map +1 -0
- package/dist/bridge/src/drivers/goose.d.ts +42 -0
- package/dist/bridge/src/drivers/goose.d.ts.map +1 -0
- package/dist/bridge/src/drivers/opencode.d.ts +43 -0
- package/dist/bridge/src/drivers/opencode.d.ts.map +1 -0
- package/dist/bridge/src/drivers/qwen.d.ts +39 -0
- package/dist/bridge/src/drivers/qwen.d.ts.map +1 -0
- package/dist/bridge/src/registry.d.ts.map +1 -1
- package/dist/{chunk-XGLGS5B4.js → chunk-2NOE4AGD.js} +3 -3
- package/dist/{chunk-XGLGS5B4.js.map → chunk-2NOE4AGD.js.map} +1 -1
- package/dist/{chunk-Z5DI7PDG.js → chunk-3QQSSRYN.js} +29 -5
- package/dist/chunk-3QQSSRYN.js.map +1 -0
- package/dist/chunk-5RBPPBEK.js +110 -0
- package/dist/chunk-5RBPPBEK.js.map +1 -0
- package/dist/chunk-5V5KZQIC.js +445 -0
- package/dist/chunk-5V5KZQIC.js.map +1 -0
- package/dist/{chunk-23M4XZQW.js → chunk-AKSR434V.js} +3 -3
- package/dist/{chunk-23M4XZQW.js.map → chunk-AKSR434V.js.map} +1 -1
- package/dist/{chunk-WD4LP66U.js → chunk-BSVLAHHH.js} +34 -17
- package/dist/chunk-BSVLAHHH.js.map +1 -0
- package/dist/{chunk-7OBGSR7O.js → chunk-BZ2JU7IP.js} +4 -4
- package/dist/{chunk-7OBGSR7O.js.map → chunk-BZ2JU7IP.js.map} +1 -1
- package/dist/{chunk-ZYDE52WE.js → chunk-DGM74UP4.js} +3 -3
- package/dist/{chunk-ZYDE52WE.js.map → chunk-DGM74UP4.js.map} +1 -1
- package/dist/{chunk-QHXS3YDV.js → chunk-FBVUGRTU.js} +5 -5
- package/dist/{chunk-QHXS3YDV.js.map → chunk-FBVUGRTU.js.map} +1 -1
- package/dist/{chunk-C32BRO2W.js → chunk-FWHOU3CX.js} +3 -3
- package/dist/{chunk-C32BRO2W.js.map → chunk-FWHOU3CX.js.map} +1 -1
- package/dist/{chunk-WSZAFRQL.js → chunk-GYPA2Q7F.js} +6 -5
- package/dist/chunk-GYPA2Q7F.js.map +1 -0
- package/dist/{chunk-KL2MQ6WI.js → chunk-M4KLIEIJ.js} +3 -3
- package/dist/{chunk-KL2MQ6WI.js.map → chunk-M4KLIEIJ.js.map} +1 -1
- package/dist/{chunk-RTAIGPTF.js → chunk-MIH45XPY.js} +100 -147
- package/dist/chunk-MIH45XPY.js.map +1 -0
- package/dist/{chunk-BKF3UFF4.js → chunk-SF4GWVR5.js} +4 -4
- package/dist/{chunk-BKF3UFF4.js.map → chunk-SF4GWVR5.js.map} +1 -1
- package/dist/{chunk-PY7AQRGH.js → chunk-U5L6F5NZ.js} +6 -6
- package/dist/{chunk-PY7AQRGH.js.map → chunk-U5L6F5NZ.js.map} +1 -1
- package/dist/{chunk-BQRRBGDE.js → chunk-UAW7VRAL.js} +2 -2
- package/dist/{chunk-BQRRBGDE.js.map → chunk-UAW7VRAL.js.map} +1 -1
- package/dist/{chunk-4SQ6Y6U7.js → chunk-UBCZVONU.js} +3 -3
- package/dist/{chunk-4SQ6Y6U7.js.map → chunk-UBCZVONU.js.map} +1 -1
- package/dist/{chunk-YRU4WB6Y.js → chunk-UIZKIUC6.js} +3 -3
- package/dist/{chunk-YRU4WB6Y.js.map → chunk-UIZKIUC6.js.map} +1 -1
- package/dist/{chunk-YDTW4GT6.js → chunk-XHBPQ7QP.js} +5 -5
- package/dist/{chunk-YDTW4GT6.js.map → chunk-XHBPQ7QP.js.map} +1 -1
- package/dist/chunk-Z3XXKR5E.js +88 -0
- package/dist/chunk-Z3XXKR5E.js.map +1 -0
- package/dist/{chunk-45H3UO2R.js → chunk-ZEKWHJBB.js} +52 -2
- package/dist/chunk-ZEKWHJBB.js.map +1 -0
- package/dist/cli/index.js +220 -117
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/src/asset-feeds.d.ts +14 -1
- package/dist/cli/src/asset-feeds.d.ts.map +1 -1
- package/dist/cli/src/commands/library-cmd.d.ts.map +1 -1
- package/dist/cli/src/commands/manage.d.ts +46 -23
- package/dist/cli/src/commands/manage.d.ts.map +1 -1
- package/dist/cli/src/helpers.d.ts +10 -1
- package/dist/cli/src/helpers.d.ts.map +1 -1
- package/dist/connectors/config.js +6 -6
- package/dist/connectors/index.js +8 -8
- package/dist/core/index.js +5 -5
- package/dist/core/runtime-assets.js +2 -2
- package/dist/core/src/workspace-config.d.ts +10 -1
- package/dist/core/src/workspace-config.d.ts.map +1 -1
- package/dist/core/workspace-config.js +1 -1
- package/dist/deploy/index.js +5 -5
- package/dist/{ensure-sources-CVULUVH4.js → ensure-sources-BNSRO5G7.js} +11 -10
- package/dist/ensure-sources-BNSRO5G7.js.map +1 -0
- package/dist/factory-assets/connectors/deploy.js +8 -8
- package/dist/factory-assets/connectors/devserver.js +8 -8
- package/dist/factory-assets/connectors/flow/adapter.js +8 -8
- package/dist/factory-assets/connectors/flow/engine.js +5 -5
- package/dist/factory-assets/connectors/flow/run-flow.js +9 -9
- package/dist/factory-assets/connectors/flow.js +8 -8
- package/dist/factory-assets/connectors/git.js +8 -8
- package/dist/factory-assets/connectors/gmail.js +8 -8
- package/dist/factory-assets/connectors/googledrive.js +8 -8
- package/dist/factory-assets/connectors/local.js +8 -8
- package/dist/factory-assets/connectors/mattermost.js +8 -8
- package/dist/factory-assets/connectors/memory.js +8 -8
- package/dist/factory-assets/connectors/minio.js +8 -8
- package/dist/factory-assets/connectors/postgres.js +8 -8
- package/dist/factory-assets/connectors/s3.js +8 -8
- package/dist/factory-assets/connectors/sharepoint.js +8 -8
- package/dist/factory-assets/connectors/sqlite.js +8 -8
- package/dist/factory-assets/connectors/static-server.js +8 -8
- package/dist/factory-assets/connectors/tunnel.js +8 -8
- package/dist/factory-assets/connectors/webdav.js +8 -8
- package/dist/factory-assets/connectors/xstate-store.js +8 -8
- package/dist/factory-assets/connectors/xstate.js +8 -8
- package/dist/{flows-JZFJD5IN.js → flows-L3GHQD7F.js} +4 -4
- package/dist/{flows-JZFJD5IN.js.map → flows-L3GHQD7F.js.map} +1 -1
- package/dist/helpers-F4NZ66VD.js +4 -0
- package/dist/{helpers-LTN3HMD3.js.map → helpers-F4NZ66VD.js.map} +1 -1
- package/dist/library/index.js +8 -7
- package/dist/library/install.d.ts +2 -0
- package/dist/library/install.js +16 -0
- package/dist/library/install.js.map +1 -0
- package/dist/library/src/index.d.ts +2 -2
- package/dist/library/src/index.d.ts.map +1 -1
- package/dist/library/src/install/index.d.ts +3 -0
- package/dist/library/src/install/index.d.ts.map +1 -0
- package/dist/library/src/library.d.ts +20 -20
- package/dist/library/src/library.d.ts.map +1 -1
- package/dist/library/src/local/db.d.ts.map +1 -1
- package/dist/library/src/local/library.d.ts +6 -6
- package/dist/library/src/local/library.d.ts.map +1 -1
- package/dist/library/src/local/local-catalog-source.d.ts +1 -1
- package/dist/library/src/local/schema.d.ts +9 -9
- package/dist/library/src/local/schema.d.ts.map +1 -1
- package/dist/library/src/preset/apply.d.ts +9 -9
- package/dist/library/src/preset/apply.d.ts.map +1 -1
- package/dist/library/src/preset/resolve-item.d.ts +1 -1
- package/dist/library/src/workspace-config.d.ts +11 -8
- package/dist/library/src/workspace-config.d.ts.map +1 -1
- package/dist/{open-library-WYASW4BH.js → open-library-3VJY74LQ.js} +12 -11
- package/dist/{open-library-WYASW4BH.js.map → open-library-3VJY74LQ.js.map} +1 -1
- package/dist/{paths-BMW6JYW6.js → paths-CE66L3AL.js} +8 -8
- package/dist/{paths-BMW6JYW6.js.map → paths-CE66L3AL.js.map} +1 -1
- package/dist/{plugin-store-O5VR45CA.js → plugin-store-GL5VKYUA.js} +7 -7
- package/dist/{plugin-store-O5VR45CA.js.map → plugin-store-GL5VKYUA.js.map} +1 -1
- package/dist/runner/index.js +14 -14
- package/dist/runner/src/serve.d.ts.map +1 -1
- package/dist/sdk/asset-manager.js +7 -7
- package/dist/sdk/bridge.js +3 -3
- package/dist/sdk/core.js +5 -5
- package/dist/sdk/flow.js +5 -5
- package/dist/sdk/index.js +14 -14
- package/dist/sdk/runner.js +14 -14
- package/dist/{setup-YNLFR5GB.js → setup-4YMN2BDU.js} +10 -10
- package/dist/{setup-YNLFR5GB.js.map → setup-4YMN2BDU.js.map} +1 -1
- package/dist/{store-client-CENBEASX.js → store-client-BCP5LCAZ.js} +8 -8
- package/dist/{store-client-CENBEASX.js.map → store-client-BCP5LCAZ.js.map} +1 -1
- package/dist/tui/index.js +14 -14
- package/dist/workspace-plugin/adapters/mcp.js +3 -3
- package/dist/workspace-plugin/adapters/omp.js +3 -3
- package/dist/workspace-plugin/index.js +1 -1
- package/package.json +37 -1
- package/dist/asset-feeds-WMVTI7KW.js.map +0 -1
- package/dist/chunk-45H3UO2R.js.map +0 -1
- package/dist/chunk-RTAIGPTF.js.map +0 -1
- package/dist/chunk-WD4LP66U.js.map +0 -1
- package/dist/chunk-WSZAFRQL.js.map +0 -1
- package/dist/chunk-Z5DI7PDG.js.map +0 -1
- package/dist/ensure-sources-CVULUVH4.js.map +0 -1
- package/dist/helpers-LTN3HMD3.js +0 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,70 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.28.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#109](https://github.com/skaile-ai/workspaces/pull/109) [`952ba41`](https://github.com/skaile-ai/workspaces/commit/952ba418326e8dcecf34b2ddf5ae3db6cfbdcc25) Thanks [@peteralbert](https://github.com/peteralbert)! - Fix discoverable composition entries being silently dropped when the local
|
|
8
|
+
asset index errors. `resolveComposition`'s discoverable path now treats the
|
|
9
|
+
library lookup as optional description enrichment: a failure to open or query
|
|
10
|
+
the index (missing/corrupt/migrating `~/.skaile/index.db`) falls back to the
|
|
11
|
+
default description instead of aborting the entry, so skills/connectors still
|
|
12
|
+
register as capabilities.
|
|
13
|
+
|
|
14
|
+
## 0.28.0
|
|
15
|
+
|
|
16
|
+
### Minor Changes
|
|
17
|
+
|
|
18
|
+
- [#110](https://github.com/skaile-ai/workspaces/pull/110) [`2d90fd6`](https://github.com/skaile-ai/workspaces/commit/2d90fd67dc3dd6292bd82efd7b891c05ad785725) Thanks [@peteralbert](https://github.com/peteralbert)! - Rename the asset-library `subscription` concept to `assignment`: the LocalIndex/`IAssetIndex` methods `subscribe`/`unsubscribe`/`listSubscriptions` → `assign`/`unassign`/`listAssignments`; types `Subscription`/`LockSubscription` → `Assignment`/`LockAssignment`; errors `DuplicateSubscriptionError`/`SubscriptionNotFoundError` → `DuplicateAssignmentError`/`AssignmentNotFoundError`; the SQLite `subscriptions` table → `assignments` (one-shot auto-migration on open); and the `skaile.lock.yaml` `subscriptions:` field → `assignments:` (legacy key still read). Pure rename — no behavior change.
|
|
19
|
+
|
|
20
|
+
## 0.27.0
|
|
21
|
+
|
|
22
|
+
### Minor Changes
|
|
23
|
+
|
|
24
|
+
- [#101](https://github.com/skaile-ai/workspaces/pull/101) [`d72e752`](https://github.com/skaile-ai/workspaces/commit/d72e752e9a68c00b4b87eb107d554c50522cd410) Thanks [@peteralbert](https://github.com/peteralbert)! - Add five new agent backends — **Gemini CLI** (`gemini`), **Qwen Code** (`qwen`),
|
|
25
|
+
**OpenCode** (`opencode`), **Goose** (`goose`), and **Continue CLI**
|
|
26
|
+
(`continue`) — wrapping each tool's headless / structured-output mode behind the
|
|
27
|
+
`AgentDriver` contract.
|
|
28
|
+
|
|
29
|
+
- **New shared base** `bridge/src/drivers/_subprocess-cli.ts`
|
|
30
|
+
(`SubprocessCliDriver`) for one-shot CLI backends: spawn-per-turn, stream
|
|
31
|
+
newline-delimited JSON on stdout → `AgentEvent`s, process exit = turn end.
|
|
32
|
+
Session continuity is captured (`session_info`) and replayed via each CLI's
|
|
33
|
+
resume flag.
|
|
34
|
+
- **New subpath exports**: `@skaile/workspaces/drivers/{gemini,qwen,opencode,goose,continue}`,
|
|
35
|
+
each registered into `pluginRegistry` by `registerBuiltinDrivers()` and listed
|
|
36
|
+
in `BUILTIN_DRIVER_CATALOG` / `listDrivers()`.
|
|
37
|
+
- These drivers spawn an external binary the user installs separately, so they
|
|
38
|
+
bundle **no SDK** and carry **no `bun --compile` build constant** — always
|
|
39
|
+
available, like `omp`/`echo`. A missing binary surfaces as a `config` error
|
|
40
|
+
with an install hint.
|
|
41
|
+
- `qwen`, `opencode`, `goose`, and `continue` are **model-agnostic** (only `omp`
|
|
42
|
+
was before); `gemini` adds first Google/Gemini coverage.
|
|
43
|
+
|
|
44
|
+
Additive only — no existing API changed. Caveats (Gemini headless resume,
|
|
45
|
+
version-gated `--output-format` for Gemini/Goose, Continue's buffered-only
|
|
46
|
+
output) and the design are documented in
|
|
47
|
+
`_devlog/specs/2026-06-06-cli-agent-backends.md`.
|
|
48
|
+
|
|
49
|
+
- [#105](https://github.com/skaile-ai/workspaces/pull/105) [`25f2763`](https://github.com/skaile-ai/workspaces/commit/25f2763a750b92cd6c6255ce4bf3abb3074bbb14) Thanks [@mortegro](https://github.com/mortegro)! - `skaile manage` Assets tab now groups assets by **origin** — Library / Sources / Store — as a top-level collapsible band (`origin → publisher → repo → asset`), so it's clear where each skill comes from. The Store section is default-collapsed (local assets stay front-and-centre), and number keys `1`/`2`/`3` filter the list to a single origin (`0` clears). Origin is also shown in the asset info panel.
|
|
50
|
+
|
|
51
|
+
- [#106](https://github.com/skaile-ai/workspaces/pull/106) [`8b7b87c`](https://github.com/skaile-ai/workspaces/commit/8b7b87c6ca9c10ec7dce5a85bde49cb5f965eb87) Thanks [@peteralbert](https://github.com/peteralbert)! - strict-yaml: runner activates only declared MCP servers (opt-in via SKAILE_STRICT_YAML)
|
|
52
|
+
|
|
53
|
+
- [#106](https://github.com/skaile-ai/workspaces/pull/106) [`8b7b87c`](https://github.com/skaile-ai/workspaces/commit/8b7b87c6ca9c10ec7dce5a85bde49cb5f965eb87) Thanks [@peteralbert](https://github.com/peteralbert)! - strict-yaml: skill staging is declaration-driven (opt-in via SKAILE_STRICT_YAML)
|
|
54
|
+
|
|
55
|
+
### Patch Changes
|
|
56
|
+
|
|
57
|
+
- [#104](https://github.com/skaile-ai/workspaces/pull/104) [`f876a25`](https://github.com/skaile-ai/workspaces/commit/f876a2535dc0269431ce8a6fc03fad596e7b0fe4) Thanks [@mortegro](https://github.com/mortegro)! - Fix `skaile manage` table alignment for long asset kinds (e.g. `mcp-server`). `kindColorPad` now fits the kind to an exact column width (pads short, truncates over-long) instead of only padding, and the kind column widened to fit the longest kind.
|
|
58
|
+
|
|
59
|
+
- [#106](https://github.com/skaile-ai/workspaces/pull/106) [`8b7b87c`](https://github.com/skaile-ai/workspaces/commit/8b7b87c6ca9c10ec7dce5a85bde49cb5f965eb87) Thanks [@peteralbert](https://github.com/peteralbert)! - Expose DB-free install-core via `./install` subpath.
|
|
60
|
+
|
|
61
|
+
Adds `@skaile/workspaces/install` re-exporting `installFromManifest`,
|
|
62
|
+
`fetchAssetFilesFromGitHub`, and their public types (`AssetFetcher`,
|
|
63
|
+
`InstallOpts`, `InstallResult`, `FetchOpts`, `GITHUB_PAT_ENV`). The
|
|
64
|
+
install module has no `LocalIndex` / `@libsql/client` dependency, making
|
|
65
|
+
it safe to import from environments that do not carry the full library
|
|
66
|
+
stack (e.g. the platform backend).
|
|
67
|
+
|
|
3
68
|
## 0.26.0
|
|
4
69
|
|
|
5
70
|
### Minor Changes
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import './chunk-
|
|
2
|
-
import './chunk-
|
|
3
|
-
import './chunk-
|
|
4
|
-
import './chunk-C32BRO2W.js';
|
|
5
|
-
import { scanRepo } from './chunk-Z5DI7PDG.js';
|
|
1
|
+
import './chunk-M4KLIEIJ.js';
|
|
2
|
+
import './chunk-FWHOU3CX.js';
|
|
3
|
+
import { scanRepo } from './chunk-3QQSSRYN.js';
|
|
6
4
|
import './chunk-IERB3UXJ.js';
|
|
7
5
|
import './chunk-2FS4FPZ7.js';
|
|
8
6
|
import './chunk-IEJ5IOC3.js';
|
|
9
7
|
import './chunk-JKNWJ64A.js';
|
|
10
8
|
import './chunk-O4JH3KUE.js';
|
|
9
|
+
import './chunk-K5GBV4SA.js';
|
|
10
|
+
import './chunk-ZAP2BDHG.js';
|
|
11
11
|
import './chunk-24UIWON4.js';
|
|
12
12
|
import './chunk-NSBPE2FW.js';
|
|
13
13
|
import { existsSync } from 'fs';
|
|
@@ -17,7 +17,7 @@ async function libraryAssets() {
|
|
|
17
17
|
const notes = [];
|
|
18
18
|
try {
|
|
19
19
|
const [{ openLibraryManager }, { skaileHomeDir }] = await Promise.all([
|
|
20
|
-
import('./open-library-
|
|
20
|
+
import('./open-library-3VJY74LQ.js'),
|
|
21
21
|
import('./library/index.js')
|
|
22
22
|
]);
|
|
23
23
|
const { manager, close } = await openLibraryManager();
|
|
@@ -46,7 +46,7 @@ async function libraryAssets() {
|
|
|
46
46
|
async function storeAssets(projectDir) {
|
|
47
47
|
const notes = [];
|
|
48
48
|
try {
|
|
49
|
-
const { resolveCatalogSource } = await import('./open-library-
|
|
49
|
+
const { resolveCatalogSource } = await import('./open-library-3VJY74LQ.js');
|
|
50
50
|
const { source, close } = await resolveCatalogSource({ projectDir });
|
|
51
51
|
try {
|
|
52
52
|
const assets = await source.listAssets();
|
|
@@ -77,14 +77,21 @@ async function storeAssets(projectDir) {
|
|
|
77
77
|
function sourceAssets(am) {
|
|
78
78
|
return am.search();
|
|
79
79
|
}
|
|
80
|
+
function tag(origin, entries) {
|
|
81
|
+
return entries.map((entry) => ({ origin, entry }));
|
|
82
|
+
}
|
|
80
83
|
async function gatherAssetFeeds(am, projectDir) {
|
|
81
84
|
const [libs, store] = await Promise.all([libraryAssets(), storeAssets(projectDir)]);
|
|
82
85
|
return {
|
|
83
|
-
entries: [
|
|
86
|
+
entries: [
|
|
87
|
+
...tag("source", sourceAssets(am)),
|
|
88
|
+
...tag("library", libs.entries),
|
|
89
|
+
...tag("store", store.entries)
|
|
90
|
+
],
|
|
84
91
|
notes: [...libs.notes, ...store.notes]
|
|
85
92
|
};
|
|
86
93
|
}
|
|
87
94
|
|
|
88
95
|
export { gatherAssetFeeds, sourceAssets };
|
|
89
|
-
//# sourceMappingURL=asset-feeds-
|
|
90
|
-
//# sourceMappingURL=asset-feeds-
|
|
96
|
+
//# sourceMappingURL=asset-feeds-2V7LZIG7.js.map
|
|
97
|
+
//# sourceMappingURL=asset-feeds-2V7LZIG7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../cli/src/asset-feeds.ts"],"names":[],"mappings":"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","file":"asset-feeds-2V7LZIG7.js","sourcesContent":["/**\n * asset-feeds.ts — gather installable assets from every feed the manage TUI\n * surfaces.\n *\n * Three feeds, normalized into `CatalogEntry`:\n * - **Project sources** — `skaile.yaml` `sources:` entries (scanned via\n * `AssetManager.search()`; the new `sources:` field is merged into the\n * legacy repositories map in `AssetManager.loadConfig`).\n * - **Local libraries** — user authoring places from `LocalIndex` (filesystem\n * scan of each library's `path`).\n * - **Remote store** — the configured catalog source when `catalog.url` is\n * not `local`. Failures are non-fatal — they surface as notes.\n */\n\nimport { existsSync } from \"node:fs\";\nimport * as path from \"node:path\";\nimport { type AssetKind, type CatalogEntry, scanRepo } from \"@skaile/workspaces/core\";\n\n/** One non-fatal note returned to the caller for surfacing in the UI. */\nexport interface FeedNote {\n feed: \"sources\" | \"libraries\" | \"store\";\n message: string;\n}\n\n/**\n * Which feed an asset came from. This is the top-level grouping axis in the\n * manage TUI (\"where is this skill coming from?\") and is intentionally distinct\n * from `publisher` (asset-intrinsic identity): the same publisher can legitimately\n * appear under more than one origin (e.g. a github repo you added as a `source`\n * that is also listed in the remote `store`).\n */\nexport type AssetOrigin = \"source\" | \"library\" | \"store\";\n\n/** A catalog entry tagged with the feed it was gathered from. */\nexport interface OriginEntry {\n origin: AssetOrigin;\n entry: CatalogEntry;\n}\n\nexport interface AssetFeedResult {\n entries: OriginEntry[];\n notes: FeedNote[];\n}\n\n/**\n * Pull assets from local libraries (the authoring places under\n * `~/.skaile/libraries/<name>/`, not the `~/.skaile/sources/` cache). Each\n * library's `path` is scanned with `scanRepo` and tagged with\n * `repository = \"library:<name>\"` so the manage TUI groups them into their\n * own headers.\n */\nasync function libraryAssets(): Promise<{ entries: CatalogEntry[]; notes: FeedNote[] }> {\n const notes: FeedNote[] = [];\n try {\n const [{ openLibraryManager }, { skaileHomeDir }] = await Promise.all([\n import(\"./open-library.ts\"),\n import(\"@skaile/workspaces/library\"),\n ]);\n const { manager, close } = await openLibraryManager();\n try {\n const sourcesDir = path.join(skaileHomeDir(), \"sources\");\n const libs = (await manager.listLibraries()).filter((l) => !l.path.startsWith(sourcesDir));\n const entries: CatalogEntry[] = [];\n for (const lib of libs) {\n if (!existsSync(lib.path)) continue;\n for (const e of scanRepo(lib.path, `library:${lib.name}`)) {\n entries.push(e);\n }\n }\n return { entries, notes };\n } finally {\n close();\n }\n } catch (err) {\n notes.push({\n feed: \"libraries\",\n message: err instanceof Error ? err.message : String(err),\n });\n return { entries: [], notes };\n }\n}\n\n/**\n * Pull a (best-effort) snapshot of the connected remote store catalog.\n *\n * - Returns no entries when the resolved catalog is local-only or the host\n * is unreachable (the failure becomes a note, not an exception).\n * - Maps `CatalogAsset` → `CatalogEntry`, carrying `publisher`, `repo`, and\n * `category` straight through and using `source = \"store://<id>\"`; per-file\n * `source` paths are not available for remote assets so the canonical ref is\n * a stable placeholder.\n */\nasync function storeAssets(projectDir: string): Promise<{\n entries: CatalogEntry[];\n notes: FeedNote[];\n}> {\n const notes: FeedNote[] = [];\n try {\n const { resolveCatalogSource } = await import(\"./open-library.ts\");\n const { source, close } = await resolveCatalogSource({ projectDir });\n try {\n const assets = await source.listAssets();\n const entries: CatalogEntry[] = assets.map((a) => ({\n name: a.name,\n kind: (a.kind as AssetKind) ?? \"skill\",\n description: a.description ?? \"\",\n source: `store://${a.id}`,\n publisher: a.publisher,\n repo: a.repo,\n category: a.category,\n version: a.version,\n requires: [],\n dependencies: [],\n }));\n return { entries, notes };\n } finally {\n close();\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n // Local-only catalog throws a recognizable message — silence it; absence\n // is the user's choice, not an error.\n if (!/local/i.test(msg)) {\n notes.push({ feed: \"store\", message: msg });\n }\n return { entries: [], notes };\n }\n}\n\n/**\n * Project-source feed: leans on `AssetManager.search()`, which now merges\n * `skaile.yaml`'s `sources:` field into the repositories map. Provided as a\n * function rather than an inline call so the caller can supply a fresh\n * `AssetManager` instance.\n */\nexport function sourceAssets(am: { search: () => CatalogEntry[] }): CatalogEntry[] {\n return am.search();\n}\n\n/** Tag a flat entry list with a single origin. */\nfunction tag(origin: AssetOrigin, entries: CatalogEntry[]): OriginEntry[] {\n return entries.map((entry) => ({ origin, entry }));\n}\n\n/**\n * Run all three feeds and return a single normalized result.\n *\n * Feeds run in parallel where possible — the store fetch is the slow one\n * (one HTTP call) and is fired alongside the local library walk.\n */\nexport async function gatherAssetFeeds(\n am: { search: () => CatalogEntry[] },\n projectDir: string,\n): Promise<AssetFeedResult> {\n const [libs, store] = await Promise.all([libraryAssets(), storeAssets(projectDir)]);\n return {\n entries: [\n ...tag(\"source\", sourceAssets(am)),\n ...tag(\"library\", libs.entries),\n ...tag(\"store\", store.entries),\n ],\n notes: [...libs.notes, ...store.notes],\n };\n}\n"]}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
export { AssetManager, parseCanonicalLockKey } from '../chunk-
|
|
2
|
-
export { createScaffold, deployAll, installAgent, removeAsset } from '../chunk-
|
|
3
|
-
import '../chunk-
|
|
4
|
-
import '../chunk-
|
|
5
|
-
import '../chunk-
|
|
6
|
-
import '../chunk-C32BRO2W.js';
|
|
7
|
-
import '../chunk-Z5DI7PDG.js';
|
|
1
|
+
export { AssetManager, parseCanonicalLockKey } from '../chunk-U5L6F5NZ.js';
|
|
2
|
+
export { createScaffold, deployAll, installAgent, removeAsset } from '../chunk-SF4GWVR5.js';
|
|
3
|
+
import '../chunk-M4KLIEIJ.js';
|
|
4
|
+
import '../chunk-FWHOU3CX.js';
|
|
5
|
+
import '../chunk-3QQSSRYN.js';
|
|
8
6
|
import '../chunk-IERB3UXJ.js';
|
|
9
7
|
import '../chunk-2FS4FPZ7.js';
|
|
10
8
|
import '../chunk-IEJ5IOC3.js';
|
|
11
9
|
import '../chunk-JKNWJ64A.js';
|
|
12
10
|
import '../chunk-O4JH3KUE.js';
|
|
11
|
+
import '../chunk-K5GBV4SA.js';
|
|
12
|
+
import '../chunk-ZAP2BDHG.js';
|
|
13
13
|
import '../chunk-24UIWON4.js';
|
|
14
14
|
export { appendHistory, clearHistory, getRecentHistory, loadHistory } from '../chunk-KTBKW2FI.js';
|
|
15
15
|
import '../chunk-UQ6LFBPZ.js';
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
export { createScaffold, deployAll, deployAsset, removeAsset } from '../chunk-
|
|
2
|
-
import '../chunk-
|
|
3
|
-
import '../chunk-
|
|
4
|
-
import '../chunk-
|
|
5
|
-
import '../chunk-C32BRO2W.js';
|
|
6
|
-
import '../chunk-Z5DI7PDG.js';
|
|
1
|
+
export { createScaffold, deployAll, deployAsset, removeAsset } from '../chunk-SF4GWVR5.js';
|
|
2
|
+
import '../chunk-M4KLIEIJ.js';
|
|
3
|
+
import '../chunk-FWHOU3CX.js';
|
|
4
|
+
import '../chunk-3QQSSRYN.js';
|
|
7
5
|
import '../chunk-IERB3UXJ.js';
|
|
8
6
|
import '../chunk-2FS4FPZ7.js';
|
|
9
7
|
import '../chunk-IEJ5IOC3.js';
|
|
10
8
|
import '../chunk-JKNWJ64A.js';
|
|
11
9
|
import '../chunk-O4JH3KUE.js';
|
|
10
|
+
import '../chunk-K5GBV4SA.js';
|
|
11
|
+
import '../chunk-ZAP2BDHG.js';
|
|
12
12
|
import '../chunk-24UIWON4.js';
|
|
13
13
|
import '../chunk-MBOR7D65.js';
|
|
14
14
|
import '../chunk-QDJKE557.js';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { dispatchCapability } from '../../chunk-RRVQAE5D.js';
|
|
1
2
|
import { fetchProviderModels } from '../../chunk-BMQKMOQY.js';
|
|
2
3
|
import { AuthError, classifyClaudeSdkError } from '../../chunk-PAYAFNXG.js';
|
|
3
|
-
import {
|
|
4
|
-
import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-45H3UO2R.js';
|
|
4
|
+
import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-ZEKWHJBB.js';
|
|
5
5
|
import '../../chunk-6E6PKKAD.js';
|
|
6
6
|
import '../../chunk-24UIWON4.js';
|
|
7
7
|
import '../../chunk-NSBPE2FW.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { fetchProviderModels } from '../../chunk-BMQKMOQY.js';
|
|
2
2
|
import { classifyGenericErrorMessage } from '../../chunk-PAYAFNXG.js';
|
|
3
|
-
import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-
|
|
3
|
+
import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-ZEKWHJBB.js';
|
|
4
4
|
import '../../chunk-6E6PKKAD.js';
|
|
5
5
|
import '../../chunk-24UIWON4.js';
|
|
6
6
|
import '../../chunk-NSBPE2FW.js';
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { SubprocessCliDriver, mapApiKeysToEnv, extractText, extractCost, extractTokens } from '../../chunk-5V5KZQIC.js';
|
|
2
|
+
import '../../chunk-PAYAFNXG.js';
|
|
3
|
+
import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-ZEKWHJBB.js';
|
|
4
|
+
import '../../chunk-6E6PKKAD.js';
|
|
5
|
+
import '../../chunk-24UIWON4.js';
|
|
6
|
+
import '../../chunk-NSBPE2FW.js';
|
|
7
|
+
import * as z from 'zod';
|
|
8
|
+
|
|
9
|
+
var ContinueDriver = class extends SubprocessCliDriver {
|
|
10
|
+
driverInfo = {
|
|
11
|
+
id: "continue",
|
|
12
|
+
name: "Continue CLI",
|
|
13
|
+
modelAgnostic: true,
|
|
14
|
+
supportsInBandAbort: false
|
|
15
|
+
};
|
|
16
|
+
log = getBridgeLogger("continue");
|
|
17
|
+
defaultBin = "cn";
|
|
18
|
+
productName = "Continue CLI";
|
|
19
|
+
envPrefix = "CONTINUE";
|
|
20
|
+
mode = "buffered";
|
|
21
|
+
buildArgs(message, resumeId) {
|
|
22
|
+
const args = ["-p", message, "--format", "json", "--silent"];
|
|
23
|
+
const slug = this.config.model;
|
|
24
|
+
if (slug) args.push("--config", slug);
|
|
25
|
+
if (resumeId) args.push("--resume");
|
|
26
|
+
return args;
|
|
27
|
+
}
|
|
28
|
+
buildEnv() {
|
|
29
|
+
const env = this.baseEnv(["CONTINUE_API_KEY"]);
|
|
30
|
+
const key = this.config.apiKeys?.continue ?? this.config.env?.CONTINUE_API_KEY ?? process.env.CONTINUE_API_KEY;
|
|
31
|
+
if (key) env.CONTINUE_API_KEY = key;
|
|
32
|
+
return { ...env, ...mapApiKeysToEnv(this.config.apiKeys) };
|
|
33
|
+
}
|
|
34
|
+
installHint() {
|
|
35
|
+
return "Continue CLI is not installed or not on your PATH. Install it with `npm i -g @continuedev/cli`.";
|
|
36
|
+
}
|
|
37
|
+
handleBuffered(raw) {
|
|
38
|
+
const json = parseLastJsonObject(raw);
|
|
39
|
+
if (!json) {
|
|
40
|
+
const text2 = raw.trim();
|
|
41
|
+
if (text2) {
|
|
42
|
+
this.pushAssistantDelta(text2);
|
|
43
|
+
this.pushAssistantEnd(text2);
|
|
44
|
+
}
|
|
45
|
+
this.pushResult({ summary: text2 || "Task completed" });
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
this.captureSession(json.sessionId ?? json.session_id ?? json.id);
|
|
49
|
+
const text = extractText(json) || (typeof json.output === "string" ? json.output : "");
|
|
50
|
+
if (text) {
|
|
51
|
+
this.pushAssistantDelta(text);
|
|
52
|
+
this.pushAssistantEnd(text);
|
|
53
|
+
}
|
|
54
|
+
this.pushResult({
|
|
55
|
+
tokens: extractTokens(json),
|
|
56
|
+
costUsd: extractCost(json),
|
|
57
|
+
summary: text || "Task completed"
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
async listModels() {
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
function parseLastJsonObject(raw) {
|
|
65
|
+
const end = raw.lastIndexOf("}");
|
|
66
|
+
if (end < 0) return null;
|
|
67
|
+
let depth = 0;
|
|
68
|
+
let inString = false;
|
|
69
|
+
let escaped = false;
|
|
70
|
+
for (let i = end; i >= 0; i--) {
|
|
71
|
+
const ch = raw[i];
|
|
72
|
+
if (inString) {
|
|
73
|
+
if (escaped) escaped = false;
|
|
74
|
+
else if (ch === "\\") escaped = true;
|
|
75
|
+
else if (ch === '"') inString = false;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (ch === '"') inString = true;
|
|
79
|
+
else if (ch === "}") depth++;
|
|
80
|
+
else if (ch === "{") {
|
|
81
|
+
depth--;
|
|
82
|
+
if (depth === 0) {
|
|
83
|
+
try {
|
|
84
|
+
return JSON.parse(raw.slice(i, end + 1));
|
|
85
|
+
} catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
var continueDriverTarget = {
|
|
94
|
+
id: "continue",
|
|
95
|
+
displayName: BUILTIN_DRIVER_CATALOG.continue?.name ?? "Continue CLI",
|
|
96
|
+
apiVersion: 1,
|
|
97
|
+
configSchema: z.custom(() => true),
|
|
98
|
+
create: async (config, _ctx) => new ContinueDriver(config)
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
export { ContinueDriver, continueDriverTarget };
|
|
102
|
+
//# sourceMappingURL=continue.js.map
|
|
103
|
+
//# sourceMappingURL=continue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../bridge/src/drivers/continue.ts"],"names":["text"],"mappings":"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","file":"continue.js","sourcesContent":["import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport {\n extractCost,\n extractText,\n extractTokens,\n mapApiKeysToEnv,\n SubprocessCliDriver,\n} from \"./_subprocess-cli.js\";\n\n/**\n * Agent driver for the **Continue CLI** (`cn`), the model-agnostic agent backed\n * by Continue Hub / `config.yaml` assistants.\n *\n * Unlike the other CLI drivers, `cn -p \"<prompt>\" --format json` emits a single\n * **final-result JSON wrapper**, not a streaming event log. This driver runs in\n * `mode: \"buffered\"`: the base accumulates all stdout and {@link handleBuffered}\n * parses it once on exit — so there are no incremental deltas or per-tool\n * events, only a final assistant message plus a result.\n *\n * @remarks\n * - Auth via `CONTINUE_API_KEY` / `cn login`; provider keys flow through the\n * environment and the selected `config.yaml`.\n * - `--config <slug>` selects the assistant; session resume via `--resume`\n * (last session only — Continue has no resume-by-id in headless mode).\n *\n * @see https://docs.continue.dev/guides/cli\n * @docLink packages/bridge/drivers#continue-driver\n */\nexport class ContinueDriver extends SubprocessCliDriver {\n readonly driverInfo: DriverInfo = {\n id: \"continue\",\n name: \"Continue CLI\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"continue\");\n protected readonly defaultBin = \"cn\";\n protected readonly productName = \"Continue CLI\";\n protected readonly envPrefix = \"CONTINUE\";\n protected override readonly mode = \"buffered\" as const;\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"-p\", message, \"--format\", \"json\", \"--silent\"];\n const slug = this.config.model; // Continue selects assistants/models by config slug.\n if (slug) args.push(\"--config\", slug);\n if (resumeId) args.push(\"--resume\");\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\"CONTINUE_API_KEY\"]);\n const key =\n this.config.apiKeys?.continue ??\n this.config.env?.CONTINUE_API_KEY ??\n process.env.CONTINUE_API_KEY;\n if (key) env.CONTINUE_API_KEY = key;\n return { ...env, ...mapApiKeysToEnv(this.config.apiKeys) };\n }\n\n protected installHint(): string {\n return \"Continue CLI is not installed or not on your PATH. Install it with `npm i -g @continuedev/cli`.\";\n }\n\n protected handleBuffered(raw: string): void {\n const json = parseLastJsonObject(raw);\n if (!json) {\n // No structured wrapper — surface the raw stdout as the assistant reply.\n const text = raw.trim();\n if (text) {\n this.pushAssistantDelta(text);\n this.pushAssistantEnd(text);\n }\n this.pushResult({ summary: text || \"Task completed\" });\n return;\n }\n this.captureSession(json.sessionId ?? json.session_id ?? json.id);\n const text = extractText(json) || (typeof json.output === \"string\" ? json.output : \"\");\n if (text) {\n this.pushAssistantDelta(text);\n this.pushAssistantEnd(text);\n }\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: text || \"Task completed\",\n });\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n return [];\n }\n}\n\n/**\n * Parse the last balanced top-level JSON object in `raw`. Continue may print\n * log lines before the final `--format json` blob; we want the wrapper, which\n * is the last `{...}` in the output.\n */\nfunction parseLastJsonObject(raw: string): any | null {\n const end = raw.lastIndexOf(\"}\");\n if (end < 0) return null;\n let depth = 0;\n let inString = false;\n let escaped = false;\n for (let i = end; i >= 0; i--) {\n const ch = raw[i];\n if (inString) {\n if (escaped) escaped = false;\n else if (ch === \"\\\\\") escaped = true;\n else if (ch === '\"') inString = false;\n continue;\n }\n if (ch === '\"') inString = true;\n else if (ch === \"}\") depth++;\n else if (ch === \"{\") {\n depth--;\n if (depth === 0) {\n try {\n return JSON.parse(raw.slice(i, end + 1));\n } catch {\n return null;\n }\n }\n }\n }\n return null;\n}\n\n/**\n * `DriverTarget` wrapper for the continue driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const continueDriverTarget: DriverTarget<AgentConfig> = {\n id: \"continue\",\n displayName: BUILTIN_DRIVER_CATALOG.continue?.name ?? \"Continue CLI\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new ContinueDriver(config),\n};\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { dispatchCapability } from '../../chunk-RRVQAE5D.js';
|
|
2
|
-
import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-
|
|
2
|
+
import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-ZEKWHJBB.js';
|
|
3
3
|
import '../../chunk-6E6PKKAD.js';
|
|
4
4
|
import '../../chunk-24UIWON4.js';
|
|
5
5
|
import '../../chunk-NSBPE2FW.js';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { GeminiDriver, GeminiFamilyDriver, geminiDriverTarget } from '../../chunk-5RBPPBEK.js';
|
|
2
|
+
import '../../chunk-5V5KZQIC.js';
|
|
3
|
+
import '../../chunk-BMQKMOQY.js';
|
|
4
|
+
import '../../chunk-PAYAFNXG.js';
|
|
5
|
+
import '../../chunk-ZEKWHJBB.js';
|
|
6
|
+
import '../../chunk-6E6PKKAD.js';
|
|
7
|
+
import '../../chunk-24UIWON4.js';
|
|
8
|
+
import '../../chunk-NSBPE2FW.js';
|
|
9
|
+
//# sourceMappingURL=gemini.js.map
|
|
10
|
+
//# sourceMappingURL=gemini.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"gemini.js"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { SubprocessCliDriver, mapApiKeysToEnv, extractText, extractCost, extractTokens } from '../../chunk-5V5KZQIC.js';
|
|
2
|
+
import '../../chunk-PAYAFNXG.js';
|
|
3
|
+
import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-ZEKWHJBB.js';
|
|
4
|
+
import '../../chunk-6E6PKKAD.js';
|
|
5
|
+
import '../../chunk-24UIWON4.js';
|
|
6
|
+
import '../../chunk-NSBPE2FW.js';
|
|
7
|
+
import * as z from 'zod';
|
|
8
|
+
|
|
9
|
+
var GooseDriver = class extends SubprocessCliDriver {
|
|
10
|
+
driverInfo = {
|
|
11
|
+
id: "goose",
|
|
12
|
+
name: "Goose",
|
|
13
|
+
modelAgnostic: true,
|
|
14
|
+
supportsInBandAbort: false
|
|
15
|
+
};
|
|
16
|
+
log = getBridgeLogger("goose");
|
|
17
|
+
defaultBin = "goose";
|
|
18
|
+
productName = "Goose";
|
|
19
|
+
envPrefix = "GOOSE";
|
|
20
|
+
buildArgs(message, resumeId) {
|
|
21
|
+
const args = ["run", "-t", message, "--output-format", "stream-json", "--quiet"];
|
|
22
|
+
if (resumeId) args.push("--resume", "--id", resumeId);
|
|
23
|
+
return args;
|
|
24
|
+
}
|
|
25
|
+
buildEnv() {
|
|
26
|
+
const env = this.baseEnv(["GOOSE_PROVIDER", "GOOSE_MODEL"]);
|
|
27
|
+
if (this.config.provider) env.GOOSE_PROVIDER = this.config.provider;
|
|
28
|
+
if (this.config.model) env.GOOSE_MODEL = this.config.model;
|
|
29
|
+
return { ...env, ...mapApiKeysToEnv(this.config.apiKeys) };
|
|
30
|
+
}
|
|
31
|
+
installHint() {
|
|
32
|
+
return "Goose is not installed or not on your PATH. Install it from https://block.github.io/goose (download script or Homebrew).";
|
|
33
|
+
}
|
|
34
|
+
handleJson(json) {
|
|
35
|
+
switch (json?.type) {
|
|
36
|
+
case "init":
|
|
37
|
+
case "session":
|
|
38
|
+
this.captureSession(json.sessionId ?? json.session_id ?? json.id);
|
|
39
|
+
break;
|
|
40
|
+
case "message":
|
|
41
|
+
case "assistant": {
|
|
42
|
+
const role = json.role ?? json.message?.role ?? "assistant";
|
|
43
|
+
if (role !== "assistant") break;
|
|
44
|
+
const text = extractText(json);
|
|
45
|
+
if (json.done === true || json.final === true) this.pushAssistantEnd(text);
|
|
46
|
+
else this.pushAssistantDelta(text);
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
case "tool_use":
|
|
50
|
+
case "tool_request":
|
|
51
|
+
this.pushToolCall(json.name ?? json.tool ?? "tool", json.input ?? json.args ?? {});
|
|
52
|
+
break;
|
|
53
|
+
case "tool_result":
|
|
54
|
+
case "tool_response":
|
|
55
|
+
this.pushToolResult(
|
|
56
|
+
json.name ?? json.tool ?? "tool",
|
|
57
|
+
json.result ?? json.output ?? json.content,
|
|
58
|
+
Boolean(json.is_error ?? json.error)
|
|
59
|
+
);
|
|
60
|
+
break;
|
|
61
|
+
case "error":
|
|
62
|
+
this.pushError(this.classifyMessage(String(json.message ?? json.error ?? "error")));
|
|
63
|
+
break;
|
|
64
|
+
case "result":
|
|
65
|
+
case "complete":
|
|
66
|
+
this.pushResult({
|
|
67
|
+
tokens: extractTokens(json),
|
|
68
|
+
costUsd: extractCost(json),
|
|
69
|
+
summary: extractText(json) || "Task completed"
|
|
70
|
+
});
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async listModels() {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
var gooseDriverTarget = {
|
|
79
|
+
id: "goose",
|
|
80
|
+
displayName: BUILTIN_DRIVER_CATALOG.goose?.name ?? "Goose",
|
|
81
|
+
apiVersion: 1,
|
|
82
|
+
configSchema: z.custom(() => true),
|
|
83
|
+
create: async (config, _ctx) => new GooseDriver(config)
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
export { GooseDriver, gooseDriverTarget };
|
|
87
|
+
//# sourceMappingURL=goose.js.map
|
|
88
|
+
//# sourceMappingURL=goose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../bridge/src/drivers/goose.ts"],"names":[],"mappings":"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","file":"goose.js","sourcesContent":["import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport {\n extractCost,\n extractText,\n extractTokens,\n mapApiKeysToEnv,\n SubprocessCliDriver,\n} from \"./_subprocess-cli.js\";\n\n/**\n * Agent driver for **Goose** (Block) (`goose`), the model-agnostic open-source\n * agent.\n *\n * Spawns `goose run -t \"<prompt>\" --output-format stream-json --quiet` per turn\n * and maps Goose's stream-json events to the unified {@link AgentEvent} stream.\n * Model-agnostic across 15+ providers; provider/model are forwarded via\n * `GOOSE_PROVIDER` / `GOOSE_MODEL` and provider keys through the environment.\n *\n * @remarks\n * - Goose is a Rust binary (not npm) — install via Block's `download_cli.sh` or\n * Homebrew.\n * - `--output-format` support is version-dependent; a too-old CLI surfaces as a\n * `process`-category exit error.\n * - Session resume via `--resume --id <id>`.\n *\n * @see https://github.com/block/goose\n * @docLink packages/bridge/drivers#goose-driver\n */\nexport class GooseDriver extends SubprocessCliDriver {\n readonly driverInfo: DriverInfo = {\n id: \"goose\",\n name: \"Goose\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"goose\");\n protected readonly defaultBin = \"goose\";\n protected readonly productName = \"Goose\";\n protected readonly envPrefix = \"GOOSE\";\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"run\", \"-t\", message, \"--output-format\", \"stream-json\", \"--quiet\"];\n if (resumeId) args.push(\"--resume\", \"--id\", resumeId);\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\"GOOSE_PROVIDER\", \"GOOSE_MODEL\"]);\n if (this.config.provider) env.GOOSE_PROVIDER = this.config.provider;\n if (this.config.model) env.GOOSE_MODEL = this.config.model;\n return { ...env, ...mapApiKeysToEnv(this.config.apiKeys) };\n }\n\n protected installHint(): string {\n return \"Goose is not installed or not on your PATH. Install it from https://block.github.io/goose (download script or Homebrew).\";\n }\n\n protected handleJson(json: any): void {\n switch (json?.type) {\n case \"init\":\n case \"session\":\n this.captureSession(json.sessionId ?? json.session_id ?? json.id);\n break;\n\n case \"message\":\n case \"assistant\": {\n const role = json.role ?? json.message?.role ?? \"assistant\";\n if (role !== \"assistant\") break;\n const text = extractText(json);\n if (json.done === true || json.final === true) this.pushAssistantEnd(text);\n else this.pushAssistantDelta(text);\n break;\n }\n\n case \"tool_use\":\n case \"tool_request\":\n this.pushToolCall(json.name ?? json.tool ?? \"tool\", json.input ?? json.args ?? {});\n break;\n\n case \"tool_result\":\n case \"tool_response\":\n this.pushToolResult(\n json.name ?? json.tool ?? \"tool\",\n json.result ?? json.output ?? json.content,\n Boolean(json.is_error ?? json.error),\n );\n break;\n\n case \"error\":\n this.pushError(this.classifyMessage(String(json.message ?? json.error ?? \"error\")));\n break;\n\n case \"result\":\n case \"complete\":\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: extractText(json) || \"Task completed\",\n });\n break;\n }\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n return [];\n }\n}\n\n/**\n * `DriverTarget` wrapper for the goose driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const gooseDriverTarget: DriverTarget<AgentConfig> = {\n id: \"goose\",\n displayName: BUILTIN_DRIVER_CATALOG.goose?.name ?? \"Goose\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new GooseDriver(config),\n};\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { classifyGenericErrorMessage } from '../../chunk-PAYAFNXG.js';
|
|
2
|
-
import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-
|
|
2
|
+
import { BUILTIN_DRIVER_CATALOG, AgentDriver, getBridgeLogger } from '../../chunk-ZEKWHJBB.js';
|
|
3
3
|
import '../../chunk-6E6PKKAD.js';
|
|
4
4
|
import '../../chunk-24UIWON4.js';
|
|
5
5
|
import '../../chunk-NSBPE2FW.js';
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { SubprocessCliDriver, mapApiKeysToEnv, extractText, extractCost, extractTokens } from '../../chunk-5V5KZQIC.js';
|
|
2
|
+
import '../../chunk-PAYAFNXG.js';
|
|
3
|
+
import { BUILTIN_DRIVER_CATALOG, getBridgeLogger } from '../../chunk-ZEKWHJBB.js';
|
|
4
|
+
import '../../chunk-6E6PKKAD.js';
|
|
5
|
+
import '../../chunk-24UIWON4.js';
|
|
6
|
+
import '../../chunk-NSBPE2FW.js';
|
|
7
|
+
import * as z from 'zod';
|
|
8
|
+
|
|
9
|
+
var OpenCodeDriver = class extends SubprocessCliDriver {
|
|
10
|
+
driverInfo = {
|
|
11
|
+
id: "opencode",
|
|
12
|
+
name: "OpenCode",
|
|
13
|
+
modelAgnostic: true,
|
|
14
|
+
supportsInBandAbort: false
|
|
15
|
+
};
|
|
16
|
+
log = getBridgeLogger("opencode");
|
|
17
|
+
defaultBin = "opencode";
|
|
18
|
+
productName = "OpenCode";
|
|
19
|
+
envPrefix = "OPENCODE";
|
|
20
|
+
buildArgs(message, resumeId) {
|
|
21
|
+
const args = ["run", message, "--format", "json"];
|
|
22
|
+
const model = this.config.provider && this.config.model ? `${this.config.provider}/${this.config.model}` : this.config.model;
|
|
23
|
+
if (model) args.push("-m", model);
|
|
24
|
+
if (resumeId) args.push("-s", resumeId);
|
|
25
|
+
return args;
|
|
26
|
+
}
|
|
27
|
+
buildEnv() {
|
|
28
|
+
const env = this.baseEnv([
|
|
29
|
+
"ANTHROPIC_API_KEY",
|
|
30
|
+
"OPENAI_API_KEY",
|
|
31
|
+
"GEMINI_API_KEY",
|
|
32
|
+
"OPENROUTER_API_KEY",
|
|
33
|
+
"GROQ_API_KEY"
|
|
34
|
+
]);
|
|
35
|
+
return { ...env, ...mapApiKeysToEnv(this.config.apiKeys) };
|
|
36
|
+
}
|
|
37
|
+
installHint() {
|
|
38
|
+
return "OpenCode is not installed or not on your PATH. Install it with `npm i -g opencode-ai`.";
|
|
39
|
+
}
|
|
40
|
+
handleJson(json) {
|
|
41
|
+
switch (json?.type) {
|
|
42
|
+
case "session":
|
|
43
|
+
case "session.start":
|
|
44
|
+
case "init":
|
|
45
|
+
this.captureSession(json.id ?? json.sessionId ?? json.session?.id);
|
|
46
|
+
break;
|
|
47
|
+
case "message":
|
|
48
|
+
case "message.part":
|
|
49
|
+
case "part": {
|
|
50
|
+
const role = json.role ?? json.message?.role ?? "assistant";
|
|
51
|
+
if (role !== "assistant") break;
|
|
52
|
+
const text = extractText(json);
|
|
53
|
+
if (json.done === true || json.final === true) this.pushAssistantEnd(text);
|
|
54
|
+
else this.pushAssistantDelta(text);
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
case "tool":
|
|
58
|
+
case "tool_use":
|
|
59
|
+
case "tool.start":
|
|
60
|
+
this.pushToolCall(json.name ?? json.tool ?? "tool", json.input ?? json.args ?? {});
|
|
61
|
+
break;
|
|
62
|
+
case "tool_result":
|
|
63
|
+
case "tool.end":
|
|
64
|
+
this.pushToolResult(
|
|
65
|
+
json.name ?? json.tool ?? "tool",
|
|
66
|
+
json.result ?? json.output ?? json.content,
|
|
67
|
+
Boolean(json.is_error ?? json.error)
|
|
68
|
+
);
|
|
69
|
+
break;
|
|
70
|
+
case "error":
|
|
71
|
+
this.pushError(this.classifyMessage(String(json.message ?? json.error ?? "error")));
|
|
72
|
+
break;
|
|
73
|
+
case "result":
|
|
74
|
+
case "done":
|
|
75
|
+
case "finish":
|
|
76
|
+
this.captureSession(json.sessionId ?? json.session_id);
|
|
77
|
+
this.pushResult({
|
|
78
|
+
tokens: extractTokens(json),
|
|
79
|
+
costUsd: extractCost(json),
|
|
80
|
+
summary: extractText(json) || "Task completed"
|
|
81
|
+
});
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async listModels() {
|
|
86
|
+
return [];
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
var opencodeDriverTarget = {
|
|
90
|
+
id: "opencode",
|
|
91
|
+
displayName: BUILTIN_DRIVER_CATALOG.opencode?.name ?? "OpenCode",
|
|
92
|
+
apiVersion: 1,
|
|
93
|
+
configSchema: z.custom(() => true),
|
|
94
|
+
create: async (config, _ctx) => new OpenCodeDriver(config)
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export { OpenCodeDriver, opencodeDriverTarget };
|
|
98
|
+
//# sourceMappingURL=opencode.js.map
|
|
99
|
+
//# sourceMappingURL=opencode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../bridge/src/drivers/opencode.ts"],"names":[],"mappings":"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","file":"opencode.js","sourcesContent":["import type { DriverTarget } from \"@skaile/workspaces/plugin-registry\";\nimport type { Logger } from \"@skaile/workspaces/types\";\nimport * as z from \"zod\";\nimport { getBridgeLogger } from \"../logger.js\";\nimport type { ModelEntry } from \"../models.js\";\nimport { BUILTIN_DRIVER_CATALOG } from \"../registry.js\";\nimport type { AgentConfig, DriverInfo } from \"../types.js\";\nimport {\n extractCost,\n extractText,\n extractTokens,\n mapApiKeysToEnv,\n SubprocessCliDriver,\n} from \"./_subprocess-cli.js\";\n\n/**\n * Agent driver for **OpenCode** (`opencode`), the model-agnostic open-source\n * coding agent.\n *\n * Spawns `opencode run \"<prompt>\" --format json` per turn and maps OpenCode's\n * JSON event stream to the unified {@link AgentEvent} stream. Model-agnostic:\n * the model is passed as `provider/model` via `-m`, and provider API keys are\n * forwarded through the environment.\n *\n * @remarks\n * - The prompt is a **positional argument** — OpenCode's `-p` flag is a\n * basic-auth password, not the prompt.\n * - Session resume via `-s <id>`; the session id is captured from the run's\n * session event and emitted as `session_info`.\n * - OpenCode's `run --format json` event field names are not fully pinned\n * upstream; {@link handleJson} reads them defensively.\n *\n * @see https://github.com/sst/opencode\n * @docLink packages/bridge/drivers#opencode-driver\n */\nexport class OpenCodeDriver extends SubprocessCliDriver {\n readonly driverInfo: DriverInfo = {\n id: \"opencode\",\n name: \"OpenCode\",\n modelAgnostic: true,\n supportsInBandAbort: false,\n };\n\n protected readonly log: Logger = getBridgeLogger(\"opencode\");\n protected readonly defaultBin = \"opencode\";\n protected readonly productName = \"OpenCode\";\n protected readonly envPrefix = \"OPENCODE\";\n\n protected buildArgs(message: string, resumeId: string | undefined): string[] {\n const args = [\"run\", message, \"--format\", \"json\"];\n const model =\n this.config.provider && this.config.model\n ? `${this.config.provider}/${this.config.model}`\n : this.config.model;\n if (model) args.push(\"-m\", model);\n if (resumeId) args.push(\"-s\", resumeId);\n return args;\n }\n\n protected buildEnv(): Record<string, string> {\n const env = this.baseEnv([\n \"ANTHROPIC_API_KEY\",\n \"OPENAI_API_KEY\",\n \"GEMINI_API_KEY\",\n \"OPENROUTER_API_KEY\",\n \"GROQ_API_KEY\",\n ]);\n return { ...env, ...mapApiKeysToEnv(this.config.apiKeys) };\n }\n\n protected installHint(): string {\n return \"OpenCode is not installed or not on your PATH. Install it with `npm i -g opencode-ai`.\";\n }\n\n protected handleJson(json: any): void {\n switch (json?.type) {\n case \"session\":\n case \"session.start\":\n case \"init\":\n this.captureSession(json.id ?? json.sessionId ?? json.session?.id);\n break;\n\n case \"message\":\n case \"message.part\":\n case \"part\": {\n const role = json.role ?? json.message?.role ?? \"assistant\";\n if (role !== \"assistant\") break;\n const text = extractText(json);\n if (json.done === true || json.final === true) this.pushAssistantEnd(text);\n else this.pushAssistantDelta(text);\n break;\n }\n\n case \"tool\":\n case \"tool_use\":\n case \"tool.start\":\n this.pushToolCall(json.name ?? json.tool ?? \"tool\", json.input ?? json.args ?? {});\n break;\n\n case \"tool_result\":\n case \"tool.end\":\n this.pushToolResult(\n json.name ?? json.tool ?? \"tool\",\n json.result ?? json.output ?? json.content,\n Boolean(json.is_error ?? json.error),\n );\n break;\n\n case \"error\":\n this.pushError(this.classifyMessage(String(json.message ?? json.error ?? \"error\")));\n break;\n\n case \"result\":\n case \"done\":\n case \"finish\":\n this.captureSession(json.sessionId ?? json.session_id);\n this.pushResult({\n tokens: extractTokens(json),\n costUsd: extractCost(json),\n summary: extractText(json) || \"Task completed\",\n });\n break;\n }\n }\n\n override async listModels(): Promise<ModelEntry[]> {\n return [];\n }\n}\n\n/**\n * `DriverTarget` wrapper for the opencode driver. Registered into the plugin\n * registry by `registerBuiltinDrivers()`.\n */\nexport const opencodeDriverTarget: DriverTarget<AgentConfig> = {\n id: \"opencode\",\n displayName: BUILTIN_DRIVER_CATALOG.opencode?.name ?? \"OpenCode\",\n apiVersion: 1,\n configSchema: z.custom<AgentConfig>(() => true),\n create: async (config, _ctx) => new OpenCodeDriver(config),\n};\n"]}
|