scoutline 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -20
- package/dist/capabilities/quota.d.ts +1 -1
- package/dist/capabilities/quota.d.ts.map +1 -1
- package/dist/commands/crawl.js +1 -1
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/map.js +1 -1
- package/dist/commands/read.js +1 -1
- package/dist/commands/research.js +5 -5
- package/dist/commands/research.js.map +1 -1
- package/dist/commands/search.js +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/async-job-state.d.ts +119 -0
- package/dist/lib/async-job-state.d.ts.map +1 -0
- package/dist/lib/{research-state.js → async-job-state.js} +43 -34
- package/dist/lib/async-job-state.js.map +1 -0
- package/dist/lib/cache.d.ts +16 -8
- package/dist/lib/cache.d.ts.map +1 -1
- package/dist/lib/cache.js +33 -8
- package/dist/lib/cache.js.map +1 -1
- package/dist/lib/execution.d.ts.map +1 -1
- package/dist/lib/execution.js +8 -4
- package/dist/lib/execution.js.map +1 -1
- package/dist/lib/redact.d.ts +1 -1
- package/dist/lib/redact.d.ts.map +1 -1
- package/dist/lib/redact.js +9 -1
- package/dist/lib/redact.js.map +1 -1
- package/dist/providers/exa/adapter.d.ts +2 -2
- package/dist/providers/exa/adapter.d.ts.map +1 -1
- package/dist/providers/exa/adapter.js +5 -3
- package/dist/providers/exa/adapter.js.map +1 -1
- package/dist/providers/firecrawl/adapter.d.ts +53 -0
- package/dist/providers/firecrawl/adapter.d.ts.map +1 -0
- package/dist/providers/firecrawl/adapter.js +962 -0
- package/dist/providers/firecrawl/adapter.js.map +1 -0
- package/dist/providers/firecrawl/client.d.ts +182 -0
- package/dist/providers/firecrawl/client.d.ts.map +1 -0
- package/dist/providers/firecrawl/client.js +426 -0
- package/dist/providers/firecrawl/client.js.map +1 -0
- package/dist/providers/firecrawl/credentials.d.ts +38 -0
- package/dist/providers/firecrawl/credentials.d.ts.map +1 -0
- package/dist/providers/firecrawl/credentials.js +60 -0
- package/dist/providers/firecrawl/credentials.js.map +1 -0
- package/dist/providers/firecrawl/diagnostics.d.ts +36 -0
- package/dist/providers/firecrawl/diagnostics.d.ts.map +1 -0
- package/dist/providers/firecrawl/diagnostics.js +65 -0
- package/dist/providers/firecrawl/diagnostics.js.map +1 -0
- package/dist/providers/firecrawl/quota.d.ts +46 -0
- package/dist/providers/firecrawl/quota.d.ts.map +1 -0
- package/dist/providers/firecrawl/quota.js +120 -0
- package/dist/providers/firecrawl/quota.js.map +1 -0
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +2 -0
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/tavily/adapter.d.ts +2 -2
- package/dist/providers/tavily/adapter.d.ts.map +1 -1
- package/dist/providers/tavily/adapter.js +5 -3
- package/dist/providers/tavily/adapter.js.map +1 -1
- package/dist/providers/types.d.ts +1 -1
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js +1 -1
- package/dist/providers/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/lib/research-state.d.ts +0 -104
- package/dist/lib/research-state.d.ts.map +0 -1
- package/dist/lib/research-state.js.map +0 -1
- package/dist/providers/minimax/sdk-client.d.ts +0 -29
- package/dist/providers/minimax/sdk-client.d.ts.map +0 -1
- package/dist/providers/minimax/sdk-client.js +0 -50
- package/dist/providers/minimax/sdk-client.js.map +0 -1
package/README.md
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
- **Repo** - Search and read GitHub repository code via ZRead
|
|
22
22
|
- **Tools** - MCP tool discovery, schemas, and raw calls
|
|
23
23
|
- **Code Mode** - TypeScript tool chaining for agent automation
|
|
24
|
-
- **Provider selection** - Run shared capabilities through Z.AI, MiniMax
|
|
24
|
+
- **Provider selection** - Run shared capabilities through Z.AI, MiniMax, Tavily, Exa, Brave, or Firecrawl
|
|
25
25
|
|
|
26
26
|
## Quick Start
|
|
27
27
|
|
|
@@ -82,9 +82,9 @@ npx scoutline --help
|
|
|
82
82
|
## Provider Selection
|
|
83
83
|
|
|
84
84
|
Shared commands (`search`, `vision`, `quota`, `doctor`, `repo`) accept a global
|
|
85
|
-
`--provider <zai|minimax|tavily|brave>` flag. Resolution precedence:
|
|
85
|
+
`--provider <zai|minimax|tavily|exa|brave|firecrawl>` flag. Resolution precedence:
|
|
86
86
|
|
|
87
|
-
1. Explicit `--provider <zai|minimax|tavily|brave>` on the command line
|
|
87
|
+
1. Explicit `--provider <zai|minimax|tavily|exa|brave|firecrawl>` on the command line
|
|
88
88
|
2. `SCOUTLINE_PROVIDER` environment variable
|
|
89
89
|
3. Compatibility default `zai`
|
|
90
90
|
|
|
@@ -119,23 +119,26 @@ construction, with no Z.AI fallback.
|
|
|
119
119
|
|
|
120
120
|
## Capability Matrix
|
|
121
121
|
|
|
122
|
-
| Capability | Z.AI | MiniMax | Notes |
|
|
123
|
-
| --- | --- | --- | --- |
|
|
124
|
-
| `search` | Yes | Yes | MiniMax rejects domain/recency/content-size/location
|
|
125
|
-
| `vision.interpret-image` (analyze) | Yes | Yes | Provider-specific media limits; uncached |
|
|
126
|
-
| `vision.ui-artifact` (ui-to-code) | Yes | Available | Live-attested; conformance-gated |
|
|
127
|
-
| `vision.extract-text` | Yes | Pending | Implemented, pending live conformance |
|
|
128
|
-
| `vision.diagnose-error` | Yes | Available | Live-attested; conformance-gated |
|
|
129
|
-
| `vision.diagram` | Yes | Pending | Implemented, pending live conformance |
|
|
130
|
-
| `vision.chart` | Yes | Pending | Implemented, pending live conformance |
|
|
131
|
-
| `vision.diff` (image diff) | Yes | No | Z.AI-only (never MiniMax-claimable) |
|
|
132
|
-
| `vision.video` | Yes | No | Z.AI-only (never MiniMax-claimable) |
|
|
133
|
-
| `quota` | Yes | Yes | Normalized `QuotaDashboard` (ADR-0001) |
|
|
134
|
-
| `diagnostics` (`doctor`) | Yes | Yes | Lists
|
|
135
|
-
| `read` (Reader) | Yes | **No**
|
|
136
|
-
| `
|
|
137
|
-
| `
|
|
138
|
-
| `
|
|
122
|
+
| Capability | Z.AI | MiniMax | Tavily | Firecrawl | Notes |
|
|
123
|
+
| --- | --- | --- | --- | --- | --- |
|
|
124
|
+
| `search` | Yes | Yes | Yes | Yes | MiniMax rejects domain/recency/content-size/location |
|
|
125
|
+
| `vision.interpret-image` (analyze) | Yes | Yes | No | No | Provider-specific media limits; uncached |
|
|
126
|
+
| `vision.ui-artifact` (ui-to-code) | Yes | Available | No | No | Live-attested; conformance-gated |
|
|
127
|
+
| `vision.extract-text` | Yes | Pending | No | No | Implemented, pending live conformance |
|
|
128
|
+
| `vision.diagnose-error` | Yes | Available | No | No | Live-attested; conformance-gated |
|
|
129
|
+
| `vision.diagram` | Yes | Pending | No | No | Implemented, pending live conformance |
|
|
130
|
+
| `vision.chart` | Yes | Pending | No | No | Implemented, pending live conformance |
|
|
131
|
+
| `vision.diff` (image diff) | Yes | No | No | No | Z.AI-only (never MiniMax-claimable) |
|
|
132
|
+
| `vision.video` | Yes | No | No | No | Z.AI-only (never MiniMax-claimable) |
|
|
133
|
+
| `quota` | Yes | Yes | Yes | Yes (credits) | Normalized `QuotaDashboard` (ADR-0001) |
|
|
134
|
+
| `diagnostics` (`doctor`) | Yes | Yes | Yes | Yes | Lists every Provider; probes configured |
|
|
135
|
+
| `read` (Reader) | Yes | **No** | Yes | Yes | Participates in selection; Z.AI-only options rejected by Tavily/Firecrawl |
|
|
136
|
+
| `crawl` | **No** | **No** | Yes | Yes (async) | Tavily sync; Firecrawl async (resumable after Ctrl-C) |
|
|
137
|
+
| `map` | **No** | **No** | Yes | Yes | URL-set discovery; no per-page content |
|
|
138
|
+
| `research` | **No** | **No** | Yes | **No** | Tavily-only (Firecrawl `/deep-research` deprecated); 4-250 credits |
|
|
139
|
+
| `repo search` / `repo read` / `repo tree` | Yes | **No** | **No** | **No** | Participates in selection; only Z.AI supplies `repository-exploration` |
|
|
140
|
+
| `tools`, `tool`, `call` (Raw tools) | Yes | No | No | No | Z.AI-only; accepts but ignores `--provider` |
|
|
141
|
+
| `code` (Code Mode) | Yes | No | No | No | Z.AI-only; accepts but ignores `--provider` |
|
|
139
142
|
|
|
140
143
|
Media limits for general single-image interpretation:
|
|
141
144
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quota.d.ts","sourceRoot":"","sources":["../../src/capabilities/quota.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAM3E,MAAM,WAAW,WAAW;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"quota.d.ts","sourceRoot":"","sources":["../../src/capabilities/quota.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAkB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAM3E,MAAM,WAAW,WAAW;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,UAAU,CAAC;IACrB,MAAM,EAAE,IAAI,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,UAAU,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE;QAAE,IAAI,EAAE,kBAAkB,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACrE;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,CAAC,CAAC;IACjB,iBAAiB,EAAE,UAAU,CAAC;IAC9B,SAAS,EAAE,KAAK,CAAC,oBAAoB,GAAG,oBAAoB,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACzC;AAMD;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAkDD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAoCvE;AAMD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAahG"}
|
package/dist/commands/crawl.js
CHANGED
|
@@ -140,7 +140,7 @@ Options:
|
|
|
140
140
|
--no-cache Bypass the response cache for this invocation
|
|
141
141
|
|
|
142
142
|
Common Options:
|
|
143
|
-
--provider <id> Override the active Provider (zai | minimax | tavily | exa)
|
|
143
|
+
--provider <id> Override the active Provider (zai | minimax | tavily | exa | firecrawl)
|
|
144
144
|
--output-format <mode> One of: ${OUTPUT_MODE_LIST} (default: data)
|
|
145
145
|
-O <mode> Alias for --output-format
|
|
146
146
|
|
package/dist/commands/doctor.js
CHANGED
|
@@ -142,7 +142,7 @@ Doctor - Provider-aware environment and connectivity diagnostics
|
|
|
142
142
|
Usage: scoutline doctor [options]
|
|
143
143
|
|
|
144
144
|
Reports a schema-version-2 diagnostics report listing every built-in
|
|
145
|
-
Provider (zai, minimax, tavily, exa) with its configured state, declared
|
|
145
|
+
Provider (zai, minimax, tavily, exa, firecrawl) with its configured state, declared
|
|
146
146
|
Capabilities, and connectivity status. The effective Provider (resolved
|
|
147
147
|
from --provider, SCOUTLINE_PROVIDER, or the default zai) is the
|
|
148
148
|
Provider that serves a requested capability. The capabilityMatrix field
|
package/dist/commands/map.js
CHANGED
|
@@ -100,7 +100,7 @@ Options:
|
|
|
100
100
|
--no-cache Bypass the response cache for this invocation
|
|
101
101
|
|
|
102
102
|
Common Options:
|
|
103
|
-
--provider <id> Override the active Provider (zai | minimax | tavily | exa)
|
|
103
|
+
--provider <id> Override the active Provider (zai | minimax | tavily | exa | firecrawl)
|
|
104
104
|
--output-format <mode> One of: ${OUTPUT_MODE_LIST} (default: data)
|
|
105
105
|
-O <mode> Alias for --output-format
|
|
106
106
|
|
package/dist/commands/read.js
CHANGED
|
@@ -255,7 +255,7 @@ Options:
|
|
|
255
255
|
code | links | tables | headings
|
|
256
256
|
|
|
257
257
|
Common Options:
|
|
258
|
-
--provider <id> Override the active Provider (zai | minimax | tavily | exa)
|
|
258
|
+
--provider <id> Override the active Provider (zai | minimax | tavily | exa | firecrawl)
|
|
259
259
|
--output-format <mode> One of: ${OUTPUT_MODE_LIST} (default: data)
|
|
260
260
|
-O <mode> Alias for --output-format
|
|
261
261
|
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
import * as fs from "node:fs";
|
|
21
21
|
import path from "node:path";
|
|
22
22
|
import { executeCachedOperation } from "../lib/execution.js";
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
23
|
+
import { asyncJobStateDir } from "../lib/cache.js";
|
|
24
|
+
import { computeAsyncJobStateHash } from "../lib/async-job-state.js";
|
|
25
25
|
import { OUTPUT_MODES } from "../lib/output.js";
|
|
26
26
|
import { TimeoutError, ValidationError } from "../lib/errors.js";
|
|
27
27
|
// ---------------------------------------------------------------------------
|
|
@@ -183,13 +183,13 @@ export async function research(query, options = {}, deps, _context) {
|
|
|
183
183
|
// hash uses the same formula as the adapter (CR3), so the file the
|
|
184
184
|
// handler reads is the one the adapter wrote.
|
|
185
185
|
const identity = deps.capability.run.cacheIdentity(request);
|
|
186
|
-
const identityHash =
|
|
186
|
+
const identityHash = computeAsyncJobStateHash({
|
|
187
187
|
provider: identity.provider,
|
|
188
188
|
capability: identity.capability,
|
|
189
189
|
credentialFingerprint: identity.credentialFingerprint,
|
|
190
190
|
request: identity.request,
|
|
191
191
|
});
|
|
192
|
-
const stateFilePath = path.join(
|
|
192
|
+
const stateFilePath = path.join(asyncJobStateDir("research"), `${identityHash}.json`);
|
|
193
193
|
const resumeCommand = `scoutline research "${query}"`;
|
|
194
194
|
// Register the Ctrl-C handler. Production reads the state file sync
|
|
195
195
|
// and exits 130; tests inject a recorder.
|
|
@@ -292,7 +292,7 @@ Options:
|
|
|
292
292
|
--no-cache Bypass the response cache for this invocation
|
|
293
293
|
|
|
294
294
|
Common Options:
|
|
295
|
-
--provider <id> Override the active Provider (zai | minimax | tavily | exa)
|
|
295
|
+
--provider <id> Override the active Provider (zai | minimax | tavily | exa | firecrawl)
|
|
296
296
|
--output-format <mode> One of: ${OUTPUT_MODE_LIST} (default: data)
|
|
297
297
|
-O <mode> Alias for --output-format
|
|
298
298
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/commands/research.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/commands/research.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/search.js
CHANGED
|
@@ -178,7 +178,7 @@ Search Command - Real-time web search (Z.AI, MiniMax, Tavily, Exa, or Brave)
|
|
|
178
178
|
Usage: scoutline search <query> [options]
|
|
179
179
|
|
|
180
180
|
Provider selection (precedence: explicit flag, then SCOUTLINE_PROVIDER, then zai):
|
|
181
|
-
--provider <zai|minimax|tavily|exa|brave> Select the search provider (default: zai)
|
|
181
|
+
--provider <zai|minimax|tavily|exa|brave|firecrawl> Select the search provider (default: zai)
|
|
182
182
|
SCOUTLINE_PROVIDER=<id> Fallback when --provider is not passed
|
|
183
183
|
|
|
184
184
|
Note: support for the optional controls below varies by provider AND by
|
package/dist/index.js
CHANGED
|
@@ -55,7 +55,7 @@ Commands:
|
|
|
55
55
|
code Execute TypeScript tool chains (Code Mode, Z.AI)
|
|
56
56
|
|
|
57
57
|
Provider selection (precedence: --provider, then SCOUTLINE_PROVIDER, then zai):
|
|
58
|
-
--provider <zai|minimax|tavily|exa|brave> Select the active Provider for shared capabilities
|
|
58
|
+
--provider <zai|minimax|tavily|exa|brave|firecrawl> Select the active Provider for shared capabilities
|
|
59
59
|
SCOUTLINE_PROVIDER=<id> Fallback when --provider is not passed
|
|
60
60
|
|
|
61
61
|
Shared capabilities accept --provider. The 'repo', 'read', 'crawl', 'map',
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Async-job state file — resume mechanism for interrupted async jobs
|
|
3
|
+
* (tech-plan §3, T07 / FC-01).
|
|
4
|
+
*
|
|
5
|
+
* Some Provider operations run asynchronously server-side: a create call
|
|
6
|
+
* starts the job and returns a `requestId`, then a poll call checks it
|
|
7
|
+
* until completion. Tavily Research is the first (POST /research →
|
|
8
|
+
* GET /research/{id}); Firecrawl async Crawl (FC-04) is the second. If
|
|
9
|
+
* the CLI exits (Ctrl-C, crash) mid-poll, the job keeps running and
|
|
10
|
+
* consuming credits/quota. Without a persistence mechanism, the next
|
|
11
|
+
* identical request would start a SECOND job — a double charge.
|
|
12
|
+
*
|
|
13
|
+
* This module persists `{ requestId, identityHash, createdAt, status }`
|
|
14
|
+
* to `<state-dir>/<state-hash>.json` so the next invocation of the same
|
|
15
|
+
* request detects the in-flight job and polls it instead of creating a
|
|
16
|
+
* new one. The state-hash is deterministic for a given
|
|
17
|
+
* `{provider, capability, credentialFingerprint, request}` tuple (see
|
|
18
|
+
* {@link computeAsyncJobStateHash}). The state directory is injected by
|
|
19
|
+
* the caller (the Provider Descriptor resolves it via
|
|
20
|
+
* `asyncJobStateDir(capability)`); this module never touches the cache
|
|
21
|
+
* root, keeping it pure and unit-testable.
|
|
22
|
+
*
|
|
23
|
+
* Boundary rules (ARCHITECTURE.md §2):
|
|
24
|
+
* - May import normalized errors (none today) and node builtins only.
|
|
25
|
+
* - Must NOT import cache-root resolution, transport, command
|
|
26
|
+
* presentation, or a Provider Adapter.
|
|
27
|
+
*
|
|
28
|
+
* Resilience contract (tech-plan §3 / G1-G3):
|
|
29
|
+
* - `write()` uses `{ flag: "wx" }` for atomic creation. A concurrent
|
|
30
|
+
* invocation that finds the file already exists gets EEXIST and
|
|
31
|
+
* polls the existing job instead of creating a new one.
|
|
32
|
+
* - `read()` catches JSON parse errors, deletes the corrupt file, and
|
|
33
|
+
* returns `null` (treated as absent → new job created).
|
|
34
|
+
* - `remove()` deletes the file and ignores ENOENT (already gone).
|
|
35
|
+
*
|
|
36
|
+
* Wire-compat: the persisted `requestId` field name and the `status`
|
|
37
|
+
* enum are fixed by the on-disk format and the SIGINT reader in
|
|
38
|
+
* `commands/research.ts`. They are NOT renamed even though the module
|
|
39
|
+
* is now async-job-generic (critique C1).
|
|
40
|
+
*/
|
|
41
|
+
/**
|
|
42
|
+
* A single in-flight async job's persisted state. `status` tracks the
|
|
43
|
+
* last-seen poll status ("pending" or "in_progress"); the poll loop
|
|
44
|
+
* updates it so a resume after Ctrl-C skips statuses already observed.
|
|
45
|
+
*
|
|
46
|
+
* The `requestId` field name is part of the on-disk wire format and is
|
|
47
|
+
* deliberately kept even though the module is generic — the SIGINT path
|
|
48
|
+
* reads `parsed.requestId` off disk synchronously.
|
|
49
|
+
*/
|
|
50
|
+
export interface AsyncJobState {
|
|
51
|
+
readonly requestId: string;
|
|
52
|
+
readonly identityHash: string;
|
|
53
|
+
readonly createdAt: string;
|
|
54
|
+
readonly status: "pending" | "in_progress";
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Port the Adapter uses to read/write/remove async-job state. Production
|
|
58
|
+
* wires {@link createProductionAsyncJobStateFile}; tests inject in-memory
|
|
59
|
+
* doubles to exercise the lifecycle deterministically without touching
|
|
60
|
+
* the filesystem.
|
|
61
|
+
*/
|
|
62
|
+
export interface AsyncJobStateFile {
|
|
63
|
+
read(identityHash: string): Promise<AsyncJobState | null>;
|
|
64
|
+
write(identityHash: string, state: AsyncJobState): Promise<void>;
|
|
65
|
+
remove(identityHash: string): Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Inputs to the async-job state hash. `credentialFingerprint` is the full
|
|
69
|
+
* lowercase SHA-256 hex digest of the active credential (same value used
|
|
70
|
+
* for the response-cache fingerprint). `request` is the normalized
|
|
71
|
+
* Capability request whose recursively key-sorted JSON becomes part of
|
|
72
|
+
* the hash.
|
|
73
|
+
*/
|
|
74
|
+
export interface AsyncJobStateHashInput {
|
|
75
|
+
readonly provider: string;
|
|
76
|
+
readonly capability: string;
|
|
77
|
+
readonly credentialFingerprint: string;
|
|
78
|
+
readonly request: unknown;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Compute the deterministic state-file identity hash for an async job
|
|
82
|
+
* (tech-plan §3 / CR3).
|
|
83
|
+
*
|
|
84
|
+
* state-hash = SHA-256(recursively-key-sorted-JSON({
|
|
85
|
+
* provider, capability, credentialFingerprint, request
|
|
86
|
+
* }))
|
|
87
|
+
*
|
|
88
|
+
* Same canonical approach as `buildProviderCacheKey`'s request hashing,
|
|
89
|
+
* extended to include provider + capability + credential. Rotating the
|
|
90
|
+
* API key orphans old state files (correct — the old job belongs to the
|
|
91
|
+
* old key's billing). The hash never contains a raw credential.
|
|
92
|
+
*/
|
|
93
|
+
export declare function computeAsyncJobStateHash(input: AsyncJobStateHashInput): string;
|
|
94
|
+
/**
|
|
95
|
+
* Build a production {@link AsyncJobStateFile} backed by files under the
|
|
96
|
+
* caller-supplied `dir` (one JSON file per in-flight job, named
|
|
97
|
+
* `<state-hash>.json`). The caller — typically the Provider Descriptor —
|
|
98
|
+
* resolves `dir` via `asyncJobStateDir(capability)`; this module performs
|
|
99
|
+
* no cache-root resolution itself.
|
|
100
|
+
*
|
|
101
|
+
* - `write()` atomically creates the file with `{ flag: "wx" }`. A
|
|
102
|
+
* concurrent invocation that finds it exists throws EEXIST; the caller
|
|
103
|
+
* catches that and polls the existing job.
|
|
104
|
+
* - `read()` catches JSON parse errors, deletes the corrupt file, and
|
|
105
|
+
* returns `null`.
|
|
106
|
+
* - `remove()` deletes the file and ignores ENOENT.
|
|
107
|
+
*/
|
|
108
|
+
export declare function createProductionAsyncJobStateFile(dir: string): AsyncJobStateFile;
|
|
109
|
+
/**
|
|
110
|
+
* Convenience helper exported for the Adapter and tests: builds an
|
|
111
|
+
* in-memory {@link AsyncJobStateFile} that throws EEXIST on a second
|
|
112
|
+
* write to the same hash, mirroring the production `{ flag: "wx" }`
|
|
113
|
+
* contract exactly. The adapter's lifecycle must not depend on whether
|
|
114
|
+
* the state file is disk-backed or memory-backed.
|
|
115
|
+
*/
|
|
116
|
+
export declare function createInMemoryAsyncJobStateFile(): AsyncJobStateFile & {
|
|
117
|
+
readonly store: Map<string, string>;
|
|
118
|
+
};
|
|
119
|
+
//# sourceMappingURL=async-job-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-job-state.d.ts","sourceRoot":"","sources":["../../src/lib/async-job-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAUH;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,aAAa,CAAC;CAC5C;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAC1D,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7C;AAMD;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAuBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAQ9E;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iCAAiC,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAkEhF;AAED;;;;;;GAMG;AACH,wBAAgB,+BAA+B,IAAI,iBAAiB,GAAG;IACrE,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,CAgDA"}
|
|
@@ -1,38 +1,46 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* (tech-plan §3, T07).
|
|
2
|
+
* Async-job state file — resume mechanism for interrupted async jobs
|
|
3
|
+
* (tech-plan §3, T07 / FC-01).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
5
|
+
* Some Provider operations run asynchronously server-side: a create call
|
|
6
|
+
* starts the job and returns a `requestId`, then a poll call checks it
|
|
7
|
+
* until completion. Tavily Research is the first (POST /research →
|
|
8
|
+
* GET /research/{id}); Firecrawl async Crawl (FC-04) is the second. If
|
|
9
|
+
* the CLI exits (Ctrl-C, crash) mid-poll, the job keeps running and
|
|
10
|
+
* consuming credits/quota. Without a persistence mechanism, the next
|
|
11
|
+
* identical request would start a SECOND job — a double charge.
|
|
11
12
|
*
|
|
12
13
|
* This module persists `{ requestId, identityHash, createdAt, status }`
|
|
13
|
-
* to
|
|
14
|
-
*
|
|
15
|
-
*
|
|
14
|
+
* to `<state-dir>/<state-hash>.json` so the next invocation of the same
|
|
15
|
+
* request detects the in-flight job and polls it instead of creating a
|
|
16
|
+
* new one. The state-hash is deterministic for a given
|
|
16
17
|
* `{provider, capability, credentialFingerprint, request}` tuple (see
|
|
17
|
-
*
|
|
18
|
+
* {@link computeAsyncJobStateHash}). The state directory is injected by
|
|
19
|
+
* the caller (the Provider Descriptor resolves it via
|
|
20
|
+
* `asyncJobStateDir(capability)`); this module never touches the cache
|
|
21
|
+
* root, keeping it pure and unit-testable.
|
|
18
22
|
*
|
|
19
23
|
* Boundary rules (ARCHITECTURE.md §2):
|
|
20
|
-
* - May import
|
|
21
|
-
* - Must NOT import transport, command
|
|
22
|
-
* Adapter.
|
|
24
|
+
* - May import normalized errors (none today) and node builtins only.
|
|
25
|
+
* - Must NOT import cache-root resolution, transport, command
|
|
26
|
+
* presentation, or a Provider Adapter.
|
|
23
27
|
*
|
|
24
28
|
* Resilience contract (tech-plan §3 / G1-G3):
|
|
25
29
|
* - `write()` uses `{ flag: "wx" }` for atomic creation. A concurrent
|
|
26
30
|
* invocation that finds the file already exists gets EEXIST and
|
|
27
|
-
* polls the existing
|
|
31
|
+
* polls the existing job instead of creating a new one.
|
|
28
32
|
* - `read()` catches JSON parse errors, deletes the corrupt file, and
|
|
29
|
-
* returns `null` (treated as absent → new
|
|
33
|
+
* returns `null` (treated as absent → new job created).
|
|
30
34
|
* - `remove()` deletes the file and ignores ENOENT (already gone).
|
|
35
|
+
*
|
|
36
|
+
* Wire-compat: the persisted `requestId` field name and the `status`
|
|
37
|
+
* enum are fixed by the on-disk format and the SIGINT reader in
|
|
38
|
+
* `commands/research.ts`. They are NOT renamed even though the module
|
|
39
|
+
* is now async-job-generic (critique C1).
|
|
31
40
|
*/
|
|
32
41
|
import crypto from "node:crypto";
|
|
33
42
|
import * as fs from "node:fs/promises";
|
|
34
43
|
import path from "node:path";
|
|
35
|
-
import { researchStateDir } from "./cache.js";
|
|
36
44
|
/**
|
|
37
45
|
* Recursively sort object keys so `JSON.stringify` produces a stable
|
|
38
46
|
* representation regardless of insertion order. Mirrors the cache module's
|
|
@@ -54,8 +62,8 @@ function sortKeysDeep(value) {
|
|
|
54
62
|
return value;
|
|
55
63
|
}
|
|
56
64
|
/**
|
|
57
|
-
* Compute the deterministic state-file identity hash for
|
|
58
|
-
*
|
|
65
|
+
* Compute the deterministic state-file identity hash for an async job
|
|
66
|
+
* (tech-plan §3 / CR3).
|
|
59
67
|
*
|
|
60
68
|
* state-hash = SHA-256(recursively-key-sorted-JSON({
|
|
61
69
|
* provider, capability, credentialFingerprint, request
|
|
@@ -63,10 +71,10 @@ function sortKeysDeep(value) {
|
|
|
63
71
|
*
|
|
64
72
|
* Same canonical approach as `buildProviderCacheKey`'s request hashing,
|
|
65
73
|
* extended to include provider + capability + credential. Rotating the
|
|
66
|
-
* API key orphans old state files (correct — the old
|
|
74
|
+
* API key orphans old state files (correct — the old job belongs to the
|
|
67
75
|
* old key's billing). The hash never contains a raw credential.
|
|
68
76
|
*/
|
|
69
|
-
export function
|
|
77
|
+
export function computeAsyncJobStateHash(input) {
|
|
70
78
|
const payload = {
|
|
71
79
|
provider: input.provider,
|
|
72
80
|
capability: input.capability,
|
|
@@ -79,20 +87,22 @@ export function computeResearchStateHash(input) {
|
|
|
79
87
|
// Production state-file implementation
|
|
80
88
|
// ---------------------------------------------------------------------------
|
|
81
89
|
/**
|
|
82
|
-
* Build a production {@link
|
|
83
|
-
*
|
|
84
|
-
*
|
|
90
|
+
* Build a production {@link AsyncJobStateFile} backed by files under the
|
|
91
|
+
* caller-supplied `dir` (one JSON file per in-flight job, named
|
|
92
|
+
* `<state-hash>.json`). The caller — typically the Provider Descriptor —
|
|
93
|
+
* resolves `dir` via `asyncJobStateDir(capability)`; this module performs
|
|
94
|
+
* no cache-root resolution itself.
|
|
85
95
|
*
|
|
86
96
|
* - `write()` atomically creates the file with `{ flag: "wx" }`. A
|
|
87
97
|
* concurrent invocation that finds it exists throws EEXIST; the caller
|
|
88
|
-
* catches that and polls the existing
|
|
98
|
+
* catches that and polls the existing job.
|
|
89
99
|
* - `read()` catches JSON parse errors, deletes the corrupt file, and
|
|
90
100
|
* returns `null`.
|
|
91
101
|
* - `remove()` deletes the file and ignores ENOENT.
|
|
92
102
|
*/
|
|
93
|
-
export function
|
|
103
|
+
export function createProductionAsyncJobStateFile(dir) {
|
|
94
104
|
function filePath(identityHash) {
|
|
95
|
-
return path.join(
|
|
105
|
+
return path.join(dir, `${identityHash}.json`);
|
|
96
106
|
}
|
|
97
107
|
return {
|
|
98
108
|
async read(identityHash) {
|
|
@@ -129,19 +139,18 @@ export function createProductionResearchStateFile() {
|
|
|
129
139
|
}
|
|
130
140
|
catch {
|
|
131
141
|
// Corrupt JSON — delete the file so the next run creates a fresh
|
|
132
|
-
//
|
|
142
|
+
// job instead of forever reading garbage.
|
|
133
143
|
await fs.unlink(file).catch(() => { });
|
|
134
144
|
return null;
|
|
135
145
|
}
|
|
136
146
|
},
|
|
137
147
|
async write(identityHash, state) {
|
|
138
|
-
const dir = researchStateDir();
|
|
139
148
|
await fs.mkdir(dir, { recursive: true });
|
|
140
149
|
const file = filePath(identityHash);
|
|
141
150
|
const payload = JSON.stringify(state);
|
|
142
151
|
// `{ flag: "wx" }` atomically creates the file only if it does not
|
|
143
152
|
// exist. A concurrent invocation that lost the race gets EEXIST;
|
|
144
|
-
// the caller catches it and polls the existing
|
|
153
|
+
// the caller catches it and polls the existing job instead of
|
|
145
154
|
// creating a second one.
|
|
146
155
|
await fs.writeFile(file, payload, { flag: "wx" });
|
|
147
156
|
},
|
|
@@ -159,12 +168,12 @@ export function createProductionResearchStateFile() {
|
|
|
159
168
|
}
|
|
160
169
|
/**
|
|
161
170
|
* Convenience helper exported for the Adapter and tests: builds an
|
|
162
|
-
* in-memory {@link
|
|
171
|
+
* in-memory {@link AsyncJobStateFile} that throws EEXIST on a second
|
|
163
172
|
* write to the same hash, mirroring the production `{ flag: "wx" }`
|
|
164
173
|
* contract exactly. The adapter's lifecycle must not depend on whether
|
|
165
174
|
* the state file is disk-backed or memory-backed.
|
|
166
175
|
*/
|
|
167
|
-
export function
|
|
176
|
+
export function createInMemoryAsyncJobStateFile() {
|
|
168
177
|
const store = new Map();
|
|
169
178
|
return {
|
|
170
179
|
store,
|
|
@@ -211,4 +220,4 @@ export function createInMemoryResearchStateFile() {
|
|
|
211
220
|
},
|
|
212
221
|
};
|
|
213
222
|
}
|
|
214
|
-
//# sourceMappingURL=
|
|
223
|
+
//# sourceMappingURL=async-job-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-job-state.js","sourceRoot":"","sources":["../../src/lib/async-job-state.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/cache.d.ts
CHANGED
|
@@ -70,18 +70,26 @@ export declare function resolveCacheRootPure(env: CacheDirEnvironment, plat: Cac
|
|
|
70
70
|
*/
|
|
71
71
|
export declare function toolCacheDir(): string;
|
|
72
72
|
/**
|
|
73
|
-
* Directory for
|
|
74
|
-
*
|
|
75
|
-
*
|
|
73
|
+
* Directory for async-job state files (tech-plan §3, T07 / FC-01). One
|
|
74
|
+
* subdirectory per capability under the unified cache root — `research/`
|
|
75
|
+
* for in-flight research tasks, `crawl/` for async crawl jobs — sibling
|
|
76
|
+
* of {@link responseCacheDir} and {@link toolCacheDir}.
|
|
76
77
|
*
|
|
77
|
-
* Each file holds a single in-flight
|
|
78
|
-
*
|
|
79
|
-
* (double-charge prevention).
|
|
78
|
+
* Each file holds a single in-flight task's `requestId` so the CLI can
|
|
79
|
+
* resume polling after Ctrl-C instead of creating a second task
|
|
80
|
+
* (double-charge prevention). State files have their own lifecycle
|
|
80
81
|
* (deleted on task completion or failure); they are NOT cleared by
|
|
81
82
|
* `clearAllCaches()` and are NOT scanned by `cacheStats()` — they are
|
|
82
83
|
* billing state, not cache entries.
|
|
83
|
-
|
|
84
|
-
|
|
84
|
+
*
|
|
85
|
+
* `capability` is the single path segment naming the subdirectory. It is
|
|
86
|
+
* guarded: a non-empty segment with no path separators, no `..`/`.`
|
|
87
|
+
* self-references, and no NUL bytes, whose resolved path stays inside the
|
|
88
|
+
* cache root. A bad segment throws rather than silently writing billing
|
|
89
|
+
* state outside the root. Callers pass an internal constant
|
|
90
|
+
* (`"research"`, `"crawl"`); it is never user input.
|
|
91
|
+
*/
|
|
92
|
+
export declare function asyncJobStateDir(capability: string): string;
|
|
85
93
|
/**
|
|
86
94
|
* Call-time cache-enabled check for the RESPONSE cache (H1 fix). Honours
|
|
87
95
|
* `SCOUTLINE_CACHE` (canonical) with `ZAI_CACHE` as a legacy alias. Read
|
package/dist/lib/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/lib/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAWxD;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,mBAAmB,EAAE,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAI7F;AAqBD;;;;;;GAMG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/lib/cache.ts"],"names":[],"mappings":"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"}
|