tenjin-cli 0.1.0-alpha.0 → 0.1.0-alpha.2

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 (138) hide show
  1. package/NOTICE.md +33 -0
  2. package/README.md +198 -18
  3. package/dist/{_esm-ZH2J4QEH.js → _esm-C5CRWCYU.js} +2 -2
  4. package/dist/_esm-FEASBWRP.js +881 -0
  5. package/dist/buy-U35DQ6XM.js +1598 -0
  6. package/dist/buy-U35DQ6XM.js.map +1 -0
  7. package/dist/candidate-RLYCQMF5.js +127 -0
  8. package/dist/candidate-RLYCQMF5.js.map +1 -0
  9. package/dist/{ccip-FXWZDDF5.js → ccip-NQXCEK2U.js} +6 -5
  10. package/dist/ccip-XR5NE5QK.js +19 -0
  11. package/dist/chunk-27ONARHV.js +171 -0
  12. package/dist/chunk-27ONARHV.js.map +1 -0
  13. package/dist/chunk-2I4QTOLB.js +11 -0
  14. package/dist/chunk-2I4QTOLB.js.map +1 -0
  15. package/dist/chunk-3OV7E5G5.js +18 -0
  16. package/dist/chunk-3OV7E5G5.js.map +1 -0
  17. package/dist/chunk-5CLSD5YN.js +209 -0
  18. package/dist/chunk-5CLSD5YN.js.map +1 -0
  19. package/dist/chunk-7KUW4MJD.js +59 -0
  20. package/dist/chunk-7KUW4MJD.js.map +1 -0
  21. package/dist/{doctor-MVLZRVPU.js → chunk-7PHSZKQS.js} +88 -93
  22. package/dist/chunk-7PHSZKQS.js.map +1 -0
  23. package/dist/chunk-CYOF7ROH.js +70 -0
  24. package/dist/chunk-CYOF7ROH.js.map +1 -0
  25. package/dist/chunk-HIVZG55D.js +204 -0
  26. package/dist/chunk-HIVZG55D.js.map +1 -0
  27. package/dist/chunk-HSDCI7OV.js +7806 -0
  28. package/dist/chunk-HSDCI7OV.js.map +1 -0
  29. package/dist/{chunk-LTTRND4A.js → chunk-IYLHQMT5.js} +85 -9
  30. package/dist/chunk-IYLHQMT5.js.map +1 -0
  31. package/dist/chunk-JPHG2JW3.js +96 -0
  32. package/dist/chunk-JPHG2JW3.js.map +1 -0
  33. package/dist/{chunk-ZPZFPVDN.js → chunk-MUBUQVC3.js} +1 -1
  34. package/dist/chunk-MUBUQVC3.js.map +1 -0
  35. package/dist/chunk-N62ROTMC.js +79 -0
  36. package/dist/chunk-N62ROTMC.js.map +1 -0
  37. package/dist/{chunk-SXQQ2ZSR.js → chunk-NCE5NSN6.js} +186 -18
  38. package/dist/chunk-NCE5NSN6.js.map +1 -0
  39. package/dist/{chunk-FIYZLITH.js → chunk-OYMYCW7J.js} +23 -4
  40. package/dist/{chunk-FIYZLITH.js.map → chunk-OYMYCW7J.js.map} +1 -1
  41. package/dist/chunk-QNP7H47L.js +152 -0
  42. package/dist/chunk-QNP7H47L.js.map +1 -0
  43. package/dist/{chunk-TX5T3LKJ.js → chunk-QVX5MWJZ.js} +21 -17
  44. package/dist/{chunk-TX5T3LKJ.js.map → chunk-QVX5MWJZ.js.map} +1 -1
  45. package/dist/{chunk-CPUZRZ2A.js → chunk-RBJPAZFI.js} +25 -170
  46. package/dist/chunk-RBJPAZFI.js.map +1 -0
  47. package/dist/chunk-RRN3YTK7.js +6199 -0
  48. package/dist/chunk-RRN3YTK7.js.map +1 -0
  49. package/dist/chunk-RY4XKNV3.js +140 -0
  50. package/dist/chunk-RY4XKNV3.js.map +1 -0
  51. package/dist/chunk-S3IGX57D.js +14682 -0
  52. package/dist/chunk-S3IGX57D.js.map +1 -0
  53. package/dist/{config-XVXZ3V2Q.js → chunk-TFGSOPWR.js} +117 -62
  54. package/dist/chunk-TFGSOPWR.js.map +1 -0
  55. package/dist/chunk-TLCMMYLY.js +126 -0
  56. package/dist/chunk-TLCMMYLY.js.map +1 -0
  57. package/dist/{chunk-PAAL45FJ.js → chunk-UGX7YPX2.js} +3446 -448
  58. package/dist/chunk-UGX7YPX2.js.map +1 -0
  59. package/dist/chunk-UO22YNY4.js +69 -0
  60. package/dist/chunk-UO22YNY4.js.map +1 -0
  61. package/dist/chunk-UPIEAMGH.js +160 -0
  62. package/dist/chunk-UPIEAMGH.js.map +1 -0
  63. package/dist/chunk-XJIW7USF.js +217 -0
  64. package/dist/chunk-XJIW7USF.js.map +1 -0
  65. package/dist/{chunk-F5DZJLU3.js → chunk-YALGASEU.js} +2065 -1258
  66. package/dist/chunk-YALGASEU.js.map +1 -0
  67. package/dist/chunk-YBMMV4Y4.js +51 -0
  68. package/dist/chunk-YBMMV4Y4.js.map +1 -0
  69. package/dist/chunk-YIYQ2ZNT.js +286 -0
  70. package/dist/chunk-YIYQ2ZNT.js.map +1 -0
  71. package/dist/{chunk-376LHMK2.js → chunk-YN5SHIXQ.js} +36 -10
  72. package/dist/chunk-YN5SHIXQ.js.map +1 -0
  73. package/dist/chunk-Z52RA3NC.js +137 -0
  74. package/dist/chunk-Z52RA3NC.js.map +1 -0
  75. package/dist/chunk-Z6MFJV5Z.js +1330 -0
  76. package/dist/chunk-Z6MFJV5Z.js.map +1 -0
  77. package/dist/chunk-ZABPQJ3M.js +83 -0
  78. package/dist/chunk-ZABPQJ3M.js.map +1 -0
  79. package/dist/{chunk-WOHCAMDQ.js → chunk-ZMHYXMO6.js} +1887 -1029
  80. package/dist/chunk-ZMHYXMO6.js.map +1 -0
  81. package/dist/{chunk-3IMLRUZE.js → chunk-ZXTAQYNA.js} +6 -2
  82. package/dist/{cli-LMHGCZ5S.js → cli-4NNBEQYH.js} +175 -179
  83. package/dist/cli-4NNBEQYH.js.map +1 -0
  84. package/dist/config-2VSXWWHK.js +21 -0
  85. package/dist/doctor-JJPNIBYH.js +20 -0
  86. package/dist/doctor-JJPNIBYH.js.map +1 -0
  87. package/dist/ethersCompat-Df4a6QIZ-3YZIAXDK.js +18 -0
  88. package/dist/ethersCompat-Df4a6QIZ-3YZIAXDK.js.map +1 -0
  89. package/dist/index.js +1 -1
  90. package/dist/inspect-JGYJWFDP.js +96 -0
  91. package/dist/inspect-JGYJWFDP.js.map +1 -0
  92. package/dist/install-ZQRMSRGW.js +378 -0
  93. package/dist/install-ZQRMSRGW.js.map +1 -0
  94. package/dist/lookup-WYVTOMVY.js +113 -0
  95. package/dist/lookup-WYVTOMVY.js.map +1 -0
  96. package/dist/{mine.wasm-GQECMSGN.js → mine.wasm-6PIT3DK6.js} +2 -2
  97. package/dist/outcome-HKKT6QIA.js +66 -0
  98. package/dist/outcome-HKKT6QIA.js.map +1 -0
  99. package/dist/publish-D76B3MBK.js +1480 -0
  100. package/dist/publish-D76B3MBK.js.map +1 -0
  101. package/dist/{secp256k1-35YNNB6F.js → secp256k1-N3ZHU7LB.js} +5 -4
  102. package/dist/secp256k1-N3ZHU7LB.js.map +1 -0
  103. package/dist/usdc-JIAJW4SV.js +22 -0
  104. package/dist/usdc-JIAJW4SV.js.map +1 -0
  105. package/dist/viemAdapter-By13KInL-ZZE6UV4Y.js +14 -0
  106. package/dist/viemAdapter-By13KInL-ZZE6UV4Y.js.map +1 -0
  107. package/dist/wallet-6QKS6UHW.js +179 -0
  108. package/dist/wallet-6QKS6UHW.js.map +1 -0
  109. package/dist/wallet-PA54CRBL.js +30 -0
  110. package/dist/wallet-PA54CRBL.js.map +1 -0
  111. package/package.json +20 -15
  112. package/skills/tenjin/SKILL.md +199 -0
  113. package/skills/tenjin-publish/SKILL.md +96 -0
  114. package/skills/tenjin-search/SKILL.md +122 -0
  115. package/dist/chunk-376LHMK2.js.map +0 -1
  116. package/dist/chunk-CPUZRZ2A.js.map +0 -1
  117. package/dist/chunk-F5DZJLU3.js.map +0 -1
  118. package/dist/chunk-LTTRND4A.js.map +0 -1
  119. package/dist/chunk-PAAL45FJ.js.map +0 -1
  120. package/dist/chunk-QHIEYBLV.js +0 -320
  121. package/dist/chunk-QHIEYBLV.js.map +0 -1
  122. package/dist/chunk-SXQQ2ZSR.js.map +0 -1
  123. package/dist/chunk-WOHCAMDQ.js.map +0 -1
  124. package/dist/chunk-ZPZFPVDN.js.map +0 -1
  125. package/dist/cli-LMHGCZ5S.js.map +0 -1
  126. package/dist/config-XVXZ3V2Q.js.map +0 -1
  127. package/dist/doctor-MVLZRVPU.js.map +0 -1
  128. package/dist/usdc-OQUOFF6R.js +0 -18
  129. package/dist/wallet-NRKWLKHX.js +0 -153
  130. package/dist/wallet-NRKWLKHX.js.map +0 -1
  131. package/dist/wallet-QUWK2PA4.js +0 -22
  132. /package/dist/{_esm-ZH2J4QEH.js.map → _esm-C5CRWCYU.js.map} +0 -0
  133. /package/dist/{ccip-FXWZDDF5.js.map → _esm-FEASBWRP.js.map} +0 -0
  134. /package/dist/{chunk-3IMLRUZE.js.map → ccip-NQXCEK2U.js.map} +0 -0
  135. /package/dist/{secp256k1-35YNNB6F.js.map → ccip-XR5NE5QK.js.map} +0 -0
  136. /package/dist/{usdc-OQUOFF6R.js.map → chunk-ZXTAQYNA.js.map} +0 -0
  137. /package/dist/{wallet-QUWK2PA4.js.map → config-2VSXWWHK.js.map} +0 -0
  138. /package/dist/{mine.wasm-GQECMSGN.js.map → mine.wasm-6PIT3DK6.js.map} +0 -0
@@ -0,0 +1,113 @@
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-YIYQ2ZNT.js";
12
+ import "./chunk-3OV7E5G5.js";
13
+ import {
14
+ sanitizeForTerminal
15
+ } from "./chunk-Z52RA3NC.js";
16
+ import "./chunk-QNP7H47L.js";
17
+ import "./chunk-N62ROTMC.js";
18
+ import {
19
+ resolveContextSettings
20
+ } from "./chunk-UPIEAMGH.js";
21
+ import {
22
+ parseUsdToAtomic
23
+ } from "./chunk-IYLHQMT5.js";
24
+ import "./chunk-YBMMV4Y4.js";
25
+ import "./chunk-UO22YNY4.js";
26
+ import "./chunk-MUBUQVC3.js";
27
+ import {
28
+ CliError
29
+ } from "./chunk-OYMYCW7J.js";
30
+ import "./chunk-ZXTAQYNA.js";
31
+
32
+ // src/commands/lookup.ts
33
+ async function runLookup(args, ctx, deps = {}) {
34
+ const settings = await resolveContextSettings(ctx);
35
+ const input = { question: args.question };
36
+ if (args.maxPrice !== void 0) input.maxPrice = parseUsdToAtomic(args.maxPrice);
37
+ if (args.freshWithin !== void 0) input.freshWithin = args.freshWithin;
38
+ if (args.limit !== void 0) input.limit = parseLimit(args.limit);
39
+ if (args.appliesTo !== void 0 && args.appliesTo.length > 0) {
40
+ input.appliesTo = parseAppliesTo(args.appliesTo);
41
+ }
42
+ const request = buildLookupRequest(input);
43
+ const response = await postLookup(request, {
44
+ baseUrl: settings.baseUrl,
45
+ timeoutMs: ctx.flags.timeout,
46
+ evalCohort: settings.evalCohort,
47
+ ...deps.fetchImpl !== void 0 ? { fetchImpl: deps.fetchImpl } : {}
48
+ });
49
+ const candidates = response.candidates ?? [];
50
+ for (const c of candidates) {
51
+ try {
52
+ assertOnBaseOrigin(c.url, settings.baseUrl, "lookup candidate URL");
53
+ } catch (err) {
54
+ throw new CliError(
55
+ "CONTRACT_MISMATCH",
56
+ `Lookup candidate ${c.resourceId} points off the configured base URL.`,
57
+ { cause: err }
58
+ );
59
+ }
60
+ }
61
+ await recordLookup(ctx.dataDir, {
62
+ lookupId: response.lookupId,
63
+ at: (/* @__PURE__ */ new Date()).toISOString(),
64
+ question: request.question,
65
+ decision: response.decision,
66
+ candidates: candidates.map((c) => ({
67
+ resourceId: c.resourceId,
68
+ url: c.url,
69
+ title: c.title,
70
+ price: c.price
71
+ }))
72
+ });
73
+ const humanLines = response.decision === "MISS" ? [`MISS, no candidates (lookupId ${response.lookupId})`] : [
74
+ `${candidates.length} candidate(s) (lookupId ${response.lookupId}):`,
75
+ ...candidates.map(
76
+ (c, i) => ` ${i + 1}. ${sanitizeForTerminal(c.title)}, ${c.price} atomic, ${sanitizeForTerminal(c.url)}`
77
+ )
78
+ ];
79
+ return { data: response, humanLines };
80
+ }
81
+ function parseLimit(raw) {
82
+ const n = Number(raw);
83
+ if (!Number.isInteger(n)) {
84
+ throw new CliError("USAGE", `Invalid --limit: ${JSON.stringify(raw)}`, {
85
+ fix: "Pass an integer between 1 and 10."
86
+ });
87
+ }
88
+ return n;
89
+ }
90
+ function parseAppliesTo(pairs) {
91
+ const out = {};
92
+ for (const pair of pairs) {
93
+ const eq = pair.indexOf("=");
94
+ if (eq <= 0) {
95
+ throw new CliError("USAGE", `Invalid --applies-to: ${JSON.stringify(pair)}`, {
96
+ fix: "Use key=value, e.g. --applies-to products=Vercel."
97
+ });
98
+ }
99
+ const key = pair.slice(0, eq).trim();
100
+ const values = pair.slice(eq + 1).split(",").map((v) => v.trim()).filter((v) => v.length > 0);
101
+ if (values.length === 0) {
102
+ throw new CliError("USAGE", `--applies-to ${JSON.stringify(key)} has no values`, {
103
+ fix: "Give each key at least one value, e.g. products=Vercel."
104
+ });
105
+ }
106
+ out[key] = [...out[key] ?? [], ...values];
107
+ }
108
+ return out;
109
+ }
110
+ export {
111
+ runLookup
112
+ };
113
+ //# sourceMappingURL=lookup-WYVTOMVY.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 { 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 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\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-3IMLRUZE.js";
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-GQECMSGN.js.map
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-YIYQ2ZNT.js";
9
+ import "./chunk-3OV7E5G5.js";
10
+ import "./chunk-QNP7H47L.js";
11
+ import "./chunk-N62ROTMC.js";
12
+ import {
13
+ resolveContextSettings
14
+ } from "./chunk-UPIEAMGH.js";
15
+ import "./chunk-IYLHQMT5.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-HKKT6QIA.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":[]}