tenjin-cli 0.1.0-alpha.1 → 0.1.0-alpha.3
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/NOTICE.md +33 -0
- package/README.md +167 -16
- package/dist/{_esm-ZH2J4QEH.js → _esm-C5CRWCYU.js} +2 -2
- package/dist/_esm-FEASBWRP.js +881 -0
- package/dist/buy-EE6SEXP6.js +1598 -0
- package/dist/buy-EE6SEXP6.js.map +1 -0
- package/dist/candidate-ERMSYYQZ.js +127 -0
- package/dist/candidate-ERMSYYQZ.js.map +1 -0
- package/dist/{ccip-UCLT5VOW.js → ccip-NQXCEK2U.js} +6 -5
- package/dist/ccip-XR5NE5QK.js +19 -0
- package/dist/chunk-2I4QTOLB.js +11 -0
- package/dist/chunk-2I4QTOLB.js.map +1 -0
- package/dist/chunk-3OV7E5G5.js +18 -0
- package/dist/chunk-3OV7E5G5.js.map +1 -0
- package/dist/chunk-4ONXEEQL.js +152 -0
- package/dist/chunk-4ONXEEQL.js.map +1 -0
- package/dist/chunk-5CLSD5YN.js +209 -0
- package/dist/chunk-5CLSD5YN.js.map +1 -0
- package/dist/chunk-662MSGZB.js +286 -0
- package/dist/chunk-662MSGZB.js.map +1 -0
- package/dist/chunk-7KUW4MJD.js +59 -0
- package/dist/chunk-7KUW4MJD.js.map +1 -0
- package/dist/{doctor-3QBYN46N.js → chunk-AWPAWHNX.js} +88 -93
- package/dist/chunk-AWPAWHNX.js.map +1 -0
- package/dist/chunk-CYOF7ROH.js +70 -0
- package/dist/chunk-CYOF7ROH.js.map +1 -0
- package/dist/chunk-DXTQ3CSI.js +171 -0
- package/dist/chunk-DXTQ3CSI.js.map +1 -0
- package/dist/{chunk-EZROUI5U.js → chunk-ESPNTPQ2.js} +80 -8
- package/dist/chunk-ESPNTPQ2.js.map +1 -0
- package/dist/chunk-FJPLRISB.js +79 -0
- package/dist/chunk-FJPLRISB.js.map +1 -0
- package/dist/chunk-GO75V3NZ.js +160 -0
- package/dist/chunk-GO75V3NZ.js.map +1 -0
- package/dist/chunk-HIVZG55D.js +204 -0
- package/dist/chunk-HIVZG55D.js.map +1 -0
- package/dist/chunk-HSDCI7OV.js +7806 -0
- package/dist/chunk-HSDCI7OV.js.map +1 -0
- package/dist/chunk-JPHG2JW3.js +96 -0
- package/dist/chunk-JPHG2JW3.js.map +1 -0
- package/dist/{chunk-ZPZFPVDN.js → chunk-MUBUQVC3.js} +1 -1
- package/dist/chunk-MUBUQVC3.js.map +1 -0
- package/dist/{chunk-T4LKNY7T.js → chunk-NCE5NSN6.js} +166 -11
- package/dist/chunk-NCE5NSN6.js.map +1 -0
- package/dist/{chunk-YG2DO46P.js → chunk-OYMYCW7J.js} +18 -3
- package/dist/{chunk-YG2DO46P.js.map → chunk-OYMYCW7J.js.map} +1 -1
- package/dist/{chunk-Q53IYV2G.js → chunk-QVX5MWJZ.js} +20 -17
- package/dist/{chunk-Q53IYV2G.js.map → chunk-QVX5MWJZ.js.map} +1 -1
- package/dist/{chunk-CUWUHTIL.js → chunk-RBJPAZFI.js} +16 -202
- package/dist/chunk-RBJPAZFI.js.map +1 -0
- package/dist/chunk-RRN3YTK7.js +6199 -0
- package/dist/chunk-RRN3YTK7.js.map +1 -0
- package/dist/chunk-RY4XKNV3.js +140 -0
- package/dist/chunk-RY4XKNV3.js.map +1 -0
- package/dist/chunk-S3IGX57D.js +14682 -0
- package/dist/chunk-S3IGX57D.js.map +1 -0
- package/dist/chunk-TLCMMYLY.js +126 -0
- package/dist/chunk-TLCMMYLY.js.map +1 -0
- package/dist/{chunk-IPOWB3G3.js → chunk-UGX7YPX2.js} +3314 -306
- package/dist/chunk-UGX7YPX2.js.map +1 -0
- package/dist/chunk-UO22YNY4.js +69 -0
- package/dist/chunk-UO22YNY4.js.map +1 -0
- package/dist/{config-CEFTL5ZL.js → chunk-XHC6FCGZ.js} +115 -18
- package/dist/chunk-XHC6FCGZ.js.map +1 -0
- package/dist/chunk-XJIW7USF.js +217 -0
- package/dist/chunk-XJIW7USF.js.map +1 -0
- package/dist/{chunk-BRJHUQSY.js → chunk-YALGASEU.js} +1548 -1452
- package/dist/chunk-YALGASEU.js.map +1 -0
- package/dist/{chunk-DXPYFVKG.js → chunk-YN5SHIXQ.js} +6 -6
- package/dist/chunk-YN5SHIXQ.js.map +1 -0
- package/dist/chunk-Z52RA3NC.js +137 -0
- package/dist/chunk-Z52RA3NC.js.map +1 -0
- package/dist/{chunk-EXBMF5X7.js → chunk-Z6MFJV5Z.js} +151 -19
- package/dist/chunk-Z6MFJV5Z.js.map +1 -0
- package/dist/chunk-ZABPQJ3M.js +83 -0
- package/dist/chunk-ZABPQJ3M.js.map +1 -0
- package/dist/{chunk-LPRVHM7P.js → chunk-ZMHYXMO6.js} +1655 -114
- package/dist/chunk-ZMHYXMO6.js.map +1 -0
- package/dist/{chunk-3IMLRUZE.js → chunk-ZXTAQYNA.js} +6 -2
- package/dist/{cli-WA65NP4Y.js → cli-SBXI5AMS.js} +177 -177
- package/dist/cli-SBXI5AMS.js.map +1 -0
- package/dist/config-VELDKLHY.js +21 -0
- package/dist/doctor-T3KWNNP2.js +20 -0
- package/dist/doctor-T3KWNNP2.js.map +1 -0
- package/dist/ethersCompat-Df4a6QIZ-3YZIAXDK.js +18 -0
- package/dist/ethersCompat-Df4a6QIZ-3YZIAXDK.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/inspect-LMKOXE4Y.js +96 -0
- package/dist/inspect-LMKOXE4Y.js.map +1 -0
- package/dist/install-LEX3ENQ6.js +387 -0
- package/dist/install-LEX3ENQ6.js.map +1 -0
- package/dist/lookup-ZPN2Q67N.js +129 -0
- package/dist/lookup-ZPN2Q67N.js.map +1 -0
- package/dist/{mine.wasm-GQECMSGN.js → mine.wasm-6PIT3DK6.js} +2 -2
- package/dist/outcome-N7TAK6WR.js +66 -0
- package/dist/outcome-N7TAK6WR.js.map +1 -0
- package/dist/publish-BKBQQAW4.js +1478 -0
- package/dist/publish-BKBQQAW4.js.map +1 -0
- package/dist/{secp256k1-BEZS642W.js → secp256k1-N3ZHU7LB.js} +5 -4
- package/dist/secp256k1-N3ZHU7LB.js.map +1 -0
- package/dist/usdc-JIAJW4SV.js +22 -0
- package/dist/usdc-JIAJW4SV.js.map +1 -0
- package/dist/viemAdapter-By13KInL-ZZE6UV4Y.js +14 -0
- package/dist/viemAdapter-By13KInL-ZZE6UV4Y.js.map +1 -0
- package/dist/{wallet-XD576HF3.js → wallet-CWEMYVIH.js} +28 -22
- package/dist/{wallet-XD576HF3.js.map → wallet-CWEMYVIH.js.map} +1 -1
- package/dist/wallet-PA54CRBL.js +30 -0
- package/dist/wallet-PA54CRBL.js.map +1 -0
- package/package.json +19 -16
- package/skills/tenjin/SKILL.md +199 -0
- package/skills/tenjin-publish/SKILL.md +111 -0
- package/skills/tenjin-search/SKILL.md +133 -0
- package/dist/chunk-BRJHUQSY.js.map +0 -1
- package/dist/chunk-CUWUHTIL.js.map +0 -1
- package/dist/chunk-DXPYFVKG.js.map +0 -1
- package/dist/chunk-EXBMF5X7.js.map +0 -1
- package/dist/chunk-EZROUI5U.js.map +0 -1
- package/dist/chunk-IPOWB3G3.js.map +0 -1
- package/dist/chunk-LPRVHM7P.js.map +0 -1
- package/dist/chunk-T4LKNY7T.js.map +0 -1
- package/dist/chunk-ZPZFPVDN.js.map +0 -1
- package/dist/cli-WA65NP4Y.js.map +0 -1
- package/dist/config-CEFTL5ZL.js.map +0 -1
- package/dist/doctor-3QBYN46N.js.map +0 -1
- package/dist/usdc-44R6XZF2.js +0 -18
- package/dist/wallet-ELBTBMXO.js +0 -20
- /package/dist/{_esm-ZH2J4QEH.js.map → _esm-C5CRWCYU.js.map} +0 -0
- /package/dist/{ccip-UCLT5VOW.js.map → _esm-FEASBWRP.js.map} +0 -0
- /package/dist/{chunk-3IMLRUZE.js.map → ccip-NQXCEK2U.js.map} +0 -0
- /package/dist/{secp256k1-BEZS642W.js.map → ccip-XR5NE5QK.js.map} +0 -0
- /package/dist/{usdc-44R6XZF2.js.map → chunk-ZXTAQYNA.js.map} +0 -0
- /package/dist/{wallet-ELBTBMXO.js.map → config-VELDKLHY.js.map} +0 -0
- /package/dist/{mine.wasm-GQECMSGN.js.map → mine.wasm-6PIT3DK6.js.map} +0 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { createRequire as __tenjinCreateRequire } from 'node:module'; const require = __tenjinCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
assertOnBaseOrigin
|
|
4
|
+
} from "./chunk-7KUW4MJD.js";
|
|
5
|
+
import {
|
|
6
|
+
recordLookup
|
|
7
|
+
} from "./chunk-JPHG2JW3.js";
|
|
8
|
+
import {
|
|
9
|
+
buildLookupRequest,
|
|
10
|
+
postLookup
|
|
11
|
+
} from "./chunk-662MSGZB.js";
|
|
12
|
+
import {
|
|
13
|
+
listCandidates
|
|
14
|
+
} from "./chunk-TLCMMYLY.js";
|
|
15
|
+
import "./chunk-3OV7E5G5.js";
|
|
16
|
+
import {
|
|
17
|
+
sanitizeForTerminal
|
|
18
|
+
} from "./chunk-Z52RA3NC.js";
|
|
19
|
+
import "./chunk-4ONXEEQL.js";
|
|
20
|
+
import "./chunk-FJPLRISB.js";
|
|
21
|
+
import {
|
|
22
|
+
resolveContextSettings
|
|
23
|
+
} from "./chunk-GO75V3NZ.js";
|
|
24
|
+
import {
|
|
25
|
+
parseUsdToAtomic
|
|
26
|
+
} from "./chunk-ESPNTPQ2.js";
|
|
27
|
+
import "./chunk-2I4QTOLB.js";
|
|
28
|
+
import "./chunk-YBMMV4Y4.js";
|
|
29
|
+
import "./chunk-UO22YNY4.js";
|
|
30
|
+
import "./chunk-MUBUQVC3.js";
|
|
31
|
+
import {
|
|
32
|
+
CliError
|
|
33
|
+
} from "./chunk-OYMYCW7J.js";
|
|
34
|
+
import "./chunk-ZXTAQYNA.js";
|
|
35
|
+
|
|
36
|
+
// src/commands/lookup.ts
|
|
37
|
+
async function runLookup(args, ctx, deps = {}) {
|
|
38
|
+
const settings = await resolveContextSettings(ctx);
|
|
39
|
+
const input = { question: args.question };
|
|
40
|
+
if (args.maxPrice !== void 0) input.maxPrice = parseUsdToAtomic(args.maxPrice);
|
|
41
|
+
if (args.freshWithin !== void 0) input.freshWithin = args.freshWithin;
|
|
42
|
+
if (args.limit !== void 0) input.limit = parseLimit(args.limit);
|
|
43
|
+
if (args.appliesTo !== void 0 && args.appliesTo.length > 0) {
|
|
44
|
+
input.appliesTo = parseAppliesTo(args.appliesTo);
|
|
45
|
+
}
|
|
46
|
+
const request = buildLookupRequest(input);
|
|
47
|
+
const response = await postLookup(request, {
|
|
48
|
+
baseUrl: settings.baseUrl,
|
|
49
|
+
timeoutMs: ctx.flags.timeout,
|
|
50
|
+
evalCohort: settings.evalCohort,
|
|
51
|
+
...deps.fetchImpl !== void 0 ? { fetchImpl: deps.fetchImpl } : {}
|
|
52
|
+
});
|
|
53
|
+
const candidates = response.candidates ?? [];
|
|
54
|
+
for (const c of candidates) {
|
|
55
|
+
try {
|
|
56
|
+
assertOnBaseOrigin(c.url, settings.baseUrl, "lookup candidate URL");
|
|
57
|
+
} catch (err) {
|
|
58
|
+
throw new CliError(
|
|
59
|
+
"CONTRACT_MISMATCH",
|
|
60
|
+
`Lookup candidate ${c.resourceId} points off the configured base URL.`,
|
|
61
|
+
{ cause: err }
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
await recordLookup(ctx.dataDir, {
|
|
66
|
+
lookupId: response.lookupId,
|
|
67
|
+
at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
68
|
+
question: request.question,
|
|
69
|
+
decision: response.decision,
|
|
70
|
+
candidates: candidates.map((c) => ({
|
|
71
|
+
resourceId: c.resourceId,
|
|
72
|
+
url: c.url,
|
|
73
|
+
title: c.title,
|
|
74
|
+
price: c.price
|
|
75
|
+
}))
|
|
76
|
+
});
|
|
77
|
+
if (response.decision === "MISS") await emitCandidateNudge(ctx);
|
|
78
|
+
const humanLines = response.decision === "MISS" ? [`MISS, no candidates (lookupId ${response.lookupId})`] : [
|
|
79
|
+
`${candidates.length} candidate(s) (lookupId ${response.lookupId}):`,
|
|
80
|
+
...candidates.map(
|
|
81
|
+
(c, i) => ` ${i + 1}. ${sanitizeForTerminal(c.title)}, ${c.price} atomic, ${sanitizeForTerminal(c.url)}`
|
|
82
|
+
)
|
|
83
|
+
];
|
|
84
|
+
return { data: response, humanLines };
|
|
85
|
+
}
|
|
86
|
+
var STALE_MS = 7 * 24 * 60 * 60 * 1e3;
|
|
87
|
+
async function emitCandidateNudge(ctx) {
|
|
88
|
+
const records = await listCandidates(ctx.dataDir);
|
|
89
|
+
if (records.length === 0) return;
|
|
90
|
+
const now = Date.now();
|
|
91
|
+
const stale = records.filter((r) => now - Date.parse(r.meta.created) > STALE_MS).length;
|
|
92
|
+
ctx.io.stderr.write(
|
|
93
|
+
`${records.length} candidate(s) parked (${stale} stale >7d) - tenjin candidate list
|
|
94
|
+
`
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
function parseLimit(raw) {
|
|
98
|
+
const n = Number(raw);
|
|
99
|
+
if (!Number.isInteger(n)) {
|
|
100
|
+
throw new CliError("USAGE", `Invalid --limit: ${JSON.stringify(raw)}`, {
|
|
101
|
+
fix: "Pass an integer between 1 and 10."
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
return n;
|
|
105
|
+
}
|
|
106
|
+
function parseAppliesTo(pairs) {
|
|
107
|
+
const out = {};
|
|
108
|
+
for (const pair of pairs) {
|
|
109
|
+
const eq = pair.indexOf("=");
|
|
110
|
+
if (eq <= 0) {
|
|
111
|
+
throw new CliError("USAGE", `Invalid --applies-to: ${JSON.stringify(pair)}`, {
|
|
112
|
+
fix: "Use key=value, e.g. --applies-to products=Vercel."
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
const key = pair.slice(0, eq).trim();
|
|
116
|
+
const values = pair.slice(eq + 1).split(",").map((v) => v.trim()).filter((v) => v.length > 0);
|
|
117
|
+
if (values.length === 0) {
|
|
118
|
+
throw new CliError("USAGE", `--applies-to ${JSON.stringify(key)} has no values`, {
|
|
119
|
+
fix: "Give each key at least one value, e.g. products=Vercel."
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
out[key] = [...out[key] ?? [], ...values];
|
|
123
|
+
}
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
export {
|
|
127
|
+
runLookup
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=lookup-ZPN2Q67N.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/lookup.ts"],"sourcesContent":["import { CliError } from '../lib/errors';\nimport { parseUsdToAtomic } from '../lib/money';\nimport { resolveContextSettings } from '../lib/settings';\nimport { buildLookupRequest, postLookup, type LookupInput } from '../lib/agent-api';\nimport { recordLookup } from '../lib/lookup-store';\nimport { listCandidates } from '../lib/candidate-store';\nimport { assertOnBaseOrigin } from '../lib/resource-ref';\nimport { sanitizeForTerminal } from '../lib/output';\nimport type { CommandContext, CommandResult } from '../context';\n\n/**\n * `tenjin lookup \"<question>\"`, one POST to /api/agent/lookup. Prints the compact\n * CANDIDATES/MISS response verbatim (spec 10), and records the lookupId +\n * candidates locally so `outcome --last` and `buy <resourceId>` can use them. No\n * wallet, no signing: lookup is anonymous.\n */\n\nexport interface LookupArgs {\n question: string;\n /** Decimal USD at the edge (O1); converted to atomic for the wire. */\n maxPrice?: string;\n freshWithin?: string;\n limit?: string;\n /** Raw `k=v` / `k=v1,v2` pairs from repeated --applies-to. */\n appliesTo?: string[];\n}\n\nexport interface LookupDeps {\n fetchImpl?: typeof fetch;\n}\n\nexport async function runLookup(\n args: LookupArgs,\n ctx: CommandContext,\n deps: LookupDeps = {},\n): Promise<CommandResult> {\n const settings = await resolveContextSettings(ctx);\n const input: LookupInput = { question: args.question };\n if (args.maxPrice !== undefined) input.maxPrice = parseUsdToAtomic(args.maxPrice);\n if (args.freshWithin !== undefined) input.freshWithin = args.freshWithin;\n if (args.limit !== undefined) input.limit = parseLimit(args.limit);\n if (args.appliesTo !== undefined && args.appliesTo.length > 0) {\n input.appliesTo = parseAppliesTo(args.appliesTo);\n }\n\n const request = buildLookupRequest(input);\n const response = await postLookup(request, {\n baseUrl: settings.baseUrl,\n timeoutMs: ctx.flags.timeout,\n evalCohort: settings.evalCohort,\n ...(deps.fetchImpl !== undefined ? { fetchImpl: deps.fetchImpl } : {}),\n });\n\n const candidates = response.candidates ?? [];\n // Ingest trust boundary: a candidate url that points off the configured origin\n // would later route a wallet-signed SIWX header and payment to that host via\n // `buy <resourceId>`. Refuse the whole response as a contract violation.\n for (const c of candidates) {\n try {\n assertOnBaseOrigin(c.url, settings.baseUrl, 'lookup candidate URL');\n } catch (err) {\n throw new CliError(\n 'CONTRACT_MISMATCH',\n `Lookup candidate ${c.resourceId} points off the configured base URL.`,\n { cause: err },\n );\n }\n }\n await recordLookup(ctx.dataDir, {\n lookupId: response.lookupId,\n at: new Date().toISOString(),\n question: request.question,\n decision: response.decision,\n candidates: candidates.map((c) => ({\n resourceId: c.resourceId,\n url: c.url,\n title: c.title,\n price: c.price,\n })),\n });\n\n // A parked-candidate nudge on stderr (not in the machine JSON), MISS only: a\n // MISS is the moment to publish the answer you are about to derive, and stale\n // drafts should not rot unseen. A HIT is not a publish moment, and hot lookup\n // paths should not get advisory noise every call. One line, only when parked.\n if (response.decision === 'MISS') await emitCandidateNudge(ctx);\n\n const humanLines =\n response.decision === 'MISS'\n ? [`MISS, no candidates (lookupId ${response.lookupId})`]\n : [\n `${candidates.length} candidate(s) (lookupId ${response.lookupId}):`,\n ...candidates.map(\n (c, i) =>\n ` ${i + 1}. ${sanitizeForTerminal(c.title)}, ${c.price} atomic, ${sanitizeForTerminal(c.url)}`,\n ),\n ];\n\n return { data: response, humanLines };\n}\n\nconst STALE_MS = 7 * 24 * 60 * 60 * 1000;\n\n/** One stderr line naming parked candidates (and how many are stale >7d), so a\n * lookup is a reminder to publish/tidy the local pen. Silent when none parked. */\nasync function emitCandidateNudge(ctx: CommandContext): Promise<void> {\n const records = await listCandidates(ctx.dataDir);\n if (records.length === 0) return;\n const now = Date.now();\n const stale = records.filter((r) => now - Date.parse(r.meta.created) > STALE_MS).length;\n ctx.io.stderr.write(\n `${records.length} candidate(s) parked (${stale} stale >7d) - tenjin candidate list\\n`,\n );\n}\n\nfunction parseLimit(raw: string): number {\n const n = Number(raw);\n if (!Number.isInteger(n)) {\n throw new CliError('USAGE', `Invalid --limit: ${JSON.stringify(raw)}`, {\n fix: 'Pass an integer between 1 and 10.',\n });\n }\n return n;\n}\n\n/** `products=Vercel` or `products=Vercel,Next` → { products: [\"Vercel\",\"Next\"] }. Repeated\n * keys merge their values. */\nfunction parseAppliesTo(pairs: string[]): Record<string, string[]> {\n const out: Record<string, string[]> = {};\n for (const pair of pairs) {\n const eq = pair.indexOf('=');\n if (eq <= 0) {\n throw new CliError('USAGE', `Invalid --applies-to: ${JSON.stringify(pair)}`, {\n fix: 'Use key=value, e.g. --applies-to products=Vercel.',\n });\n }\n const key = pair.slice(0, eq).trim();\n const values = pair\n .slice(eq + 1)\n .split(',')\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n if (values.length === 0) {\n throw new CliError('USAGE', `--applies-to ${JSON.stringify(key)} has no values`, {\n fix: 'Give each key at least one value, e.g. products=Vercel.',\n });\n }\n out[key] = [...(out[key] ?? []), ...values];\n }\n return out;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRequire as __tenjinCreateRequire } from 'node:module'; const require = __tenjinCreateRequire(import.meta.url);
|
|
2
|
-
import "./chunk-
|
|
2
|
+
import "./chunk-ZXTAQYNA.js";
|
|
3
3
|
|
|
4
4
|
// node_modules/.pnpm/ox@0.14.30_typescript@6.0.3_zod@4.4.3/node_modules/ox/_esm/tempo/internal/mine.wasm.js
|
|
5
5
|
var wasmBase64 = "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";
|
|
@@ -8,4 +8,4 @@ export {
|
|
|
8
8
|
dataOffset,
|
|
9
9
|
wasmBase64
|
|
10
10
|
};
|
|
11
|
-
//# sourceMappingURL=mine.wasm-
|
|
11
|
+
//# sourceMappingURL=mine.wasm-6PIT3DK6.js.map
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { createRequire as __tenjinCreateRequire } from 'node:module'; const require = __tenjinCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
latestLookup
|
|
4
|
+
} from "./chunk-JPHG2JW3.js";
|
|
5
|
+
import {
|
|
6
|
+
buildOutcomeItem,
|
|
7
|
+
postOutcomes
|
|
8
|
+
} from "./chunk-662MSGZB.js";
|
|
9
|
+
import "./chunk-3OV7E5G5.js";
|
|
10
|
+
import "./chunk-4ONXEEQL.js";
|
|
11
|
+
import "./chunk-FJPLRISB.js";
|
|
12
|
+
import {
|
|
13
|
+
resolveContextSettings
|
|
14
|
+
} from "./chunk-GO75V3NZ.js";
|
|
15
|
+
import "./chunk-ESPNTPQ2.js";
|
|
16
|
+
import "./chunk-YBMMV4Y4.js";
|
|
17
|
+
import "./chunk-UO22YNY4.js";
|
|
18
|
+
import "./chunk-MUBUQVC3.js";
|
|
19
|
+
import {
|
|
20
|
+
CliError
|
|
21
|
+
} from "./chunk-OYMYCW7J.js";
|
|
22
|
+
import "./chunk-ZXTAQYNA.js";
|
|
23
|
+
|
|
24
|
+
// src/commands/outcome.ts
|
|
25
|
+
async function runOutcome(args, ctx, deps = {}) {
|
|
26
|
+
const lookupId = await resolveLookupId(args, ctx);
|
|
27
|
+
const item = buildOutcomeItem({
|
|
28
|
+
status: args.status,
|
|
29
|
+
...args.resource !== void 0 ? { resourceId: args.resource } : {},
|
|
30
|
+
...args.contentHash !== void 0 ? { contentHash: args.contentHash } : {}
|
|
31
|
+
});
|
|
32
|
+
const settings = await resolveContextSettings(ctx);
|
|
33
|
+
const result = await postOutcomes(lookupId, [item], {
|
|
34
|
+
baseUrl: settings.baseUrl,
|
|
35
|
+
timeoutMs: ctx.flags.timeout,
|
|
36
|
+
...deps.fetchImpl !== void 0 ? { fetchImpl: deps.fetchImpl } : {}
|
|
37
|
+
});
|
|
38
|
+
return {
|
|
39
|
+
data: { lookupId, status: item.status, accepted: result.accepted },
|
|
40
|
+
humanLines: [`Reported ${item.status} for lookup ${lookupId} (accepted ${result.accepted}).`]
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async function resolveLookupId(args, ctx) {
|
|
44
|
+
if (args.lookupId !== void 0 && args.last === true) {
|
|
45
|
+
throw new CliError("USAGE", "Pass either --lookup-id or --last, not both.", {
|
|
46
|
+
fix: "Use --lookup-id <id> for a specific lookup, or --last for the most recent."
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (args.lookupId !== void 0) return args.lookupId;
|
|
50
|
+
if (args.last === true) {
|
|
51
|
+
const latest = await latestLookup(ctx.dataDir);
|
|
52
|
+
if (latest === null) {
|
|
53
|
+
throw new CliError("LOOKUP_NOT_FOUND", "No local lookup to target with --last.", {
|
|
54
|
+
fix: "Run `tenjin lookup` first, or pass --lookup-id <id>."
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return latest.lookupId;
|
|
58
|
+
}
|
|
59
|
+
throw new CliError("USAGE", "An outcome needs a lookup to report against.", {
|
|
60
|
+
fix: "Pass --lookup-id <id> or --last."
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
export {
|
|
64
|
+
runOutcome
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=outcome-N7TAK6WR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/outcome.ts"],"sourcesContent":["import { CliError } from '../lib/errors';\nimport { resolveContextSettings } from '../lib/settings';\nimport { buildOutcomeItem, postOutcomes } from '../lib/agent-api';\nimport { latestLookup } from '../lib/lookup-store';\nimport type { CommandContext, CommandResult } from '../context';\n\n/**\n * `tenjin outcome --lookup-id <id> --status <s>`, POST to\n * /api/agent/lookups/:id/outcomes, closing the reuse loop (used / partially_used\n * / rejected / regenerated / purchase_declined). The lookupId is the capability,\n * so no wallet is needed; `--last` sugar targets the most recent local lookup.\n */\n\nexport interface OutcomeArgs {\n lookupId?: string;\n last?: boolean;\n status: string;\n resource?: string;\n contentHash?: string;\n}\n\nexport interface OutcomeDeps {\n fetchImpl?: typeof fetch;\n}\n\nexport async function runOutcome(\n args: OutcomeArgs,\n ctx: CommandContext,\n deps: OutcomeDeps = {},\n): Promise<CommandResult> {\n const lookupId = await resolveLookupId(args, ctx);\n const item = buildOutcomeItem({\n status: args.status,\n ...(args.resource !== undefined ? { resourceId: args.resource } : {}),\n ...(args.contentHash !== undefined ? { contentHash: args.contentHash } : {}),\n });\n\n const settings = await resolveContextSettings(ctx);\n const result = await postOutcomes(lookupId, [item], {\n baseUrl: settings.baseUrl,\n timeoutMs: ctx.flags.timeout,\n ...(deps.fetchImpl !== undefined ? { fetchImpl: deps.fetchImpl } : {}),\n });\n\n return {\n data: { lookupId, status: item.status, accepted: result.accepted },\n humanLines: [`Reported ${item.status} for lookup ${lookupId} (accepted ${result.accepted}).`],\n };\n}\n\nasync function resolveLookupId(args: OutcomeArgs, ctx: CommandContext): Promise<string> {\n if (args.lookupId !== undefined && args.last === true) {\n throw new CliError('USAGE', 'Pass either --lookup-id or --last, not both.', {\n fix: 'Use --lookup-id <id> for a specific lookup, or --last for the most recent.',\n });\n }\n if (args.lookupId !== undefined) return args.lookupId;\n if (args.last === true) {\n const latest = await latestLookup(ctx.dataDir);\n if (latest === null) {\n throw new CliError('LOOKUP_NOT_FOUND', 'No local lookup to target with --last.', {\n fix: 'Run `tenjin lookup` first, or pass --lookup-id <id>.',\n });\n }\n return latest.lookupId;\n }\n throw new CliError('USAGE', 'An outcome needs a lookup to report against.', {\n fix: 'Pass --lookup-id <id> or --last.',\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAyBA,eAAsB,WACpB,MACA,KACA,OAAoB,CAAC,GACG;AACxB,QAAM,WAAW,MAAM,gBAAgB,MAAM,GAAG;AAChD,QAAM,OAAO,iBAAiB;AAAA,IAC5B,QAAQ,KAAK;AAAA,IACb,GAAI,KAAK,aAAa,SAAY,EAAE,YAAY,KAAK,SAAS,IAAI,CAAC;AAAA,IACnE,GAAI,KAAK,gBAAgB,SAAY,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;AAAA,EAC5E,CAAC;AAED,QAAM,WAAW,MAAM,uBAAuB,GAAG;AACjD,QAAM,SAAS,MAAM,aAAa,UAAU,CAAC,IAAI,GAAG;AAAA,IAClD,SAAS,SAAS;AAAA,IAClB,WAAW,IAAI,MAAM;AAAA,IACrB,GAAI,KAAK,cAAc,SAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;AAAA,EACtE,CAAC;AAED,SAAO;AAAA,IACL,MAAM,EAAE,UAAU,QAAQ,KAAK,QAAQ,UAAU,OAAO,SAAS;AAAA,IACjE,YAAY,CAAC,YAAY,KAAK,MAAM,eAAe,QAAQ,cAAc,OAAO,QAAQ,IAAI;AAAA,EAC9F;AACF;AAEA,eAAe,gBAAgB,MAAmB,KAAsC;AACtF,MAAI,KAAK,aAAa,UAAa,KAAK,SAAS,MAAM;AACrD,UAAM,IAAI,SAAS,SAAS,gDAAgD;AAAA,MAC1E,KAAK;AAAA,IACP,CAAC;AAAA,EACH;AACA,MAAI,KAAK,aAAa,OAAW,QAAO,KAAK;AAC7C,MAAI,KAAK,SAAS,MAAM;AACtB,UAAM,SAAS,MAAM,aAAa,IAAI,OAAO;AAC7C,QAAI,WAAW,MAAM;AACnB,YAAM,IAAI,SAAS,oBAAoB,0CAA0C;AAAA,QAC/E,KAAK;AAAA,MACP,CAAC;AAAA,IACH;AACA,WAAO,OAAO;AAAA,EAChB;AACA,QAAM,IAAI,SAAS,SAAS,gDAAgD;AAAA,IAC1E,KAAK;AAAA,EACP,CAAC;AACH;","names":[]}
|