@owlmeans/viable-sdk 0.1.18-rc.44 → 0.1.18-rc.46
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/README.md +3 -3
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/viable-sdk/SKILL.md +37 -37
- package/build/api/index.d.ts +2 -0
- package/build/api/index.d.ts.map +1 -1
- package/build/api/index.js +1 -0
- package/build/api/index.js.map +1 -1
- package/build/api/remote.d.ts +0 -10
- package/build/api/remote.d.ts.map +1 -1
- package/build/api/remote.js +2 -37
- package/build/api/remote.js.map +1 -1
- package/build/api/transport/types.d.ts +14 -0
- package/build/api/transport/types.d.ts.map +1 -0
- package/build/api/transport/types.js +2 -0
- package/build/api/transport/types.js.map +1 -0
- package/build/api/transport.d.ts +4 -0
- package/build/api/transport.d.ts.map +1 -0
- package/build/api/transport.js +32 -0
- package/build/api/transport.js.map +1 -0
- package/build/executor/boot-check.js +10 -10
- package/build/executor/boot-check.js.map +1 -1
- package/build/executor/consts.local.d.ts +3 -0
- package/build/executor/consts.local.d.ts.map +1 -1
- package/build/executor/consts.local.js +4 -1
- package/build/executor/consts.local.js.map +1 -1
- package/build/executor/env/types.d.ts +40 -0
- package/build/executor/env/types.d.ts.map +1 -0
- package/build/executor/env/types.js +2 -0
- package/build/executor/env/types.js.map +1 -0
- package/build/executor/env.d.ts +2 -24
- package/build/executor/env.d.ts.map +1 -1
- package/build/executor/env.js +36 -54
- package/build/executor/env.js.map +1 -1
- package/build/executor/errors.js +2 -2
- package/build/executor/errors.js.map +1 -1
- package/build/executor/files/types.d.ts +106 -0
- package/build/executor/files/types.d.ts.map +1 -0
- package/build/executor/files/types.js +2 -0
- package/build/executor/files/types.js.map +1 -0
- package/build/executor/files.d.ts +2 -98
- package/build/executor/files.d.ts.map +1 -1
- package/build/executor/files.js +54 -123
- package/build/executor/files.js.map +1 -1
- package/build/executor/git/types.d.ts +19 -0
- package/build/executor/git/types.d.ts.map +1 -0
- package/build/executor/git/types.js +2 -0
- package/build/executor/git/types.js.map +1 -0
- package/build/executor/git.d.ts +4 -17
- package/build/executor/git.d.ts.map +1 -1
- package/build/executor/git.js +204 -199
- package/build/executor/git.js.map +1 -1
- package/build/executor/glob/types.d.ts +12 -0
- package/build/executor/glob/types.d.ts.map +1 -0
- package/build/executor/glob/types.js +2 -0
- package/build/executor/glob/types.js.map +1 -0
- package/build/executor/glob.d.ts +3 -16
- package/build/executor/glob.d.ts.map +1 -1
- package/build/executor/glob.js +7 -12
- package/build/executor/glob.js.map +1 -1
- package/build/executor/health/types.d.ts +39 -0
- package/build/executor/health/types.d.ts.map +1 -0
- package/build/executor/health/types.js +2 -0
- package/build/executor/health/types.js.map +1 -0
- package/build/executor/health.d.ts +8 -25
- package/build/executor/health.d.ts.map +1 -1
- package/build/executor/health.js +70 -91
- package/build/executor/health.js.map +1 -1
- package/build/executor/index.d.ts +9 -1
- package/build/executor/index.d.ts.map +1 -1
- package/build/executor/index.js +20 -20
- package/build/executor/index.js.map +1 -1
- package/build/executor/integrity/types.d.ts +25 -0
- package/build/executor/integrity/types.d.ts.map +1 -0
- package/build/executor/integrity/types.js +2 -0
- package/build/executor/integrity/types.js.map +1 -0
- package/build/executor/integrity.d.ts +5 -15
- package/build/executor/integrity.d.ts.map +1 -1
- package/build/executor/integrity.js +27 -30
- package/build/executor/integrity.js.map +1 -1
- package/build/executor/layout/types.d.ts +69 -0
- package/build/executor/layout/types.d.ts.map +1 -0
- package/build/executor/layout/types.js +2 -0
- package/build/executor/layout/types.js.map +1 -0
- package/build/executor/layout.d.ts +9 -56
- package/build/executor/layout.d.ts.map +1 -1
- package/build/executor/layout.js +35 -82
- package/build/executor/layout.js.map +1 -1
- package/build/executor/shell/types.d.ts +75 -0
- package/build/executor/shell/types.d.ts.map +1 -0
- package/build/executor/shell/types.js +2 -0
- package/build/executor/shell/types.js.map +1 -0
- package/build/executor/shell.d.ts +4 -67
- package/build/executor/shell.d.ts.map +1 -1
- package/build/executor/shell.js +34 -77
- package/build/executor/shell.js.map +1 -1
- package/build/executor/spawn/types.d.ts +98 -0
- package/build/executor/spawn/types.d.ts.map +1 -0
- package/build/executor/spawn/types.js +2 -0
- package/build/executor/spawn/types.js.map +1 -0
- package/build/executor/spawn.d.ts +3 -88
- package/build/executor/spawn.d.ts.map +1 -1
- package/build/executor/spawn.js +190 -257
- package/build/executor/spawn.js.map +1 -1
- package/build/executor/types.d.ts +1 -5
- package/build/executor/types.d.ts.map +1 -1
- package/build/harness/consts.local.d.ts +16 -1
- package/build/harness/consts.local.d.ts.map +1 -1
- package/build/harness/consts.local.js +17 -1
- package/build/harness/consts.local.js.map +1 -1
- package/build/harness/helper.d.ts +4 -0
- package/build/harness/helper.d.ts.map +1 -0
- package/build/harness/helper.js +71 -0
- package/build/harness/helper.js.map +1 -0
- package/build/harness/index.d.ts +2 -18
- package/build/harness/index.d.ts.map +1 -1
- package/build/harness/index.js +2 -80
- package/build/harness/index.js.map +1 -1
- package/build/harness/templates.d.ts.map +1 -1
- package/build/harness/templates.js +2 -17
- package/build/harness/templates.js.map +1 -1
- package/build/harness/types.d.ts +18 -0
- package/build/harness/types.d.ts.map +1 -1
- package/build/index.d.ts +9 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +3 -0
- package/build/index.js.map +1 -1
- package/build/project/dotenv/types.d.ts +39 -0
- package/build/project/dotenv/types.d.ts.map +1 -0
- package/build/project/dotenv/types.js +2 -0
- package/build/project/dotenv/types.js.map +1 -0
- package/build/project/dotenv.d.ts +4 -0
- package/build/project/dotenv.d.ts.map +1 -0
- package/build/project/dotenv.js +56 -0
- package/build/project/dotenv.js.map +1 -0
- package/build/project/env/types.d.ts +40 -0
- package/build/project/env/types.d.ts.map +1 -0
- package/build/project/env/types.js +2 -0
- package/build/project/env/types.js.map +1 -0
- package/build/project/env.d.ts +2 -77
- package/build/project/env.d.ts.map +1 -1
- package/build/project/env.js +62 -197
- package/build/project/env.js.map +1 -1
- package/build/project/marker/types.d.ts +33 -0
- package/build/project/marker/types.d.ts.map +1 -0
- package/build/project/marker/types.js +2 -0
- package/build/project/marker/types.js.map +1 -0
- package/build/project/marker.d.ts +3 -20
- package/build/project/marker.d.ts.map +1 -1
- package/build/project/marker.js +36 -46
- package/build/project/marker.js.map +1 -1
- package/build/project/probe/types.d.ts +22 -0
- package/build/project/probe/types.d.ts.map +1 -0
- package/build/project/probe/types.js +2 -0
- package/build/project/probe/types.js.map +1 -0
- package/build/project/probe.d.ts +4 -0
- package/build/project/probe.d.ts.map +1 -0
- package/build/project/probe.js +39 -0
- package/build/project/probe.js.map +1 -0
- package/build/project/report/types.d.ts +18 -0
- package/build/project/report/types.d.ts.map +1 -0
- package/build/project/report/types.js +2 -0
- package/build/project/report/types.js.map +1 -0
- package/build/project/report.d.ts +7 -0
- package/build/project/report.d.ts.map +1 -0
- package/build/project/report.js +68 -0
- package/build/project/report.js.map +1 -0
- package/build/project/setup/types.d.ts +32 -0
- package/build/project/setup/types.d.ts.map +1 -0
- package/build/project/setup/types.js +2 -0
- package/build/project/setup/types.js.map +1 -0
- package/build/project/setup.d.ts +3 -29
- package/build/project/setup.d.ts.map +1 -1
- package/build/project/setup.js +102 -175
- package/build/project/setup.js.map +1 -1
- package/build/run/index.d.ts +9 -23
- package/build/run/index.d.ts.map +1 -1
- package/build/run/index.js +9 -147
- package/build/run/index.js.map +1 -1
- package/build/run/local/types.d.ts +39 -0
- package/build/run/local/types.d.ts.map +1 -0
- package/build/run/local/types.js +2 -0
- package/build/run/local/types.js.map +1 -0
- package/build/run/local.d.ts +3 -0
- package/build/run/local.d.ts.map +1 -0
- package/build/run/local.js +130 -0
- package/build/run/local.js.map +1 -0
- package/build/run/process/types.d.ts +15 -0
- package/build/run/process/types.d.ts.map +1 -0
- package/build/run/process/types.js +2 -0
- package/build/run/process/types.js.map +1 -0
- package/build/run/process.d.ts +4 -0
- package/build/run/process.d.ts.map +1 -0
- package/build/run/process.js +20 -0
- package/build/run/process.js.map +1 -0
- package/build/run/state/types.d.ts +35 -0
- package/build/run/state/types.d.ts.map +1 -0
- package/build/run/state/types.js +2 -0
- package/build/run/state/types.js.map +1 -0
- package/build/run/state.d.ts +10 -37
- package/build/run/state.d.ts.map +1 -1
- package/build/run/state.js +89 -127
- package/build/run/state.js.map +1 -1
- package/build/run/types.d.ts +1 -1
- package/build/session/index.d.ts.map +1 -1
- package/build/session/index.js +6 -5
- package/build/session/index.js.map +1 -1
- package/build/task/envelope/types.d.ts +29 -0
- package/build/task/envelope/types.d.ts.map +1 -0
- package/build/task/envelope/types.js +2 -0
- package/build/task/envelope/types.js.map +1 -0
- package/build/task/envelope.d.ts +3 -23
- package/build/task/envelope.d.ts.map +1 -1
- package/build/task/envelope.js +101 -117
- package/build/task/envelope.js.map +1 -1
- package/build/task/index.d.ts +2 -0
- package/build/task/index.d.ts.map +1 -1
- package/build/task/index.js.map +1 -1
- package/build/task/inquiry/types.d.ts +38 -0
- package/build/task/inquiry/types.d.ts.map +1 -0
- package/build/task/inquiry/types.js +2 -0
- package/build/task/inquiry/types.js.map +1 -0
- package/build/task/inquiry.d.ts +3 -32
- package/build/task/inquiry.d.ts.map +1 -1
- package/build/task/inquiry.js +118 -143
- package/build/task/inquiry.js.map +1 -1
- package/build/tools/catalogue/types.d.ts +8 -0
- package/build/tools/catalogue/types.d.ts.map +1 -0
- package/build/tools/catalogue/types.js +2 -0
- package/build/tools/catalogue/types.js.map +1 -0
- package/build/tools/catalogue.d.ts +5 -3
- package/build/tools/catalogue.d.ts.map +1 -1
- package/build/tools/catalogue.js +112 -105
- package/build/tools/catalogue.js.map +1 -1
- package/build/tools/host/types.d.ts +37 -0
- package/build/tools/host/types.d.ts.map +1 -0
- package/build/tools/host/types.js +2 -0
- package/build/tools/host/types.js.map +1 -0
- package/build/tools/host.d.ts +4 -0
- package/build/tools/host.d.ts.map +1 -0
- package/build/tools/host.js +13 -0
- package/build/tools/host.js.map +1 -0
- package/build/tools/index.d.ts +7 -1
- package/build/tools/index.d.ts.map +1 -1
- package/build/tools/index.js +1 -1
- package/build/tools/index.js.map +1 -1
- package/build/tools/kits/types.d.ts +12 -0
- package/build/tools/kits/types.d.ts.map +1 -0
- package/build/tools/kits/types.js +2 -0
- package/build/tools/kits/types.js.map +1 -0
- package/build/tools/kits.d.ts +3 -3
- package/build/tools/kits.d.ts.map +1 -1
- package/build/tools/kits.js +30 -26
- package/build/tools/kits.js.map +1 -1
- package/build/tools/mcp.js +10 -10
- package/build/tools/mcp.js.map +1 -1
- package/build/tools/platform.js +2 -2
- package/build/tools/platform.js.map +1 -1
- package/build/tools/refusal/types.d.ts +82 -0
- package/build/tools/refusal/types.d.ts.map +1 -0
- package/build/tools/refusal/types.js +2 -0
- package/build/tools/refusal/types.js.map +1 -0
- package/build/tools/refusal.d.ts +3 -78
- package/build/tools/refusal.d.ts.map +1 -1
- package/build/tools/refusal.js +518 -580
- package/build/tools/refusal.js.map +1 -1
- package/build/tools/settings/types.d.ts +32 -0
- package/build/tools/settings/types.d.ts.map +1 -0
- package/build/tools/settings/types.js +2 -0
- package/build/tools/settings/types.js.map +1 -0
- package/build/tools/settings.d.ts +3 -28
- package/build/tools/settings.d.ts.map +1 -1
- package/build/tools/settings.js +40 -58
- package/build/tools/settings.js.map +1 -1
- package/build/tools/status/types.d.ts +14 -0
- package/build/tools/status/types.d.ts.map +1 -0
- package/build/tools/status/types.js +2 -0
- package/build/tools/status/types.js.map +1 -0
- package/build/tools/status.d.ts +3 -6
- package/build/tools/status.d.ts.map +1 -1
- package/build/tools/status.js +105 -101
- package/build/tools/status.js.map +1 -1
- package/build/tools/stories/types.d.ts +32 -0
- package/build/tools/stories/types.d.ts.map +1 -0
- package/build/tools/stories/types.js +2 -0
- package/build/tools/stories/types.js.map +1 -0
- package/build/tools/stories.d.ts +6 -27
- package/build/tools/stories.d.ts.map +1 -1
- package/build/tools/stories.js +56 -71
- package/build/tools/stories.js.map +1 -1
- package/package.json +19 -19
- package/build/tools/utils.d.ts +0 -31
- package/build/tools/utils.d.ts.map +0 -1
- package/build/tools/utils.js +0 -31
- package/build/tools/utils.js.map +0 -1
package/README.md
CHANGED
|
@@ -63,7 +63,7 @@ answers them, model tasks queue for the parent agent.
|
|
|
63
63
|
sixty. Anything that takes minutes is a JOB: it returns at once and is polled. A tool that blocked
|
|
64
64
|
would be reported to the user as a hung server rather than as a slow platform.
|
|
65
65
|
|
|
66
|
-
**A tool that cannot work in a mode is hidden, not failing.** `visibleTools(host)` is the whole
|
|
66
|
+
**A tool that cannot work in a mode is hidden, not failing.** `catalogueHelper.visibleTools(host)` is the whole
|
|
67
67
|
catalogue a parent sees, and it is exactly the set of things that work for it. A tool offered and
|
|
68
68
|
then refused is one an agent tries once and remembers as broken.
|
|
69
69
|
|
|
@@ -75,7 +75,7 @@ throughput problem, it is a corrupted tree.
|
|
|
75
75
|
answer is handed everything still outstanding, including what it had already answered. Re-running a build
|
|
76
76
|
because an acknowledgement was lost is exactly the cost that cache avoids.
|
|
77
77
|
|
|
78
|
-
**A malformed model-task answer is refused locally.** `parseTaskResult` checks the answer against
|
|
78
|
+
**A malformed model-task answer is refused locally.** `makeTaskEnvelopeModel(task).parseTaskResult` checks the answer against
|
|
79
79
|
the task before the platform ever sees it — with the subagent's context still open, so the parent
|
|
80
80
|
can retry immediately. A malformed answer that reached the platform would cost a whole new task, a
|
|
81
81
|
new subagent and another wait.
|
|
@@ -96,7 +96,7 @@ This package ships embedded agent skills under `agent-meta/`. After installing y
|
|
|
96
96
|
your project's skill store (`.agents/skills/`):
|
|
97
97
|
|
|
98
98
|
```sh
|
|
99
|
-
npx @owlmeans/agent-skills@^0.1.18-rc.
|
|
99
|
+
npx @owlmeans/agent-skills@^0.1.18-rc.51
|
|
100
100
|
```
|
|
101
101
|
|
|
102
102
|
The embedded files are version-matched to this package release. Do not edit them
|
package/agent-meta/manifest.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
3
|
"package": "@owlmeans/viable-sdk",
|
|
4
|
-
"version": "0.1.18-rc.
|
|
5
|
-
"generatedAt": "2026-10-
|
|
4
|
+
"version": "0.1.18-rc.46",
|
|
5
|
+
"generatedAt": "2026-10-06T11:45:57.653Z",
|
|
6
6
|
"canonicalRepo": "https://github.com/owlmeans/common",
|
|
7
7
|
"entries": [
|
|
8
8
|
{
|
|
@@ -8,7 +8,7 @@ user-invocable: false
|
|
|
8
8
|
# @owlmeans/viable-sdk
|
|
9
9
|
|
|
10
10
|
**Layer:** Tooling (Node/Bun; not a browser or React package)
|
|
11
|
-
**Install:** `"@owlmeans/viable-sdk": "^0.1.18-rc.
|
|
11
|
+
**Install:** `"@owlmeans/viable-sdk": "^0.1.18-rc.46"` in `dependencies`
|
|
12
12
|
**Subpaths:** `.` · `./executor` · `./run` · `./tools` · `./task` · `./harness`
|
|
13
13
|
**Contracts:** `@owlmeans/viable-common` (`./connect`, `./slot`, `./integrity`, and the planning
|
|
14
14
|
vocabulary — story type and story flow) and `@owlmeans/planning` (the planning protocol tree
|
|
@@ -27,18 +27,18 @@ machine, deliver its model calls to the parent agent, and run the generated appl
|
|
|
27
27
|
| `makeSdkContext({ apiUrl, token, service?, onRejected? })` | A client context authenticated by one token — a literal or a thunk — with the connector protocols and the planning tree bound and the planning client registered |
|
|
28
28
|
| `makeRemoteConnectorApi(context)` | `ConnectorApi` over HTTP; its `planning` is the context's planning client facade |
|
|
29
29
|
| `openSession(opts)` → `SessionRuntime` | One attached session: the operation loop, the task queue, `stats` |
|
|
30
|
-
| `
|
|
30
|
+
| `makeTaskEnvelopeModel(task)` — `.renderTaskEnvelope({ harness })` · `.parseTaskResult(raw)` | What the parent agent is told; what its answer is checked against |
|
|
31
31
|
| `makeModelTaskDriver({ models })` · `TaskDriver` | A reference parent agent backed by a chat model (tests, CLIs) |
|
|
32
|
-
| `installHarness(dir, harness, opts?)` ·
|
|
33
|
-
| `catalogue` · `visibleTools(host)` ·
|
|
34
|
-
| `renderProjectStatus`,
|
|
35
|
-
| `resolveStory(deps, projectId, ref)` ·
|
|
36
|
-
| `PROJECT_SETTINGS` · `projectSettingOf(key)` ·
|
|
32
|
+
| `harnessHelper` — `.installHarness(dir, harness, opts?)` · `.describeHarness(harness)`; `WORKING_RULE` | Set a coding agent up; preview it first |
|
|
33
|
+
| `catalogue` · `catalogueHelper` (`.visibleTools(host)` · `.toolByName`) · `registerCatalogue(server, deps)` · `serverInstructions({ host })` | The tools and how they reach an MCP server |
|
|
34
|
+
| `statusTextHelper` — `.renderProjectStatus`, `.renderStoryStatus(status, { landing? })`, `.renderPipelineStatus`, `.conversionNext` | Domain status as concise lines ending in the next valid action |
|
|
35
|
+
| `storyHelper` — `.resolveStory(deps, projectId, ref)` · `.storyQuery(projectId, filter?)` · `.renderStories(items, page, total)` · `.isLandingStory(card)`; `STORY_ORDER` · `LANDING_MARK` · `LANDING_NOTE` | The story tools' reading of planning cards |
|
|
36
|
+
| `PROJECT_SETTINGS` · `settingsHelper` — `.projectSettingOf(key)` · `.settingsPatch(args)` · `.renderProjectSettings(projectId, settings)` · `.settingsReach(target)` | The project-settings tools: each setting's label and rule, the patch a call asks for, the rendering |
|
|
37
37
|
| `PLATFORM_CATALOGUE` (`pipelines`, `features`, `capabilities`) · `renderPlatform(catalogue, host)` · `GENERATED_SUMMARY` | What `describe_platform` renders, and the one-sentence product summary `describe_capabilities` ends with |
|
|
38
|
-
| `ToolHostKind` (`Stdio`/`Http`) · `ToolHost` · `ToolDeps` · `anyHost`/`localTarget`/`cloudTarget`/`withExecutor`/`delegatedLlm`/`sessionCapable`/`performsModelTasks` | The host description and the availability predicates |
|
|
39
|
-
| `./executor`: `makeLocalSlotExecutor(dir, opts?)`, `createLocalFileHelper`, `createLocalShellHelper`, `dispatchGitCommand`, `verifyTarget`/`forgetIntegrity
|
|
40
|
-
| `./run`: `runLocal`, `stopLocal`, `localStatus
|
|
41
|
-
| `readMarker`/`writeMarker`/`discoverProject`/`isViableTree` · `readEnv`/`writeEnv`/`envStatus
|
|
38
|
+
| `ToolHostKind` (`Stdio`/`Http`) · `ToolHost` · `ToolDeps` · `toolHostHelper` (`anyHost`/`localTarget`/`cloudTarget`/`withExecutor`/`delegatedLlm`/`sessionCapable`/`performsModelTasks`) | The host description and the availability predicates |
|
|
39
|
+
| `./executor`: `makeLocalSlotExecutor(dir, opts?)`, `createLocalFileHelper`, `createLocalShellHelper`, `makeLocalGitHelper(dir).dispatchGitCommand`, `integrityHelper` (`verifyTarget`/`forgetIntegrity`), `makeLayoutHelper(dir)` (`targetPaths`/`apiPath`/`webPath`/`workerPath`), `makeTargetEnvHelper(dir)` (`backendEnv`/`frontendEnv`), `healthHelper` (`classifyTargetHealth`/`readTargetHealth`), `runBootCheck`, `confineToProject`, `spawnHelper` | The publisher's workload, on somebody's laptop |
|
|
40
|
+
| `./run`: `makeLocalRunHelper(dir)` (`runLocal`, `stopLocal`, `localStatus`), `createLocalServer`, `makeRunStateHelper(dir)` (`startApi`/`startWorker`/`restartApi`, `readRun`/`writeRun`/`clearRun`), `runProcessHelper.stopProcess` | Building and running the generated app locally |
|
|
41
|
+
| `makeMarkerHelper(dir)` (`readMarker`/`writeMarker`/`discoverProject`/`isViableTree`) · `makeProjectEnvHelper(dir)` (`readEnv`/`writeEnv`/`envStatus`) · `dotenvHelper.replaceManagedBlock` | The `.viable/connect.json` marker and the managed `.env` block |
|
|
42
42
|
| `SdkError`, `SdkAuthError`, `SdkMisconfigured`, `SdkUnsupported` | Registered `ResilientError` classes |
|
|
43
43
|
| `ENV_TOKEN`, `ENV_API_URL`, `ENV_MCP_URL`, `ENV_TARGET`, `ENV_LLM`, `ENV_HARNESS`, `ENV_PROJECT_DIR` · `DEFAULT_MCP_URL` · `resolveMcpUrl(values)` · `TOOL_DEADLINE_MS` (45 s) · `COMMIT_WAIT_MS` (20 s) · `COMMIT_POLL_SEC` · `STORY_PAGE_SIZE` · `NEXT_TASK_WAIT_MS` · `PULL_WAIT_MS` | Configuration and deadlines |
|
|
44
44
|
|
|
@@ -112,7 +112,7 @@ project's inference settings are not a connector call: a person sets them in the
|
|
|
112
112
|
the platform's own API. A member is added together with the route in `connectProtocols` and its
|
|
113
113
|
`connectRef` entry — never one without the others.
|
|
114
114
|
|
|
115
|
-
## A SESSION belongs to a host that stays; `sessionCapable` is what says so
|
|
115
|
+
## A SESSION belongs to a host that stays; `toolHostHelper.sessionCapable` is what says so
|
|
116
116
|
|
|
117
117
|
A session is a connector ATTACHED — a process that drains the project's operations and holds a model
|
|
118
118
|
task until its answer comes back. The URL-configured host answers one request and forgets, so
|
|
@@ -122,7 +122,7 @@ legitimately holding it**, and be abandoned before the first operation was deliv
|
|
|
122
122
|
So `ensureSession` — what `confirm_project`, `reinitialize_project`, `develop_story`,
|
|
123
123
|
`modify_project` and `resume_pipeline` call before returning their job, and `apply_planning_kit`
|
|
124
124
|
before its write — opens one only on a
|
|
125
|
-
`sessionCapable` host, and `next_task`/`submit_task_result` are available on
|
|
125
|
+
`toolHostHelper.sessionCapable` host, and `next_task`/`submit_task_result` are available on `.performsModelTasks`
|
|
126
126
|
(delegated **and** session-capable) rather than on the account setting alone. `serverInstructions`
|
|
127
127
|
reads the same predicate: a parent told to call `next_task` when the tool is not in its list is a
|
|
128
128
|
parent that waits for a run nobody will advance. A host that cannot serve the delegated mode says so
|
|
@@ -134,9 +134,9 @@ leaves the reader with nothing to do about it.
|
|
|
134
134
|
|
|
135
135
|
## A tool that cannot work in a mode is HIDDEN, not failing
|
|
136
136
|
|
|
137
|
-
`ToolDefinition.availability` and `visibleTools(host)` decide the catalogue a parent actually sees. A
|
|
137
|
+
`ToolDefinition.availability` and `catalogueHelper.visibleTools(host)` decide the catalogue a parent actually sees. A
|
|
138
138
|
tool a host cannot serve is a tool the parent tries once, is refused, and remembers as broken — so
|
|
139
|
-
the list it reads is exactly the set of things that work for it. Predicates: `anyHost`,
|
|
139
|
+
the list it reads is exactly the set of things that work for it. Predicates (`toolHostHelper`): `anyHost`,
|
|
140
140
|
`localTarget`, `cloudTarget`, `withExecutor`, `delegatedLlm`.
|
|
141
141
|
|
|
142
142
|
## 45 seconds is the ceiling, so long operations return domain status
|
|
@@ -163,13 +163,13 @@ platform's in-process host. The scope a call answers for is the CREDENTIAL's; a
|
|
|
163
163
|
|
|
164
164
|
| Tool | Facade call |
|
|
165
165
|
|---|---|
|
|
166
|
-
| `list_stories` | `cards.list({ ...storyQuery(project, { status, area }), page, size, sort: STORY_ORDER })` → `renderStories` |
|
|
166
|
+
| `list_stories` | `cards.list({ ...storyHelper.storyQuery(project, { status, area }), page, size, sort: STORY_ORDER })` → `storyHelper.renderStories` |
|
|
167
167
|
| `search_stories` | the same with `{ q }` |
|
|
168
168
|
| `create_story` | `execute({ action: create, card: { kind: card, type: VIABLE_STORY_TYPE, parent, title, fields: { primary: false } } }, { wait: true, timeout: COMMIT_WAIT_MS })` |
|
|
169
|
-
| `update_story` | `resolveStory` → `execute({ card, action: update, changes: { title }, expectSeq: head ?? seq }, { wait: true, … })` |
|
|
170
|
-
| `delete_story` | `resolveStory` → `execute({ card, action: delete }, { wait: true, … })` → the project-lock poll |
|
|
171
|
-
| `develop_story` | `resolveStory` → `execute({ card, action: transit, transition: start }, { wait: true, … })`, tolerating `CommitTimeout` → `story.status(project, card.id)` |
|
|
172
|
-
| `story_status` | `resolveStory` → the card, its development run, pending inquiry, warning and landing mark |
|
|
169
|
+
| `update_story` | `storyHelper.resolveStory` → `execute({ card, action: update, changes: { title }, expectSeq: head ?? seq }, { wait: true, … })` |
|
|
170
|
+
| `delete_story` | `storyHelper.resolveStory` → `execute({ card, action: delete }, { wait: true, … })` → the project-lock poll |
|
|
171
|
+
| `develop_story` | `storyHelper.resolveStory` → `execute({ card, action: transit, transition: start }, { wait: true, … })`, tolerating `CommitTimeout` → `story.status(project, card.id)` |
|
|
172
|
+
| `story_status` | `storyHelper.resolveStory` → the card, its development run, pending inquiry, warning and landing mark |
|
|
173
173
|
|
|
174
174
|
Rules the table rests on:
|
|
175
175
|
|
|
@@ -178,7 +178,7 @@ Rules the table rests on:
|
|
|
178
178
|
on `confirm_project`, the project status line and the design-system section of `project_status`),
|
|
179
179
|
never substituted.
|
|
180
180
|
- **`storyId` accepts a code or an id**, because `list_stories` prints the CODE — the handle every
|
|
181
|
-
generated file names a story by. `resolveStory` asks for both at once, the id wins, a code is also
|
|
181
|
+
generated file names a story by. `storyHelper.resolveStory` asks for both at once, the id wins, a code is also
|
|
182
182
|
tried uppercased, and neither answers for a story of another project (`ProjectStoryNotFound`).
|
|
183
183
|
- **Development is the story's `start`, not a call of its own.** The platform begins the run once that
|
|
184
184
|
move COMMITS, and refuses it there too (the flow, one story in progress, the balance). The wait is
|
|
@@ -192,13 +192,13 @@ Rules the table rests on:
|
|
|
192
192
|
placeholder screens still being retired under the project lock, so `delete_story` keeps its two
|
|
193
193
|
unlocked observations.
|
|
194
194
|
- **Stories are read in `order`, then `createdAt`**: `order` is the analysis's flow ordinal (a
|
|
195
|
-
connective story sits at a fraction between two steps). `renderStories` keeps the line shape a parent
|
|
195
|
+
connective story sits at a fraction between two steps). `storyHelper.renderStories` keeps the line shape a parent
|
|
196
196
|
already reads — `code · status[ · primary][ · landing gate][ · area]` over the narrative — under a
|
|
197
197
|
header counting the page by intrinsic state. A new fact is a new FLAG beside `primary`; the area
|
|
198
198
|
stays last.
|
|
199
199
|
- **The landing gate story is read off the card the tool already holds** (`fields.landing`, at most
|
|
200
200
|
one per project, decided by the platform at initialization — a connector never sets it). The list
|
|
201
|
-
flags it; `story_status` and `develop_story` pass the resolved card to `renderStoryStatus`, which
|
|
201
|
+
flags it; `story_status` and `develop_story` pass the resolved card to `statusTextHelper.renderStoryStatus`, which
|
|
202
202
|
adds `LANDING_NOTE` under the status line, and their structured result gains `landing: true`. No
|
|
203
203
|
second call and no change to `connect.story.status`: that route carries the run, not the card's
|
|
204
204
|
fields. It is said because developing that story also replaces the guest-home sketch with the real
|
|
@@ -221,11 +221,11 @@ tag — through `ConnectorApi.projectBranding(projectId)` and
|
|
|
221
221
|
`saveProjectBranding(projectId, patch)` (`connect.project.branding.get` / `.save`,
|
|
222
222
|
`ConnectProjectBranding` / `ConnectProjectBrandingSave` from `@owlmeans/viable-common`).
|
|
223
223
|
|
|
224
|
-
- **A save is a PATCH.** `settingsPatch` keeps exactly the settings the call named, trimmed; an
|
|
224
|
+
- **A save is a PATCH.** `settingsHelper.settingsPatch` keeps exactly the settings the call named, trimmed; an
|
|
225
225
|
omitted one keeps its stored value, and an EMPTY string is sent as given — for the Google tag that
|
|
226
226
|
is the removal, for the others a value the platform refuses. A call naming none is refused locally
|
|
227
227
|
and saves nothing. The answer is the merged record the platform stored, led by where the change
|
|
228
|
-
shows (`settingsReach`): a cloud preview is rebuilt, production takes it at the next Publish; a
|
|
228
|
+
shows (`settingsHelper.settingsReach`): a cloud preview is rebuilt, production takes it at the next Publish; a
|
|
229
229
|
local project gets it in its `.env` and `run_local` builds with it.
|
|
230
230
|
- **The connector states the rules and checks none of them.** `PROJECT_SETTINGS[].rule` is the web
|
|
231
231
|
save's validation in words — never-empty copyright and organization; an `https://` address without
|
|
@@ -271,7 +271,7 @@ a run can stop at (`landing` and `legal` in init, `landing` in story development
|
|
|
271
271
|
|
|
272
272
|
## A balance, consent or confirmation refusal is phrased for a person, and pushed through `notify`
|
|
273
273
|
|
|
274
|
-
`personRefusalPhrase(e, retry?)` (`tools/refusal.ts`) phrases the three refusals only a PERSON can
|
|
274
|
+
`refusalHelper.personRefusalPhrase(e, retry?)` (`tools/refusal.ts`) phrases the three refusals only a PERSON can
|
|
275
275
|
resolve (`@owlmeans/viable-common` `connect/errors.ts`), by `instanceof`, and answers `null` for
|
|
276
276
|
anything else. Both `registerCatalogue`'s catch and the conversion tools' `answering` use it, so a
|
|
277
277
|
conversion's balance refusal reads exactly like any other tool's:
|
|
@@ -281,10 +281,10 @@ conversion's balance refusal reads exactly like any other tool's:
|
|
|
281
281
|
- `ConnectConsentRequired` — the EU spend consent: "Nothing was started", why (credits bought less
|
|
282
282
|
than 14 days ago may only be used once a person expressly asks, the purchase still withdrawable up
|
|
283
283
|
to the last day), the `consentUrl` to open and confirm in the browser, and that the call must NOT
|
|
284
|
-
be retried automatically — only after the user says they confirmed (`consentRequiredPhrase(url,
|
|
284
|
+
be retried automatically — only after the user says they confirmed (`refusalHelper.consentRequiredPhrase(url,
|
|
285
285
|
deadline)`, shared with the stored-text entry below).
|
|
286
286
|
- `ConnectConfirmationRequired` — a conversion step that would use the plan's conversion or spend
|
|
287
|
-
credits (`confirmationRequiredPhrase(fields, retry?)`): "Nothing was started"; for a start, what the
|
|
287
|
+
credits (`refusalHelper.confirmationRequiredPhrase(fields, retry?)`): "Nothing was started"; for a start, what the
|
|
288
288
|
plan's conversion covers (free up to `cap` credits, the conversion limit; beyond it credit limits
|
|
289
289
|
first, then topped-up credits; every stage quoted and asked first); for a stage, its estimate
|
|
290
290
|
split ("580,000 from the conversion limit, 150,000 from the organization's credit limits, $2.40
|
|
@@ -298,7 +298,7 @@ internal HTTP hop) and are read back with `finalizeUnmarshal()`. All three are a
|
|
|
298
298
|
optional `ToolDeps.notify?('warning', text)`, which a host wires to its own out-of-band channel —
|
|
299
299
|
the stdio `viable-mcp` host sends an MCP `notifications/message`; the platform's stateless `/mcp`
|
|
300
300
|
host has no channel and omits it, so `notify` is always best-effort and optional. Every other
|
|
301
|
-
error returns through `refusalPhrase` and never calls `notify`.
|
|
301
|
+
error returns through `refusalHelper.refusalPhrase` and never calls `notify`.
|
|
302
302
|
|
|
303
303
|
**A conversion's confirmation is answered inside its tool, with the exact call to repeat**
|
|
304
304
|
(`confirming` in `catalogue.ts`): `convert_project` / `proceed_conversion` print
|
|
@@ -309,7 +309,7 @@ never repeated). Both take `confirm` (`z.boolean().default(false)`, described),
|
|
|
309
309
|
parent passed `true`, and their descriptions explain the conversion limit (1,000,000 credits today),
|
|
310
310
|
the spend order and that a delegated conversion is never asked — so a parent can say it before it is
|
|
311
311
|
refused. A production body carries only the status: a bare `api:client:status:428` to a call sent
|
|
312
|
-
WITHOUT `confirm` is answered with `unconfirmedConversionPhrase(retry)` (the confirmation, and the
|
|
312
|
+
WITHOUT `confirm` is answered with `refusalHelper.unconfirmedConversionPhrase(retry)` (the confirmation, and the
|
|
313
313
|
consent as what a second refusal of the confirmed call would mean); to a confirmed call it can only
|
|
314
314
|
be the consent and falls to `REFUSALS`. `serverInstructions` says the same in one sentence of the
|
|
315
315
|
workflow paragraph.
|
|
@@ -361,7 +361,7 @@ was wrong, and the story failed with `retry-exceeded` having never been told. `t
|
|
|
361
361
|
all three shapes and still throws for an answer carrying no call at all — an empty answer is a bad
|
|
362
362
|
answer, and the retry is the right response to it.
|
|
363
363
|
|
|
364
|
-
The same rule is why `parseTaskResult` refuses with a described reason rather than a stack trace:
|
|
364
|
+
The same rule is why `makeTaskEnvelopeModel(task).parseTaskResult` refuses with a described reason rather than a stack trace:
|
|
365
365
|
whatever comes back becomes a model's next prompt, so it has to be readable by one.
|
|
366
366
|
|
|
367
367
|
## A redelivered model task must NOT be handed over twice
|
|
@@ -399,7 +399,7 @@ conversation, then the requested result shape: the outer handoff instruction and
|
|
|
399
399
|
preserve the mode: a `text` task returns the requested source or text and never a JSON tool-call
|
|
400
400
|
array; that array belongs only to `tools` mode.
|
|
401
401
|
|
|
402
|
-
**`parseTaskResult` refuses a malformed answer locally**, and returns a `problem` rather than
|
|
402
|
+
**`makeTaskEnvelopeModel(task).parseTaskResult` refuses a malformed answer locally**, and returns a `problem` rather than
|
|
403
403
|
throwing. The refusal is worth more than the parse: an answer that reaches the platform malformed
|
|
404
404
|
costs a whole retry — another task, another subagent, another wait — while one caught here is a
|
|
405
405
|
sentence the parent can act on immediately, with the subagent's context still open. It unfences,
|
|
@@ -451,7 +451,7 @@ forgotten after every command that changes the tree.
|
|
|
451
451
|
|
|
452
452
|
Five rules the local half adds, each learned from a defect:
|
|
453
453
|
|
|
454
|
-
- **`backendEnv` reads the root `.env` and
|
|
454
|
+
- **`makeTargetEnvHelper(dir).backendEnv` reads the root `.env` and `.frontendEnv` the web package's own — the file split IS
|
|
455
455
|
the leak boundary.** The publisher has an allow-list (`frontendEnvVars`/`frontendSecrets`); here
|
|
456
456
|
the two files are never merged in either direction, because `FRONTEND_ENV_KEYS` announces
|
|
457
457
|
everything in the frontend set to the bundler and a merge would compile `OIDC_SECRET` and
|
|
@@ -497,7 +497,7 @@ outside the block is yours — false for the one value the platform cannot suppl
|
|
|
497
497
|
line the setup guide tells people to write. The application connected to the placeholder no matter
|
|
498
498
|
what its owner put in the file.
|
|
499
499
|
|
|
500
|
-
`writeEnv` therefore reads the file with the block cut out, and replaces any block line assigning a
|
|
500
|
+
`makeProjectEnvHelper(dir).writeEnv` therefore reads the file with the block cut out, and replaces any block line assigning a
|
|
501
501
|
key the user already assigns with a comment saying so. The rule is about VALUES, not lines: a key the
|
|
502
502
|
user has not claimed is still the platform's to set, and a key they later delete goes back to the
|
|
503
503
|
platform on the next push.
|
|
@@ -527,17 +527,17 @@ TARGET's own "the api port is already in use", which reads as a defect in the ge
|
|
|
527
527
|
than as a leftover.
|
|
528
528
|
|
|
529
529
|
Two rules, both ported from the publisher because a laptop needs them more than a pod does:
|
|
530
|
-
- `killGroupAndWait` never returns early on the child's own exit code. The child is a shell wrapping
|
|
530
|
+
- `spawnHelper.killGroupAndWait` never returns early on the child's own exit code. The child is a shell wrapping
|
|
531
531
|
`bun`, so a signal the shell dies from leaves `bun` alive while `exitCode` says gone; the wait
|
|
532
532
|
polls the GROUP instead of the child's exit event.
|
|
533
|
-
- `reclaimPort` runs before a spawn as well as after one, and matches on the script AND the process
|
|
533
|
+
- `spawnHelper.reclaimPort` runs before a spawn as well as after one, and matches on the script AND the process
|
|
534
534
|
marker (`--viable-api`, `--viable-worker`, `--viable-boot-check`) — never a port alone, and never
|
|
535
535
|
a marker alone, since reclaiming sends SIGKILL and a marker on its own matches any command line
|
|
536
536
|
that merely mentions it.
|
|
537
537
|
|
|
538
538
|
## Running the generated app locally
|
|
539
539
|
|
|
540
|
-
`runLocal` builds and starts the api, the worker (when the project has one) and a local server that
|
|
540
|
+
`makeLocalRunHelper(dir).runLocal` builds and starts the api, the worker (when the project has one) and a local server that
|
|
541
541
|
holds the web port and proxies `/api` to the api process on the same origin — the generated app's
|
|
542
542
|
configuration assumes one origin, and splitting them across two loopback ports would put its CORS
|
|
543
543
|
setup in the path of a developer's first page load. There is no respawn ladder, no reconciler and no
|
package/build/api/index.d.ts
CHANGED
package/build/api/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,mBAAmB,sBAAsB,CAAA"}
|
package/build/api/index.js
CHANGED
package/build/api/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA"}
|
package/build/api/remote.d.ts
CHANGED
|
@@ -1,15 +1,5 @@
|
|
|
1
1
|
import type { ConnectorApi } from '../types.js';
|
|
2
2
|
import type { Ctx } from './types.local.js';
|
|
3
|
-
/** A broken HTTP connection, as opposed to a refusal the platform deliberately answered. */
|
|
4
|
-
export declare const isTransientTransportError: (value: unknown) => boolean;
|
|
5
|
-
/**
|
|
6
|
-
* Recover a long poll with one non-blocking snapshot.
|
|
7
|
-
*
|
|
8
|
-
* Repeating the whole poll can exceed the MCP host's 45-second tool ceiling after a proxy drops a
|
|
9
|
-
* response near the end of its 30-second window. A snapshot asks for the same durable state with
|
|
10
|
-
* no wait, so the caller receives the current state without duplicating or restarting any work.
|
|
11
|
-
*/
|
|
12
|
-
export declare const recoverLongPoll: <T>(poll: () => Promise<T>, snapshot: () => Promise<T>) => Promise<T>;
|
|
13
3
|
/**
|
|
14
4
|
* The connector API over HTTP.
|
|
15
5
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../../src/api/remote.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAiC,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../../src/api/remote.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAiC,MAAM,aAAa,CAAA;AAC9E,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAG3C;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,YAAa,GAAG,KAAG,YAqHrD,CAAA"}
|
package/build/api/remote.js
CHANGED
|
@@ -1,41 +1,6 @@
|
|
|
1
|
-
import { planningOf } from '@owlmeans/client-planning';
|
|
2
1
|
import { connectRef } from '@owlmeans/viable-common';
|
|
3
2
|
import { TOOL_DEADLINE_MS } from '../consts.js';
|
|
4
|
-
import {
|
|
5
|
-
/** A broken HTTP connection, as opposed to a refusal the platform deliberately answered. */
|
|
6
|
-
export const isTransientTransportError = (value) => {
|
|
7
|
-
const seen = new Set();
|
|
8
|
-
let current = value;
|
|
9
|
-
while (current != null && !seen.has(current)) {
|
|
10
|
-
seen.add(current);
|
|
11
|
-
const error = current;
|
|
12
|
-
if (typeof error.code === 'string' && TRANSIENT_TRANSPORT_CODES.has(error.code))
|
|
13
|
-
return true;
|
|
14
|
-
const message = typeof error.message === 'string' ? error.message : String(current);
|
|
15
|
-
if (/\b(?:ECONNRESET|ECONNREFUSED|EPIPE|ETIMEDOUT|UND_ERR_(?:CONNECT_TIMEOUT|HEADERS_TIMEOUT|SOCKET))\b/.test(message)) {
|
|
16
|
-
return true;
|
|
17
|
-
}
|
|
18
|
-
current = error.cause;
|
|
19
|
-
}
|
|
20
|
-
return false;
|
|
21
|
-
};
|
|
22
|
-
/**
|
|
23
|
-
* Recover a long poll with one non-blocking snapshot.
|
|
24
|
-
*
|
|
25
|
-
* Repeating the whole poll can exceed the MCP host's 45-second tool ceiling after a proxy drops a
|
|
26
|
-
* response near the end of its 30-second window. A snapshot asks for the same durable state with
|
|
27
|
-
* no wait, so the caller receives the current state without duplicating or restarting any work.
|
|
28
|
-
*/
|
|
29
|
-
export const recoverLongPoll = async (poll, snapshot) => {
|
|
30
|
-
try {
|
|
31
|
-
return await poll();
|
|
32
|
-
}
|
|
33
|
-
catch (error) {
|
|
34
|
-
if (!isTransientTransportError(error))
|
|
35
|
-
throw error;
|
|
36
|
-
return await snapshot();
|
|
37
|
-
}
|
|
38
|
-
};
|
|
3
|
+
import { planningContextOf } from '@owlmeans/client-planning';
|
|
39
4
|
/**
|
|
40
5
|
* The connector API over HTTP.
|
|
41
6
|
*
|
|
@@ -107,7 +72,7 @@ export const makeRemoteConnectorApi = (context) => {
|
|
|
107
72
|
status: async (id, storyId) => await context
|
|
108
73
|
.entrypoint(connectRef.story.status).call({ params: { id, storyId }, timeout: TOOL_DEADLINE_MS }),
|
|
109
74
|
},
|
|
110
|
-
planning:
|
|
75
|
+
planning: planningContextOf(context).facade({}),
|
|
111
76
|
files: {
|
|
112
77
|
list: async (id) => await context.entrypoint(connectRef.files.list).call({
|
|
113
78
|
params: { id }, timeout: TOOL_DEADLINE_MS,
|
package/build/api/remote.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/api/remote.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../../src/api/remote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Telling a broken HTTP connection from a refusal, and recovering a long poll that lost one. */
|
|
2
|
+
export interface TransportHelper {
|
|
3
|
+
/** A broken HTTP connection, as opposed to a refusal the platform deliberately answered. */
|
|
4
|
+
isTransientTransportError: (value: unknown) => boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Recover a long poll with one non-blocking snapshot.
|
|
7
|
+
*
|
|
8
|
+
* Repeating the whole poll can exceed the MCP host's 45-second tool ceiling after a proxy drops a
|
|
9
|
+
* response near the end of its 30-second window. A snapshot asks for the same durable state with
|
|
10
|
+
* no wait, so the caller receives the current state without duplicating or restarting any work.
|
|
11
|
+
*/
|
|
12
|
+
recoverLongPoll: <T>(poll: () => Promise<T>, snapshot: () => Promise<T>) => Promise<T>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/api/transport/types.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,MAAM,WAAW,eAAe;IAC9B,4FAA4F;IAC5F,yBAAyB,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAA;IACtD;;;;;;OAMG;IACH,eAAe,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;CACvF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/api/transport/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/api/transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE3D,eAAO,MAAM,qBAAqB,QAAO,eAgCxC,CAAA;AAED,eAAO,MAAM,eAAe,iBAA0B,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { TRANSIENT_TRANSPORT_CODES } from './consts.local.js';
|
|
2
|
+
export const createTransportHelper = () => {
|
|
3
|
+
const isTransientTransportError = (value) => {
|
|
4
|
+
const seen = new Set();
|
|
5
|
+
let current = value;
|
|
6
|
+
while (current != null && !seen.has(current)) {
|
|
7
|
+
seen.add(current);
|
|
8
|
+
const error = current;
|
|
9
|
+
if (typeof error.code === 'string' && TRANSIENT_TRANSPORT_CODES.has(error.code))
|
|
10
|
+
return true;
|
|
11
|
+
const message = typeof error.message === 'string' ? error.message : String(current);
|
|
12
|
+
if (/\b(?:ECONNRESET|ECONNREFUSED|EPIPE|ETIMEDOUT|UND_ERR_(?:CONNECT_TIMEOUT|HEADERS_TIMEOUT|SOCKET))\b/.test(message)) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
current = error.cause;
|
|
16
|
+
}
|
|
17
|
+
return false;
|
|
18
|
+
};
|
|
19
|
+
const recoverLongPoll = async (poll, snapshot) => {
|
|
20
|
+
try {
|
|
21
|
+
return await poll();
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
if (!isTransientTransportError(error))
|
|
25
|
+
throw error;
|
|
26
|
+
return await snapshot();
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
return { isTransientTransportError, recoverLongPoll };
|
|
30
|
+
};
|
|
31
|
+
export const transportHelper = createTransportHelper();
|
|
32
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/api/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAA;AAG7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAoB,EAAE;IACzD,MAAM,yBAAyB,GAAG,CAAC,KAAc,EAAW,EAAE;QAC5D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAW,CAAA;QAC/B,IAAI,OAAO,GAAY,KAAK,CAAA;QAE5B,OAAO,OAAO,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;YACjB,MAAM,KAAK,GAAG,OAAiE,CAAA;YAC/E,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAA;YAC5F,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YACnF,IAAI,oGAAoG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvH,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,GAAG,KAAK,CAAC,KAAK,CAAA;QACvB,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC,CAAA;IAED,MAAM,eAAe,GAAG,KAAK,EAC3B,IAAsB,EAAE,QAA0B,EACtC,EAAE;QACd,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,EAAE,CAAA;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAA;YAElD,OAAO,MAAM,QAAQ,EAAE,CAAA;QACzB,CAAC;IACH,CAAC,CAAA;IAED,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAE,CAAA;AACvD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,qBAAqB,EAAE,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { spawn as nodeSpawn } from 'node:child_process';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { healthHelper } from './health.js';
|
|
3
|
+
import { spawnHelper } from './spawn.js';
|
|
4
4
|
import { STARTUP_LOG_CAP, WATCHDOG_MS } from './consts.local.js';
|
|
5
5
|
/**
|
|
6
6
|
* Boot the generated backend for real, in isolation, and report what happened.
|
|
@@ -25,7 +25,7 @@ import { STARTUP_LOG_CAP, WATCHDOG_MS } from './consts.local.js';
|
|
|
25
25
|
* simply leaves what it created behind, and the next run reconciles into it.
|
|
26
26
|
*/
|
|
27
27
|
export const runBootCheck = async (deps) => {
|
|
28
|
-
const { port, marker, cwd, env, bootId, build, readHealth = readTargetHealth, spawn = nodeSpawn, ddlWindowMs = 10_000, readyWindowMs = 90_000, readyPollMs = 2_000, timeoutMs = 480_000, } = deps;
|
|
28
|
+
const { port, marker, cwd, env, bootId, build, readHealth = healthHelper.readTargetHealth, spawn = nodeSpawn, ddlWindowMs = 10_000, readyWindowMs = 90_000, readyPollMs = 2_000, timeoutMs = 480_000, } = deps;
|
|
29
29
|
const deadline = Date.now() + timeoutMs;
|
|
30
30
|
let child = null;
|
|
31
31
|
let log = '';
|
|
@@ -41,8 +41,8 @@ export const runBootCheck = async (deps) => {
|
|
|
41
41
|
// Before the spawn, not only after it. The leftover this reclaims belongs to a run that never
|
|
42
42
|
// finished, so it is already holding the port by the time anything asks for a fresh check —
|
|
43
43
|
// and the target refuses to start on a taken port rather than stealing it, correctly.
|
|
44
|
-
if (!await waitForPortFree(port, 2_000))
|
|
45
|
-
await reclaimPort(port, marker);
|
|
44
|
+
if (!await spawnHelper.waitForPortFree(port, 2_000))
|
|
45
|
+
await spawnHelper.reclaimPort(port, marker);
|
|
46
46
|
child = spawn('bun', ['dist/index.js', marker], {
|
|
47
47
|
cwd,
|
|
48
48
|
detached: true,
|
|
@@ -59,7 +59,7 @@ export const runBootCheck = async (deps) => {
|
|
|
59
59
|
// is for. A target that survives it may still be degraded, which is what the poll asks about.
|
|
60
60
|
const ddlDeadline = Date.now() + ddlWindowMs;
|
|
61
61
|
while (Date.now() < ddlDeadline && !exited) {
|
|
62
|
-
await delay(200);
|
|
62
|
+
await spawnHelper.delay(200);
|
|
63
63
|
}
|
|
64
64
|
if (exited) {
|
|
65
65
|
return { ok: false, phase: 'boot', error: `The target backend exited while initializing:\n${log}` };
|
|
@@ -79,7 +79,7 @@ export const runBootCheck = async (deps) => {
|
|
|
79
79
|
if (health.terminal) {
|
|
80
80
|
return { ok: false, phase: 'boot', error: `${reason}\n${log}`.trim(), dbOk: health.dbOk };
|
|
81
81
|
}
|
|
82
|
-
await delay(readyPollMs);
|
|
82
|
+
await spawnHelper.delay(readyPollMs);
|
|
83
83
|
}
|
|
84
84
|
return { ok: false, phase: 'boot', error: `${reason}\n${log}`.trim() };
|
|
85
85
|
}
|
|
@@ -91,7 +91,7 @@ export const runBootCheck = async (deps) => {
|
|
|
91
91
|
// and one left holding the database would be indistinguishable from the live backend.
|
|
92
92
|
if (child != null) {
|
|
93
93
|
try {
|
|
94
|
-
await killGroupAndWait(child);
|
|
94
|
+
await spawnHelper.killGroupAndWait(child);
|
|
95
95
|
}
|
|
96
96
|
catch {
|
|
97
97
|
// Already gone.
|
|
@@ -102,8 +102,8 @@ export const runBootCheck = async (deps) => {
|
|
|
102
102
|
// detached child alive, and every later check then fails with the target's own "the api port
|
|
103
103
|
// is already in use" — which reads as a defect in the generated app rather than as a stray
|
|
104
104
|
// process from a run that never finished.
|
|
105
|
-
if (!await waitForPortFree(port))
|
|
106
|
-
await reclaimPort(port, marker);
|
|
105
|
+
if (!await spawnHelper.waitForPortFree(port))
|
|
106
|
+
await spawnHelper.reclaimPort(port, marker);
|
|
107
107
|
}
|
|
108
108
|
catch {
|
|
109
109
|
// Nothing else to do — the next check reclaims by marker anyway.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boot-check.js","sourceRoot":"","sources":["../../src/executor/boot-check.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,SAAS,EAAqB,MAAM,oBAAoB,CAAA;AAE1E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"boot-check.js","sourceRoot":"","sources":["../../src/executor/boot-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type TargetLayout } from '@owlmeans/viable-common';
|
|
1
2
|
export declare const STARTUP_LOG_CAP = 16384;
|
|
2
3
|
/**
|
|
3
4
|
* Outer bound on one boot-check job.
|
|
@@ -57,4 +58,6 @@ export declare const TERM_TIMEOUT = 5000;
|
|
|
57
58
|
export declare const KILL_TIMEOUT = 2000;
|
|
58
59
|
/** What every target process runs; the marker is what tells the three of them apart. */
|
|
59
60
|
export declare const TARGET_SCRIPT = "dist/index.js";
|
|
61
|
+
/** Each layout's marker file, as a path of this platform — the probe `detectLayout` runs per call. */
|
|
62
|
+
export declare const LAYOUT_MARKER_PATHS: Array<[TargetLayout, string]>;
|
|
60
63
|
//# sourceMappingURL=consts.local.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consts.local.d.ts","sourceRoot":"","sources":["../../src/executor/consts.local.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,QAAS,CAAA;AAErC;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,SAAU,CAAA;AAElC,yFAAyF;AACzF,eAAO,MAAM,sBAAsB,aAGjC,CAAA;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS,aAAqD,CAAA;AAE3E;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,SAAS,CAAA;AAEpC,eAAO,MAAM,qBAAqB,oBAAoB,CAAA;AAEtD,eAAO,MAAM,sBAAsB,uBAAuB,CAAA;AAE1D,eAAO,MAAM,SAAS,KAAK,CAAA;AAE3B,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAIlC,eAAO,MAAM,UAAU,iDAAiD,CAAA;AAExE;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,OAAQ,CAAA;AAEnC,mFAAmF;AACnF,eAAO,MAAM,iBAAiB,QAAS,CAAA;AAEvC,eAAO,MAAM,YAAY,MAAM,CAAA;AAE/B,eAAO,MAAM,YAAY,OAAQ,CAAA;AAEjC,eAAO,MAAM,YAAY,OAAQ,CAAA;AAEjC,wFAAwF;AACxF,eAAO,MAAM,aAAa,kBAAkB,CAAA"}
|
|
1
|
+
{"version":3,"file":"consts.local.d.ts","sourceRoot":"","sources":["../../src/executor/consts.local.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwD,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEjH,eAAO,MAAM,eAAe,QAAS,CAAA;AAErC;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,SAAU,CAAA;AAElC,yFAAyF;AACzF,eAAO,MAAM,sBAAsB,aAGjC,CAAA;AAEF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS,aAAqD,CAAA;AAE3E;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,SAAS,CAAA;AAEpC,eAAO,MAAM,qBAAqB,oBAAoB,CAAA;AAEtD,eAAO,MAAM,sBAAsB,uBAAuB,CAAA;AAE1D,eAAO,MAAM,SAAS,KAAK,CAAA;AAE3B,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAIlC,eAAO,MAAM,UAAU,iDAAiD,CAAA;AAExE;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,OAAQ,CAAA;AAEnC,mFAAmF;AACnF,eAAO,MAAM,iBAAiB,QAAS,CAAA;AAEvC,eAAO,MAAM,YAAY,MAAM,CAAA;AAE/B,eAAO,MAAM,YAAY,OAAQ,CAAA;AAEjC,eAAO,MAAM,YAAY,OAAQ,CAAA;AAEjC,wFAAwF;AACxF,eAAO,MAAM,aAAa,kBAAkB,CAAA;AAE5C,sGAAsG;AACtG,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,CAE7D,CAAA"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { CENSUS_SKIP_DIRS, CONNECT_MARKER_DIR, LAYOUT_MARKERS } from '@owlmeans/viable-common';
|
|
2
3
|
export const STARTUP_LOG_CAP = 16_384;
|
|
3
4
|
/**
|
|
4
5
|
* Outer bound on one boot-check job.
|
|
@@ -63,4 +64,6 @@ export const TERM_TIMEOUT = 5_000;
|
|
|
63
64
|
export const KILL_TIMEOUT = 2_000;
|
|
64
65
|
/** What every target process runs; the marker is what tells the three of them apart. */
|
|
65
66
|
export const TARGET_SCRIPT = 'dist/index.js';
|
|
67
|
+
/** Each layout's marker file, as a path of this platform — the probe `detectLayout` runs per call. */
|
|
68
|
+
export const LAYOUT_MARKER_PATHS = LAYOUT_MARKERS.map(([layout, marker]) => [layout, path.join(...marker.split('/'))]);
|
|
66
69
|
//# sourceMappingURL=consts.local.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consts.local.js","sourceRoot":"","sources":["../../src/executor/consts.local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"consts.local.js","sourceRoot":"","sources":["../../src/executor/consts.local.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAqB,MAAM,yBAAyB,CAAA;AAEjH,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAA;AAErC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAA;AAElC,yFAAyF;AACzF,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IAC5C,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB;IACpF,UAAU,EAAE,mBAAmB,EAAE,WAAW;CAC7C,CAAC,CAAA;AAEF;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,gBAAgB,EAAE,kBAAkB,CAAC,CAAC,CAAA;AAE3E;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAA;AAEpC,MAAM,CAAC,MAAM,qBAAqB,GAAG,iBAAiB,CAAA;AAEtD,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAA;AAE1D,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAA;AAE3B,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAElC,gGAAgG;AAChG,gBAAgB;AAChB,MAAM,CAAC,MAAM,UAAU,GAAG,8CAA8C,CAAA;AAExE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAA;AAEnC,mFAAmF;AACnF,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAA;AAEvC,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAA;AAE/B,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAA;AAEjC,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAA;AAEjC,wFAAwF;AACxF,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAA;AAE5C,sGAAsG;AACtG,MAAM,CAAC,MAAM,mBAAmB,GAAkC,cAAc,CAAC,GAAG,CAClF,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAChE,CAAA"}
|