@jinn-network/client 0.1.9-canary.95c0ef5f → 0.1.9-canary.96fab2ed

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/api/launcher-endpoints.js +6 -1
  2. package/dist/api/launcher-endpoints.js.map +1 -1
  3. package/dist/api/launcher-tasks.d.ts +47 -0
  4. package/dist/api/launcher-tasks.js +88 -3
  5. package/dist/api/launcher-tasks.js.map +1 -1
  6. package/dist/bin/jinn-distil-mcp.js +813 -0
  7. package/dist/bin/jinn-layer.js +1008 -63
  8. package/dist/build-info.json +4 -4
  9. package/dist/build-meta.json +1 -1
  10. package/dist/captures/distil-export.d.ts +54 -0
  11. package/dist/captures/distil-export.js +135 -0
  12. package/dist/captures/distil-export.js.map +1 -0
  13. package/dist/dashboard/assets/{index-DutC5x2k.js → index-B2VRYqxE.js} +11 -11
  14. package/dist/dashboard/assets/index-D7rvJRNa.css +1 -0
  15. package/dist/dashboard/index.html +2 -2
  16. package/dist/discovery/http.js +83 -1
  17. package/dist/discovery/http.js.map +1 -1
  18. package/dist/discovery/onchain.js +12 -0
  19. package/dist/discovery/onchain.js.map +1 -1
  20. package/dist/discovery/types.d.ts +43 -0
  21. package/dist/discovery/types.js.map +1 -1
  22. package/dist/discovery/with-fallback.js +10 -0
  23. package/dist/discovery/with-fallback.js.map +1 -1
  24. package/dist/eval/capability-slate.d.ts +54 -0
  25. package/dist/eval/capability-slate.js +116 -0
  26. package/dist/eval/capability-slate.js.map +1 -0
  27. package/dist/eval/capability-stats.d.ts +39 -0
  28. package/dist/eval/capability-stats.js +123 -0
  29. package/dist/eval/capability-stats.js.map +1 -0
  30. package/dist/eval/contested-band.d.ts +18 -0
  31. package/dist/eval/contested-band.js +19 -0
  32. package/dist/eval/contested-band.js.map +1 -0
  33. package/dist/eval/corpus-index.d.ts +21 -0
  34. package/dist/eval/corpus-index.js +55 -0
  35. package/dist/eval/corpus-index.js.map +1 -0
  36. package/dist/eval/disjointness.d.ts +26 -0
  37. package/dist/eval/disjointness.js +67 -0
  38. package/dist/eval/disjointness.js.map +1 -0
  39. package/dist/eval/mcnemar-power.d.ts +14 -0
  40. package/dist/eval/mcnemar-power.js +40 -0
  41. package/dist/eval/mcnemar-power.js.map +1 -0
  42. package/dist/harnesses/impls/learner/adapters/codex-code.d.ts +3 -1
  43. package/dist/harnesses/impls/learner/adapters/codex-code.js +39 -4
  44. package/dist/harnesses/impls/learner/adapters/codex-code.js.map +1 -1
  45. package/dist/main.js +26 -0
  46. package/dist/main.js.map +1 -1
  47. package/dist/monitoring/net-liveness.d.ts +143 -0
  48. package/dist/monitoring/net-liveness.js +301 -0
  49. package/dist/monitoring/net-liveness.js.map +1 -0
  50. package/dist/pilot/cost.d.ts +19 -0
  51. package/dist/pilot/cost.js +31 -0
  52. package/dist/pilot/cost.js.map +1 -0
  53. package/dist/pilot/instance.d.ts +20 -0
  54. package/dist/pilot/instance.js +19 -0
  55. package/dist/pilot/instance.js.map +1 -0
  56. package/dist/pilot/repo.d.ts +31 -0
  57. package/dist/pilot/repo.js +42 -0
  58. package/dist/pilot/repo.js.map +1 -0
  59. package/dist/pilot/solve.d.ts +22 -0
  60. package/dist/pilot/solve.js +37 -0
  61. package/dist/pilot/solve.js.map +1 -0
  62. package/dist/pilot/tally.d.ts +35 -0
  63. package/dist/pilot/tally.js +61 -0
  64. package/dist/pilot/tally.js.map +1 -0
  65. package/dist/plugins/local-trace-distiller/.claude-plugin/plugin.json +9 -0
  66. package/dist/plugins/local-trace-distiller/.codex-plugin/plugin.json +41 -0
  67. package/dist/plugins/local-trace-distiller/.mcp.json +8 -0
  68. package/dist/plugins/local-trace-distiller/README.md +27 -0
  69. package/dist/plugins/local-trace-distiller/jinn.plugin.json +36 -0
  70. package/dist/plugins/local-trace-distiller/skills/distill/SKILL.md +51 -0
  71. package/dist/spend/credential.d.ts +2 -2
  72. package/dist/spend/credential.js +9 -3
  73. package/dist/spend/credential.js.map +1 -1
  74. package/dist/store/store.d.ts +7 -0
  75. package/dist/store/store.js +1 -0
  76. package/dist/store/store.js.map +1 -1
  77. package/dist/trajectory/scrub/secretlint-stage.js +10 -1
  78. package/dist/trajectory/scrub/secretlint-stage.js.map +1 -1
  79. package/dist/util/redact-rpc-urls.d.ts +1 -1
  80. package/dist/util/redact-rpc-urls.js +57 -2
  81. package/dist/util/redact-rpc-urls.js.map +1 -1
  82. package/package.json +5 -2
  83. package/plugins/local-trace-distiller/.claude-plugin/plugin.json +9 -0
  84. package/plugins/local-trace-distiller/.codex-plugin/plugin.json +41 -0
  85. package/plugins/local-trace-distiller/.mcp.json +8 -0
  86. package/plugins/local-trace-distiller/README.md +27 -0
  87. package/plugins/local-trace-distiller/jinn.plugin.json +36 -0
  88. package/plugins/local-trace-distiller/skills/distill/SKILL.md +51 -0
  89. package/dist/dashboard/assets/index-DJvvj6nF.css +0 -1
@@ -21,6 +21,10 @@ function parseCursor(raw) {
21
21
  // SPA can pass either form without a wrapper layer.
22
22
  return raw;
23
23
  }
24
+ function parseManifestCid(raw) {
25
+ const trimmed = raw?.trim();
26
+ return trimmed ? trimmed : undefined;
27
+ }
24
28
  export function addLauncherRoutes(app, deps) {
25
29
  app.get('/v1/launcher/status', async (c) => {
26
30
  const body = await gatherLauncherStatus({ ...deps, config: deps.getConfig() });
@@ -29,7 +33,8 @@ export function addLauncherRoutes(app, deps) {
29
33
  app.get('/v1/launcher/tasks', async (c) => {
30
34
  const limit = parseLimit(c.req.query('limit'));
31
35
  const before = parseCursor(c.req.query('cursor'));
32
- const body = await gatherLauncherTasks({ ...deps.tasksDeps, config: deps.getConfig() }, { limit, ...(before ? { before } : {}) });
36
+ const manifestCid = parseManifestCid(c.req.query('manifestCid'));
37
+ const body = await gatherLauncherTasks({ ...deps.tasksDeps, config: deps.getConfig() }, { limit, ...(before ? { before } : {}), ...(manifestCid ? { manifestCid } : {}) });
33
38
  return c.json(body);
34
39
  });
35
40
  // Legacy launcher-mode SolverNet patch (`PATCH /v1/launcher/solvernets/:name`)
@@ -1 +1 @@
1
- {"version":3,"file":"launcher-endpoints.js","sourceRoot":"","sources":["../../src/api/launcher-endpoints.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,oBAAoB,GAErB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,mBAAmB,GAEpB,MAAM,qBAAqB,CAAC;AA+B7B,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC,SAAS,UAAU,CAAC,GAAuB;IACzC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,aAAa,CAAC;IACnD,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,WAAW,CAAC,GAAuB;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1E,0EAA0E;IAC1E,oDAAoD;IACpD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAS,EAAE,IAAwB;IACnE,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACzC,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC/E,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,MAAM,mBAAmB,CACpC,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,EAC/C,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CACzC,CAAC;QACF,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,6EAA6E;IAC7E,uEAAuE;IACvE,sEAAsE;IACtE,uEAAuE;IACvE,yEAAyE;IACzE,oEAAoE;IACpE,oEAAoE;IACpE,GAAG,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACrD,OAAO,CAAC,CAAC,IAAI,CACX;YACE,KAAK,EAAE,MAAM;YACb,OAAO,EACL,4OAA4O;SAC/O,EACD,GAAG,CACJ,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"launcher-endpoints.js","sourceRoot":"","sources":["../../src/api/launcher-endpoints.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { JinnConfig } from '../config.js';
2
+ import type { TaskOnchainStatus, TaskStatusSnapshot } from '../discovery/types.js';
2
3
  export type LauncherTaskState = 'open' | 'claims-in-flight' | 'fully-claimed' | 'settled' | 'failed';
3
4
  export interface LauncherTaskEntry {
4
5
  taskId: string;
@@ -7,6 +8,13 @@ export interface LauncherTaskEntry {
7
8
  solverType?: string;
8
9
  postedAt: string;
9
10
  state: LauncherTaskState;
11
+ /**
12
+ * On-chain finalization status (#579), sourced from the indexer `task` table
13
+ * (`finalized`/`refunded`/`claimWindowEnd`) — DISTINCT from the local,
14
+ * generator-side `state`. `'unknown'` is the safe degraded default (no
15
+ * snapshot / indexer outage); never guessed as `'open'`.
16
+ */
17
+ onchainStatus: TaskOnchainStatus;
10
18
  claims: {
11
19
  current: number;
12
20
  max: number;
@@ -32,6 +40,14 @@ export interface LauncherTasksResponse {
32
40
  /** A single posted-Task row as surfaced by the daemon's store accessor. */
33
41
  export interface PostedTaskRecord {
34
42
  taskId: string;
43
+ /**
44
+ * On-chain decimal taskId (#579). DISTINCT from `taskId`, which is the
45
+ * off-chain task-document id (UUID / solver-type slug). The indexer status
46
+ * map is keyed by this on-chain id, so `mapRecordToEntry` looks the chip up
47
+ * by `protocolTaskId` (falling back to `taskId` for older/test rows that
48
+ * don't carry it). Optional: pre-migration rows omit it.
49
+ */
50
+ protocolTaskId?: string;
35
51
  taskCid: string;
36
52
  /** Optional — if present, used to derive `solverNet` via config lookup. */
37
53
  solverType?: string;
@@ -65,6 +81,13 @@ export interface GatherLauncherTasksDeps {
65
81
  config: Pick<JinnConfig, 'joinedSolverNets'>;
66
82
  creatorAddress: string;
67
83
  fetchPostedTasks: (opts: FetchPostedTasksOptions) => Promise<PostedTaskRecord[]> | PostedTaskRecord[];
84
+ /**
85
+ * Optional on-chain status fetcher (#579), keyed by SolverNet manifest CID.
86
+ * Optional so existing call-sites/tests compile and degrade to 'unknown'.
87
+ * Each call is wrapped in try/catch by the gatherer — a throw yields the
88
+ * graceful all-'unknown' default rather than failing the whole response.
89
+ */
90
+ fetchTaskStatuses?: (manifestCid: string) => Promise<Map<string, TaskStatusSnapshot>>;
68
91
  now?: () => number;
69
92
  }
70
93
  export interface GatherLauncherTasksOptions {
@@ -72,5 +95,29 @@ export interface GatherLauncherTasksOptions {
72
95
  limit?: number;
73
96
  /** ISO-8601 timestamp; filter to rows with `postedAt < before`. */
74
97
  before?: string;
98
+ /**
99
+ * Optional launched-record manifest CID. When present, on-chain statuses are
100
+ * fetched only for this SolverNet, even if the launcher has not joined it.
101
+ */
102
+ manifestCid?: string;
75
103
  }
104
+ /**
105
+ * Derive the on-chain status chip (#579) from a task's finalization snapshot.
106
+ *
107
+ * - `undefined` snapshot → 'unknown' (no on-chain data; the safe default — we
108
+ * never guess 'open').
109
+ * - `finalized === true` → 'finalized'.
110
+ * - `refunded === true` → 'finalized': a refunded task is on-chain-closed (the
111
+ * creator reclaimed budget), so it is terminal just like a finalized one. We
112
+ * collapse both into the 'finalized' chip rather than adding a 'refunded'
113
+ * tone — the launcher table only distinguishes open / closed / expired.
114
+ * - missing/invalid `claimWindowEnd` → 'unknown' (the indexer cannot prove
115
+ * that claims are still open).
116
+ * - not finalized, `now > claimWindowEnd` → 'expired'. Exact equality remains
117
+ * open, matching `TaskCoordinator.claimTask`.
118
+ * - otherwise → 'open'.
119
+ *
120
+ * `nowSeconds` is unix seconds, matching the indexer's `claimWindowEnd`.
121
+ */
122
+ export declare function deriveOnchainStatus(snapshot: TaskStatusSnapshot | undefined, nowSeconds: number): TaskOnchainStatus;
76
123
  export declare function gatherLauncherTasks(deps: GatherLauncherTasksDeps, opts?: GatherLauncherTasksOptions): Promise<LauncherTasksResponse>;
@@ -65,7 +65,66 @@ function buildSolverTypeToNetIndex(joinedSolverNets) {
65
65
  }
66
66
  return index;
67
67
  }
68
- function mapRecordToEntry(record, solverTypeIndex) {
68
+ function normalizeManifestCid(raw) {
69
+ const trimmed = raw?.trim();
70
+ return trimmed ? trimmed : undefined;
71
+ }
72
+ function statusLookupManifestCids(joinedSolverNets, launchedManifestCid, records) {
73
+ const scopedCid = normalizeManifestCid(launchedManifestCid);
74
+ if (scopedCid)
75
+ return [scopedCid];
76
+ const solverTypes = new Set(records.map((record) => record.solverType).filter(Boolean));
77
+ if (solverTypes.size > 0) {
78
+ const cids = new Set();
79
+ for (const [cid, joined] of Object.entries(joinedSolverNets ?? {})) {
80
+ const solverType = solverTypeFromJoinedContract(joined);
81
+ if (!solverType || !solverTypes.has(solverType))
82
+ continue;
83
+ const normalized = normalizeManifestCid(joined.manifestCid) ?? normalizeManifestCid(cid);
84
+ if (normalized)
85
+ cids.add(normalized);
86
+ }
87
+ return [...cids];
88
+ }
89
+ const cids = new Set();
90
+ for (const [cid, joined] of Object.entries(joinedSolverNets ?? {})) {
91
+ const normalized = normalizeManifestCid(joined.manifestCid) ?? normalizeManifestCid(cid);
92
+ if (normalized)
93
+ cids.add(normalized);
94
+ }
95
+ return [...cids];
96
+ }
97
+ /**
98
+ * Derive the on-chain status chip (#579) from a task's finalization snapshot.
99
+ *
100
+ * - `undefined` snapshot → 'unknown' (no on-chain data; the safe default — we
101
+ * never guess 'open').
102
+ * - `finalized === true` → 'finalized'.
103
+ * - `refunded === true` → 'finalized': a refunded task is on-chain-closed (the
104
+ * creator reclaimed budget), so it is terminal just like a finalized one. We
105
+ * collapse both into the 'finalized' chip rather than adding a 'refunded'
106
+ * tone — the launcher table only distinguishes open / closed / expired.
107
+ * - missing/invalid `claimWindowEnd` → 'unknown' (the indexer cannot prove
108
+ * that claims are still open).
109
+ * - not finalized, `now > claimWindowEnd` → 'expired'. Exact equality remains
110
+ * open, matching `TaskCoordinator.claimTask`.
111
+ * - otherwise → 'open'.
112
+ *
113
+ * `nowSeconds` is unix seconds, matching the indexer's `claimWindowEnd`.
114
+ */
115
+ export function deriveOnchainStatus(snapshot, nowSeconds) {
116
+ if (!snapshot)
117
+ return 'unknown';
118
+ if (snapshot.finalized || snapshot.refunded)
119
+ return 'finalized';
120
+ if (typeof snapshot.claimWindowEnd !== 'number' || !Number.isFinite(snapshot.claimWindowEnd)) {
121
+ return 'unknown';
122
+ }
123
+ if (nowSeconds > snapshot.claimWindowEnd)
124
+ return 'expired';
125
+ return 'open';
126
+ }
127
+ function mapRecordToEntry(record, solverTypeIndex, statusMap, nowSeconds) {
69
128
  const solverNet = record.solverNet
70
129
  ?? (record.solverType ? solverTypeIndex.get(record.solverType) : undefined)
71
130
  ?? 'unknown';
@@ -80,6 +139,10 @@ function mapRecordToEntry(record, solverTypeIndex) {
80
139
  ...(record.solverType ? { solverType: record.solverType } : {}),
81
140
  postedAt: record.postedAt,
82
141
  state: record.state ?? 'open',
142
+ onchainStatus: deriveOnchainStatus(
143
+ // The status map is keyed by the on-chain decimal taskId; prefer it. Fall
144
+ // back to the off-chain display id for older/test rows lacking it (#579).
145
+ statusMap.get(record.protocolTaskId ?? record.taskId), nowSeconds),
83
146
  claims: { current: claimsCurrent, max: claimsMax },
84
147
  budget: { totalWei, remainingWei },
85
148
  };
@@ -113,12 +176,34 @@ export async function gatherLauncherTasks(deps, opts = {}) {
113
176
  return 1;
114
177
  return 0;
115
178
  });
179
+ const pageRecords = sorted.slice(0, limit);
116
180
  const solverTypeIndex = buildSolverTypeToNetIndex(deps.config.joinedSolverNets);
117
- const tasks = sorted.slice(0, limit).map((record) => mapRecordToEntry(record, solverTypeIndex));
181
+ // Build a merged on-chain status map keyed by taskId. The launched-SolverNet
182
+ // page scopes this to its manifest CID; the generic fallback only checks
183
+ // joined SolverNets matching the current page's solver types to avoid
184
+ // unbounded dashboard-poll fanout. Each call is guarded so the store-only /
185
+ // offline / indexer-outage path degrades to all-'unknown' (#579).
186
+ const generatedAtMs = deps.now?.() ?? Date.now();
187
+ const nowSeconds = Math.floor(generatedAtMs / 1000);
188
+ const statusMap = new Map();
189
+ const fetchTaskStatuses = deps.fetchTaskStatuses;
190
+ if (fetchTaskStatuses) {
191
+ for (const cid of statusLookupManifestCids(deps.config.joinedSolverNets, opts.manifestCid, pageRecords)) {
192
+ try {
193
+ const snapshots = await fetchTaskStatuses(cid);
194
+ for (const [taskId, snapshot] of snapshots)
195
+ statusMap.set(taskId, snapshot);
196
+ }
197
+ catch {
198
+ // Tolerant: skip this SolverNet's statuses; its tasks render 'unknown'.
199
+ }
200
+ }
201
+ }
202
+ const tasks = pageRecords
203
+ .map((record) => mapRecordToEntry(record, solverTypeIndex, statusMap, nowSeconds));
118
204
  const cursor = tasks.length === limit && tasks.length > 0
119
205
  ? { before: tasks[tasks.length - 1].postedAt }
120
206
  : undefined;
121
- const generatedAtMs = deps.now?.() ?? Date.now();
122
207
  const response = {
123
208
  schemaVersion: 1,
124
209
  generatedAt: new Date(generatedAtMs).toISOString(),
@@ -1 +1 @@
1
- {"version":3,"file":"launcher-tasks.js","sourceRoot":"","sources":["../../src/api/launcher-tasks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"launcher-tasks.js","sourceRoot":"","sources":["../../src/api/launcher-tasks.ts"],"names":[],"mappings":"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"}