@theokit/sdk 4.33.1 → 4.34.1

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 (70) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/{agent-LIVADAZ4.js → agent-4QDGRBWZ.js} +8 -8
  3. package/dist/{agent-LIVADAZ4.js.map → agent-4QDGRBWZ.js.map} +1 -1
  4. package/dist/{agent-T2AIB3EV.cjs → agent-RMQ5SZWO.cjs} +9 -9
  5. package/dist/{agent-T2AIB3EV.cjs.map → agent-RMQ5SZWO.cjs.map} +1 -1
  6. package/dist/{chunk-F5RLC6ZH.js → chunk-5SMWZHX5.js} +23 -6
  7. package/dist/chunk-5SMWZHX5.js.map +1 -0
  8. package/dist/{chunk-SDYJESYZ.js → chunk-7BTE3RXJ.js} +13 -9
  9. package/dist/{chunk-SDYJESYZ.js.map → chunk-7BTE3RXJ.js.map} +1 -1
  10. package/dist/{chunk-E33A7YIR.cjs → chunk-G4WI3VW2.cjs} +12 -8
  11. package/dist/chunk-G4WI3VW2.cjs.map +1 -0
  12. package/dist/{chunk-KT6SWUY6.js → chunk-IX2LKBCD.js} +3 -3
  13. package/dist/{chunk-KT6SWUY6.js.map → chunk-IX2LKBCD.js.map} +1 -1
  14. package/dist/{chunk-NEPJ3TC4.cjs → chunk-K2BXB2TZ.cjs} +18 -7
  15. package/dist/chunk-K2BXB2TZ.cjs.map +1 -0
  16. package/dist/{chunk-WKSVAP6H.cjs → chunk-LJVGAI2G.cjs} +5 -5
  17. package/dist/{chunk-WKSVAP6H.cjs.map → chunk-LJVGAI2G.cjs.map} +1 -1
  18. package/dist/{chunk-FX2DAR5R.cjs → chunk-M2PU44HP.cjs} +3 -3
  19. package/dist/{chunk-FX2DAR5R.cjs.map → chunk-M2PU44HP.cjs.map} +1 -1
  20. package/dist/{chunk-TOVGIP4L.js → chunk-ODB6CFVT.js} +19 -8
  21. package/dist/chunk-ODB6CFVT.js.map +1 -0
  22. package/dist/{chunk-GBCQ5742.js → chunk-RKG6QFCJ.js} +3 -3
  23. package/dist/{chunk-GBCQ5742.js.map → chunk-RKG6QFCJ.js.map} +1 -1
  24. package/dist/{chunk-4LXCZSIC.js → chunk-VC6VXYKA.js} +30 -11
  25. package/dist/chunk-VC6VXYKA.js.map +1 -0
  26. package/dist/{chunk-SIJZVUUD.cjs → chunk-VREQYYUJ.cjs} +62 -43
  27. package/dist/chunk-VREQYYUJ.cjs.map +1 -0
  28. package/dist/{chunk-FTRNHGAD.cjs → chunk-WEHUJ7ZS.cjs} +8 -8
  29. package/dist/{chunk-FTRNHGAD.cjs.map → chunk-WEHUJ7ZS.cjs.map} +1 -1
  30. package/dist/{chunk-2BYBFBNH.cjs → chunk-WPOL5UGI.cjs} +24 -7
  31. package/dist/chunk-WPOL5UGI.cjs.map +1 -0
  32. package/dist/{chunk-3CMIY3N7.js → chunk-YO67QDHZ.js} +3 -3
  33. package/dist/{chunk-3CMIY3N7.js.map → chunk-YO67QDHZ.js.map} +1 -1
  34. package/dist/{compact-session-J7VNCICZ.js → compact-session-5BDD4HIB.js} +4 -4
  35. package/dist/{compact-session-J7VNCICZ.js.map → compact-session-5BDD4HIB.js.map} +1 -1
  36. package/dist/{compact-session-24PK2G4M.cjs → compact-session-BEA3IOON.cjs} +12 -12
  37. package/dist/{compact-session-24PK2G4M.cjs.map → compact-session-BEA3IOON.cjs.map} +1 -1
  38. package/dist/compaction.cjs +14 -14
  39. package/dist/compaction.d.cts +9 -4
  40. package/dist/compaction.d.ts +9 -4
  41. package/dist/compaction.js +1 -1
  42. package/dist/cron.cjs +8 -8
  43. package/dist/cron.js +7 -7
  44. package/dist/eval.cjs +7 -7
  45. package/dist/eval.js +6 -6
  46. package/dist/fs-session-store-A5W573D3.js +10 -0
  47. package/dist/{fs-session-store-RKLORRCG.js.map → fs-session-store-A5W573D3.js.map} +1 -1
  48. package/dist/{fs-session-store-ENQIIMIR.cjs → fs-session-store-F7PNNAIS.cjs} +5 -5
  49. package/dist/{fs-session-store-ENQIIMIR.cjs.map → fs-session-store-F7PNNAIS.cjs.map} +1 -1
  50. package/dist/index.cjs +29 -29
  51. package/dist/index.js +9 -9
  52. package/dist/{inject-session-343WIDCM.cjs → inject-session-SMH56NXP.cjs} +4 -4
  53. package/dist/{inject-session-343WIDCM.cjs.map → inject-session-SMH56NXP.cjs.map} +1 -1
  54. package/dist/{inject-session-RZEDWO53.js → inject-session-V5FTK72N.js} +3 -3
  55. package/dist/{inject-session-RZEDWO53.js.map → inject-session-V5FTK72N.js.map} +1 -1
  56. package/dist/internal/persistence/fs-session-store.d.cts +15 -0
  57. package/dist/internal/persistence/fs-session-store.d.ts +15 -0
  58. package/dist/internal/persistence/session-writer.d.cts +14 -4
  59. package/dist/internal/persistence/session-writer.d.ts +14 -4
  60. package/dist/persistence.cjs +3 -3
  61. package/dist/persistence.js +1 -1
  62. package/package.json +1 -1
  63. package/dist/chunk-2BYBFBNH.cjs.map +0 -1
  64. package/dist/chunk-4LXCZSIC.js.map +0 -1
  65. package/dist/chunk-E33A7YIR.cjs.map +0 -1
  66. package/dist/chunk-F5RLC6ZH.js.map +0 -1
  67. package/dist/chunk-NEPJ3TC4.cjs.map +0 -1
  68. package/dist/chunk-SIJZVUUD.cjs.map +0 -1
  69. package/dist/chunk-TOVGIP4L.js.map +0 -1
  70. package/dist/fs-session-store-RKLORRCG.js +0 -10
package/dist/eval.cjs CHANGED
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkS7OEXQMI_cjs = require('./chunk-S7OEXQMI.cjs');
4
- var chunkSIJZVUUD_cjs = require('./chunk-SIJZVUUD.cjs');
4
+ var chunkVREQYYUJ_cjs = require('./chunk-VREQYYUJ.cjs');
5
5
  require('./chunk-BV2MWEMV.cjs');
6
6
  require('./chunk-MZ5ZRORA.cjs');
7
- require('./chunk-E33A7YIR.cjs');
7
+ require('./chunk-G4WI3VW2.cjs');
8
8
  var chunkBUUUWQMB_cjs = require('./chunk-BUUUWQMB.cjs');
9
- require('./chunk-2BYBFBNH.cjs');
10
- require('./chunk-FTRNHGAD.cjs');
9
+ require('./chunk-WPOL5UGI.cjs');
10
+ require('./chunk-WEHUJ7ZS.cjs');
11
11
  require('./chunk-LUSXDZPV.cjs');
12
12
  require('./chunk-IT3PWBW4.cjs');
13
13
  require('./chunk-JLMXKTBX.cjs');
@@ -22,7 +22,7 @@ require('./chunk-YPEPCZHF.cjs');
22
22
  require('./chunk-VJ26EKGJ.cjs');
23
23
  require('./chunk-GIW4L6HY.cjs');
24
24
  require('./chunk-7S7KKUO6.cjs');
25
- require('./chunk-NEPJ3TC4.cjs');
25
+ require('./chunk-K2BXB2TZ.cjs');
26
26
  var chunkCJVMDRQB_cjs = require('./chunk-CJVMDRQB.cjs');
27
27
  require('./chunk-JD74LN7R.cjs');
28
28
  require('./chunk-YLQQX5W2.cjs');
@@ -31,7 +31,7 @@ require('./chunk-ANIZEWTU.cjs');
31
31
  require('./chunk-WJVHMTKB.cjs');
32
32
  require('./chunk-TIZ4TS5V.cjs');
33
33
  require('./chunk-RZQ6E5YZ.cjs');
34
- require('./chunk-FX2DAR5R.cjs');
34
+ require('./chunk-M2PU44HP.cjs');
35
35
  require('./chunk-VYHJZVL5.cjs');
36
36
  require('./chunk-D42XHI4O.cjs');
37
37
  require('./chunk-HFPGOTVF.cjs');
@@ -768,7 +768,7 @@ function makeDefaultEmbedder(opts) {
768
768
  let runtime;
769
769
  return (texts) => {
770
770
  if (runtime === void 0) {
771
- runtime = chunkSIJZVUUD_cjs.openRouterMemoryEmbeddingProviderAdapter.create(embedderCreateOptions(opts));
771
+ runtime = chunkVREQYYUJ_cjs.openRouterMemoryEmbeddingProviderAdapter.create(embedderCreateOptions(opts));
772
772
  }
773
773
  return runtime.then((rt) => rt.embed(texts));
774
774
  };
package/dist/eval.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import { shellEscapePosix, LocalSandbox } from './chunk-SKWVAQAY.js';
2
- import { openRouterMemoryEmbeddingProviderAdapter } from './chunk-4LXCZSIC.js';
2
+ import { openRouterMemoryEmbeddingProviderAdapter } from './chunk-VC6VXYKA.js';
3
3
  import './chunk-2SFBB54R.js';
4
4
  import './chunk-HRA3CPGG.js';
5
- import './chunk-SDYJESYZ.js';
5
+ import './chunk-7BTE3RXJ.js';
6
6
  import { getTracer } from './chunk-K2BQQ445.js';
7
- import './chunk-F5RLC6ZH.js';
8
- import './chunk-KT6SWUY6.js';
7
+ import './chunk-5SMWZHX5.js';
8
+ import './chunk-IX2LKBCD.js';
9
9
  import './chunk-6CLRANZA.js';
10
10
  import './chunk-EEZ7CFMM.js';
11
11
  import './chunk-XAUBQMQU.js';
@@ -20,7 +20,7 @@ import './chunk-UJ7IQJAG.js';
20
20
  import './chunk-7AD3ZTZL.js';
21
21
  import './chunk-V4XRLPEF.js';
22
22
  import './chunk-5PZMMF4H.js';
23
- import './chunk-TOVGIP4L.js';
23
+ import './chunk-ODB6CFVT.js';
24
24
  import { readJsonlIds, appendJsonl } from './chunk-UAYYNWYJ.js';
25
25
  export { JsonlParseError, loadJsonl } from './chunk-UAYYNWYJ.js';
26
26
  import './chunk-77FOZCOT.js';
@@ -30,7 +30,7 @@ import './chunk-BXV2QUIC.js';
30
30
  import './chunk-4VPXM6UU.js';
31
31
  import './chunk-S2BBRVQX.js';
32
32
  import './chunk-BNIFFFH3.js';
33
- import './chunk-GBCQ5742.js';
33
+ import './chunk-RKG6QFCJ.js';
34
34
  import './chunk-X2FR4OIT.js';
35
35
  import './chunk-KAP4GJHO.js';
36
36
  import './chunk-LU7VALW5.js';
@@ -0,0 +1,10 @@
1
+ export { FsSessionStore } from './chunk-5SMWZHX5.js';
2
+ import './chunk-ODB6CFVT.js';
3
+ import './chunk-UAYYNWYJ.js';
4
+ import './chunk-2XLKLVVR.js';
5
+ import './chunk-Q56IYTBZ.js';
6
+ import './chunk-S2BBRVQX.js';
7
+ import './chunk-WLKFWQSJ.js';
8
+ import './chunk-JTFYYKDT.js';
9
+ //# sourceMappingURL=fs-session-store-A5W573D3.js.map
10
+ //# sourceMappingURL=fs-session-store-A5W573D3.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"fs-session-store-RKLORRCG.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"fs-session-store-A5W573D3.js"}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunk2BYBFBNH_cjs = require('./chunk-2BYBFBNH.cjs');
4
- require('./chunk-NEPJ3TC4.cjs');
3
+ var chunkWPOL5UGI_cjs = require('./chunk-WPOL5UGI.cjs');
4
+ require('./chunk-K2BXB2TZ.cjs');
5
5
  require('./chunk-CJVMDRQB.cjs');
6
6
  require('./chunk-YLQQX5W2.cjs');
7
7
  require('./chunk-2DYI7MIF.cjs');
@@ -13,7 +13,7 @@ require('./chunk-BEURCLDV.cjs');
13
13
 
14
14
  Object.defineProperty(exports, "FsSessionStore", {
15
15
  enumerable: true,
16
- get: function () { return chunk2BYBFBNH_cjs.FsSessionStore; }
16
+ get: function () { return chunkWPOL5UGI_cjs.FsSessionStore; }
17
17
  });
18
- //# sourceMappingURL=fs-session-store-ENQIIMIR.cjs.map
19
- //# sourceMappingURL=fs-session-store-ENQIIMIR.cjs.map
18
+ //# sourceMappingURL=fs-session-store-F7PNNAIS.cjs.map
19
+ //# sourceMappingURL=fs-session-store-F7PNNAIS.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"fs-session-store-ENQIIMIR.cjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"fs-session-store-F7PNNAIS.cjs"}
package/dist/index.cjs CHANGED
@@ -8,14 +8,14 @@ require('./chunk-EPYZOCOL.cjs');
8
8
  var chunkZ2OC3UIW_cjs = require('./chunk-Z2OC3UIW.cjs');
9
9
  require('./chunk-BWT67BI4.cjs');
10
10
  require('./chunk-PNVDQL5Y.cjs');
11
- var chunkWKSVAP6H_cjs = require('./chunk-WKSVAP6H.cjs');
12
- var chunkSIJZVUUD_cjs = require('./chunk-SIJZVUUD.cjs');
11
+ var chunkLJVGAI2G_cjs = require('./chunk-LJVGAI2G.cjs');
12
+ var chunkVREQYYUJ_cjs = require('./chunk-VREQYYUJ.cjs');
13
13
  require('./chunk-BV2MWEMV.cjs');
14
14
  var chunkMZ5ZRORA_cjs = require('./chunk-MZ5ZRORA.cjs');
15
- require('./chunk-E33A7YIR.cjs');
15
+ require('./chunk-G4WI3VW2.cjs');
16
16
  require('./chunk-BUUUWQMB.cjs');
17
- require('./chunk-2BYBFBNH.cjs');
18
- var chunkFTRNHGAD_cjs = require('./chunk-FTRNHGAD.cjs');
17
+ require('./chunk-WPOL5UGI.cjs');
18
+ var chunkWEHUJ7ZS_cjs = require('./chunk-WEHUJ7ZS.cjs');
19
19
  require('./chunk-LUSXDZPV.cjs');
20
20
  require('./chunk-IT3PWBW4.cjs');
21
21
  var chunkJLMXKTBX_cjs = require('./chunk-JLMXKTBX.cjs');
@@ -30,7 +30,7 @@ require('./chunk-YPEPCZHF.cjs');
30
30
  require('./chunk-VJ26EKGJ.cjs');
31
31
  require('./chunk-GIW4L6HY.cjs');
32
32
  require('./chunk-7S7KKUO6.cjs');
33
- require('./chunk-NEPJ3TC4.cjs');
33
+ require('./chunk-K2BXB2TZ.cjs');
34
34
  require('./chunk-CJVMDRQB.cjs');
35
35
  require('./chunk-JD74LN7R.cjs');
36
36
  var chunkYLQQX5W2_cjs = require('./chunk-YLQQX5W2.cjs');
@@ -39,7 +39,7 @@ require('./chunk-ANIZEWTU.cjs');
39
39
  var chunkWJVHMTKB_cjs = require('./chunk-WJVHMTKB.cjs');
40
40
  var chunkTIZ4TS5V_cjs = require('./chunk-TIZ4TS5V.cjs');
41
41
  require('./chunk-RZQ6E5YZ.cjs');
42
- require('./chunk-FX2DAR5R.cjs');
42
+ require('./chunk-M2PU44HP.cjs');
43
43
  var chunkVYHJZVL5_cjs = require('./chunk-VYHJZVL5.cjs');
44
44
  var chunkD42XHI4O_cjs = require('./chunk-D42XHI4O.cjs');
45
45
  require('./chunk-HFPGOTVF.cjs');
@@ -58,8 +58,8 @@ var fs = require('fs');
58
58
  // src/agent-factory.ts
59
59
  function createAgentFactory(common) {
60
60
  return {
61
- forSession: (agentId, overrides) => chunkSIJZVUUD_cjs.Agent.create(mergeAgentOptions(common, overrides, agentId)),
62
- getOrCreate: (agentId, overrides) => chunkSIJZVUUD_cjs.Agent.getOrCreate(agentId, mergeAgentOptions(common, overrides, agentId))
61
+ forSession: (agentId, overrides) => chunkVREQYYUJ_cjs.Agent.create(mergeAgentOptions(common, overrides, agentId)),
62
+ getOrCreate: (agentId, overrides) => chunkVREQYYUJ_cjs.Agent.getOrCreate(agentId, mergeAgentOptions(common, overrides, agentId))
63
63
  };
64
64
  }
65
65
  function mergeAgentOptions(common, overrides, agentId) {
@@ -1165,7 +1165,7 @@ var Memory = {
1165
1165
  return await peer.IndexManager.open(openArgs);
1166
1166
  }
1167
1167
  const { IndexManager } = await import('./index-manager-H7HUMW52.cjs');
1168
- openArgs.embedding = await resolveEmbedding(opts.embedding, chunkSIJZVUUD_cjs.MEMORY_EMBEDDING_ADAPTERS);
1168
+ openArgs.embedding = await resolveEmbedding(opts.embedding, chunkVREQYYUJ_cjs.MEMORY_EMBEDDING_ADAPTERS);
1169
1169
  return await IndexManager.open(openArgs);
1170
1170
  },
1171
1171
  /**
@@ -1176,7 +1176,7 @@ var Memory = {
1176
1176
  */
1177
1177
  async runDreamingSweep(opts) {
1178
1178
  const peer = await tryLoadSdkMemoryPeer();
1179
- const catalog = peer !== null ? peer.MEMORY_EMBEDDING_ADAPTERS : chunkSIJZVUUD_cjs.MEMORY_EMBEDDING_ADAPTERS;
1179
+ const catalog = peer !== null ? peer.MEMORY_EMBEDDING_ADAPTERS : chunkVREQYYUJ_cjs.MEMORY_EMBEDDING_ADAPTERS;
1180
1180
  const sweepArgs = await buildDreamingSweepArgs(opts, catalog);
1181
1181
  const result = peer !== null ? (
1182
1182
  // biome-ignore lint/suspicious/noExplicitAny: peer is dynamically loaded — structural compat ensured by sdk-memory
@@ -1598,7 +1598,7 @@ function ehAgenteConstruido(m) {
1598
1598
  return typeof m.send === "function";
1599
1599
  }
1600
1600
  async function materializar(def, indice) {
1601
- const { Agent: Agent2 } = await import('./agent-T2AIB3EV.cjs');
1601
+ const { Agent: Agent2 } = await import('./agent-RMQ5SZWO.cjs');
1602
1602
  return Agent2.create({
1603
1603
  // `AgentDefinition.model` admite o sentinel `'inherit'`, que não é um id de modelo. Herdar
1604
1604
  // aqui significa "não declare nada e deixe o default valer" — passar o literal adiante criaria
@@ -1740,7 +1740,7 @@ var FIXTURE_USER = {
1740
1740
  };
1741
1741
  var FIXTURE_MODELS = [
1742
1742
  {
1743
- id: chunkSIJZVUUD_cjs.DEFAULT_AGENTIC_MODEL_ID,
1743
+ id: chunkVREQYYUJ_cjs.DEFAULT_AGENTIC_MODEL_ID,
1744
1744
  name: "Gemini 2.0 Flash",
1745
1745
  displayName: "Gemini 2.0 Flash",
1746
1746
  parameters: [
@@ -1816,7 +1816,7 @@ async function listLocalModelsViaOpenAiCompat(baseUrl) {
1816
1816
  try {
1817
1817
  response = await fetch(url, { method: "GET" });
1818
1818
  } catch (fetchErr) {
1819
- const mapped = chunkFTRNHGAD_cjs.mapOllamaTransportError({
1819
+ const mapped = chunkWEHUJ7ZS_cjs.mapOllamaTransportError({
1820
1820
  providerId: "ollama",
1821
1821
  cause: fetchErr,
1822
1822
  endpoint: "/v1/models"
@@ -1834,7 +1834,7 @@ async function listLocalModelsViaOpenAiCompat(baseUrl) {
1834
1834
  body = JSON.parse(text);
1835
1835
  } catch {
1836
1836
  }
1837
- const mapped = chunkFTRNHGAD_cjs.mapOllamaHttpError({
1837
+ const mapped = chunkWEHUJ7ZS_cjs.mapOllamaHttpError({
1838
1838
  providerId: "ollama",
1839
1839
  status: response.status,
1840
1840
  body,
@@ -1948,7 +1948,7 @@ var Theokit = class {
1948
1948
  envVars: p.envVars
1949
1949
  }));
1950
1950
  },
1951
- embeddingAdapters: () => Object.entries(chunkSIJZVUUD_cjs.MEMORY_EMBEDDING_ADAPTERS).map(([id, adapter]) => ({
1951
+ embeddingAdapters: () => Object.entries(chunkVREQYYUJ_cjs.MEMORY_EMBEDDING_ADAPTERS).map(([id, adapter]) => ({
1952
1952
  id,
1953
1953
  transport: adapter.transport,
1954
1954
  defaultModel: adapter.defaultModel
@@ -1966,7 +1966,7 @@ var Theokit = class {
1966
1966
  };
1967
1967
  async function maybeListLocalModels(providerName) {
1968
1968
  chunkD42XHI4O_cjs.registerBuiltins();
1969
- await chunkFTRNHGAD_cjs.discoverProviderPlugins();
1969
+ await chunkWEHUJ7ZS_cjs.discoverProviderPlugins();
1970
1970
  const profile = chunkD42XHI4O_cjs.getProviderProfile(providerName);
1971
1971
  if (profile === void 0) return void 0;
1972
1972
  if (profile.authType !== "none") return void 0;
@@ -1980,17 +1980,17 @@ function resolveLocalProviderBaseUrl(providerName, fallback) {
1980
1980
  return fallback;
1981
1981
  }
1982
1982
  async function executeCatalogRequest(request) {
1983
- const apiKey = chunkSIJZVUUD_cjs.resolveApiKey(request.apiKey);
1983
+ const apiKey = chunkVREQYYUJ_cjs.resolveApiKey(request.apiKey);
1984
1984
  if (apiKey === void 0) {
1985
1985
  throw new chunkA44COQJJ_cjs.AuthenticationError("Missing API key", { code: "missing_api_key" });
1986
1986
  }
1987
- if (chunkSIJZVUUD_cjs.shouldUseFixtureMode(apiKey)) {
1987
+ if (chunkVREQYYUJ_cjs.shouldUseFixtureMode(apiKey)) {
1988
1988
  return request.fixture;
1989
1989
  }
1990
- if (!chunkSIJZVUUD_cjs.isFixtureApiKey(apiKey) && process.env.THEOKIT_API_BASE_URL === void 0) {
1990
+ if (!chunkVREQYYUJ_cjs.isFixtureApiKey(apiKey) && process.env.THEOKIT_API_BASE_URL === void 0) {
1991
1991
  throw new chunkA44COQJJ_cjs.AuthenticationError("Invalid API key", { code: "authentication_error" });
1992
1992
  }
1993
- return chunkSIJZVUUD_cjs.httpRequest(request.path, { apiKey });
1993
+ return chunkVREQYYUJ_cjs.httpRequest(request.path, { apiKey });
1994
1994
  }
1995
1995
 
1996
1996
  // src/trajectory-helpers.ts
@@ -2106,35 +2106,35 @@ Object.defineProperty(exports, "GenerateObjectError", {
2106
2106
  });
2107
2107
  Object.defineProperty(exports, "Cron", {
2108
2108
  enumerable: true,
2109
- get: function () { return chunkWKSVAP6H_cjs.Cron; }
2109
+ get: function () { return chunkLJVGAI2G_cjs.Cron; }
2110
2110
  });
2111
2111
  Object.defineProperty(exports, "Agent", {
2112
2112
  enumerable: true,
2113
- get: function () { return chunkSIJZVUUD_cjs.Agent; }
2113
+ get: function () { return chunkVREQYYUJ_cjs.Agent; }
2114
2114
  });
2115
2115
  Object.defineProperty(exports, "AgentBuilder", {
2116
2116
  enumerable: true,
2117
- get: function () { return chunkSIJZVUUD_cjs.AgentBuilder; }
2117
+ get: function () { return chunkVREQYYUJ_cjs.AgentBuilder; }
2118
2118
  });
2119
2119
  Object.defineProperty(exports, "Tool", {
2120
2120
  enumerable: true,
2121
- get: function () { return chunkSIJZVUUD_cjs.Tool; }
2121
+ get: function () { return chunkVREQYYUJ_cjs.Tool; }
2122
2122
  });
2123
2123
  Object.defineProperty(exports, "ToolError", {
2124
2124
  enumerable: true,
2125
- get: function () { return chunkSIJZVUUD_cjs.ToolError; }
2125
+ get: function () { return chunkVREQYYUJ_cjs.ToolError; }
2126
2126
  });
2127
2127
  Object.defineProperty(exports, "UsageAccumulator", {
2128
2128
  enumerable: true,
2129
- get: function () { return chunkSIJZVUUD_cjs.UsageAccumulator; }
2129
+ get: function () { return chunkVREQYYUJ_cjs.UsageAccumulator; }
2130
2130
  });
2131
2131
  Object.defineProperty(exports, "computeCost", {
2132
2132
  enumerable: true,
2133
- get: function () { return chunkSIJZVUUD_cjs.computeCost; }
2133
+ get: function () { return chunkVREQYYUJ_cjs.computeCost; }
2134
2134
  });
2135
2135
  Object.defineProperty(exports, "getPricingEntry", {
2136
2136
  enumerable: true,
2137
- get: function () { return chunkSIJZVUUD_cjs.getPricingEntry; }
2137
+ get: function () { return chunkVREQYYUJ_cjs.getPricingEntry; }
2138
2138
  });
2139
2139
  Object.defineProperty(exports, "emitRunEvent", {
2140
2140
  enumerable: true,
package/dist/index.js CHANGED
@@ -6,16 +6,16 @@ import './chunk-GJAGKFTR.js';
6
6
  import { Workflow, agentStep } from './chunk-BFWPZMG7.js';
7
7
  import './chunk-UVNG67DG.js';
8
8
  import './chunk-CAH3G4IS.js';
9
- export { Cron } from './chunk-3CMIY3N7.js';
10
- import { MEMORY_EMBEDDING_ADAPTERS, resolveApiKey, shouldUseFixtureMode, isFixtureApiKey, httpRequest, DEFAULT_AGENTIC_MODEL_ID, Agent } from './chunk-4LXCZSIC.js';
11
- export { Agent, AgentBuilder, Tool, ToolError, UsageAccumulator, computeCost, getPricingEntry } from './chunk-4LXCZSIC.js';
9
+ export { Cron } from './chunk-YO67QDHZ.js';
10
+ import { MEMORY_EMBEDDING_ADAPTERS, resolveApiKey, shouldUseFixtureMode, isFixtureApiKey, httpRequest, DEFAULT_AGENTIC_MODEL_ID, Agent } from './chunk-VC6VXYKA.js';
11
+ export { Agent, AgentBuilder, Tool, ToolError, UsageAccumulator, computeCost, getPricingEntry } from './chunk-VC6VXYKA.js';
12
12
  import './chunk-2SFBB54R.js';
13
13
  import { configure, submit, list, get, cancel, subscribe } from './chunk-HRA3CPGG.js';
14
14
  export { emitRunEvent } from './chunk-HRA3CPGG.js';
15
- import './chunk-SDYJESYZ.js';
15
+ import './chunk-7BTE3RXJ.js';
16
16
  import './chunk-K2BQQ445.js';
17
- import './chunk-F5RLC6ZH.js';
18
- import { discoverProviderPlugins, mapOllamaTransportError, mapOllamaHttpError } from './chunk-KT6SWUY6.js';
17
+ import './chunk-5SMWZHX5.js';
18
+ import { discoverProviderPlugins, mapOllamaTransportError, mapOllamaHttpError } from './chunk-IX2LKBCD.js';
19
19
  import './chunk-6CLRANZA.js';
20
20
  import './chunk-EEZ7CFMM.js';
21
21
  import { lanceStoragePath, LanceIndex, readFactsFromMarkdown, defaultIndexPath, openMemoryDb, memoryDir } from './chunk-XAUBQMQU.js';
@@ -30,7 +30,7 @@ import './chunk-UJ7IQJAG.js';
30
30
  import './chunk-7AD3ZTZL.js';
31
31
  import './chunk-V4XRLPEF.js';
32
32
  import './chunk-5PZMMF4H.js';
33
- import './chunk-TOVGIP4L.js';
33
+ import './chunk-ODB6CFVT.js';
34
34
  import './chunk-UAYYNWYJ.js';
35
35
  import './chunk-77FOZCOT.js';
36
36
  import { withCwdMutex } from './chunk-2XLKLVVR.js';
@@ -40,7 +40,7 @@ import './chunk-BXV2QUIC.js';
40
40
  import { toJsonSchema } from './chunk-4VPXM6UU.js';
41
41
  import { replaceFileAtomic } from './chunk-S2BBRVQX.js';
42
42
  import './chunk-BNIFFFH3.js';
43
- import './chunk-GBCQ5742.js';
43
+ import './chunk-RKG6QFCJ.js';
44
44
  import { parseModelId } from './chunk-X2FR4OIT.js';
45
45
  import { registerBuiltins, listProviders, getCatalogCapabilities, getProviderProfile } from './chunk-KAP4GJHO.js';
46
46
  import './chunk-LU7VALW5.js';
@@ -1600,7 +1600,7 @@ function ehAgenteConstruido(m) {
1600
1600
  return typeof m.send === "function";
1601
1601
  }
1602
1602
  async function materializar(def, indice) {
1603
- const { Agent: Agent2 } = await import('./agent-LIVADAZ4.js');
1603
+ const { Agent: Agent2 } = await import('./agent-4QDGRBWZ.js');
1604
1604
  return Agent2.create({
1605
1605
  // `AgentDefinition.model` admite o sentinel `'inherit'`, que não é um id de modelo. Herdar
1606
1606
  // aqui significa "não declare nada e deixe o default valer" — passar o literal adiante criaria
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkE33A7YIR_cjs = require('./chunk-E33A7YIR.cjs');
3
+ var chunkG4WI3VW2_cjs = require('./chunk-G4WI3VW2.cjs');
4
4
  var chunkIT3PWBW4_cjs = require('./chunk-IT3PWBW4.cjs');
5
5
  var chunk2DYI7MIF_cjs = require('./chunk-2DYI7MIF.cjs');
6
6
  require('./chunk-TIZ4TS5V.cjs');
@@ -8,7 +8,7 @@ require('./chunk-BEURCLDV.cjs');
8
8
 
9
9
  // src/internal/session/inject-session.ts
10
10
  async function injectSessionTurn(opts) {
11
- await chunkE33A7YIR_cjs.enqueueSessionWrite(opts.loc.cwd, opts.loc.agentId, async () => {
11
+ await chunkG4WI3VW2_cjs.enqueueSessionWrite(opts.loc.cwd, opts.loc.agentId, async () => {
12
12
  const prior = await opts.store.readRecords(opts.loc.agentId);
13
13
  const transcript = chunk2DYI7MIF_cjs.SessionTranscript.fromRecords(prior, {
14
14
  cwd: opts.loc.cwd,
@@ -23,5 +23,5 @@ async function injectSessionTurn(opts) {
23
23
  }
24
24
 
25
25
  exports.injectSessionTurn = injectSessionTurn;
26
- //# sourceMappingURL=inject-session-343WIDCM.cjs.map
27
- //# sourceMappingURL=inject-session-343WIDCM.cjs.map
26
+ //# sourceMappingURL=inject-session-SMH56NXP.cjs.map
27
+ //# sourceMappingURL=inject-session-SMH56NXP.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/internal/session/inject-session.ts"],"names":["enqueueSessionWrite","SessionTranscript","invalidateSessionCache"],"mappings":";;;;;;;;;AAWA,eAAsB,kBAAkB,IAAA,EAMtB;AAChB,EAAA,MAAMA,sCAAoB,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,CAAK,GAAA,CAAI,SAAS,YAAY;AACpE,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,MAAM,WAAA,CAAY,IAAA,CAAK,IAAI,OAAO,CAAA;AAC3D,IAAA,MAAM,UAAA,GAAaC,mCAAA,CAAkB,WAAA,CAAY,KAAA,EAAO;AAAA,MACtD,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,IAAS;AAAA,KAC1B,CAAA;AACD,IAAA,UAAA,CAAW,cAAA,CAAe,KAAK,QAAQ,CAAA;AACvC,IAAA,UAAA,CAAW,mBAAA,CAAoB,EAAE,IAAA,EAAM,IAAA,CAAK,eAAe,CAAA;AAC3D,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,UAAA,CAAW,OAAA,EAAQ,CAAE,KAAA,CAAM,KAAA,CAAM,MAAM,CAAC,CAAA;AACzF,IAAAC,wCAAA,CAAuB,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,IAAI,OAAO,CAAA;AAAA,EACvD,CAAC,CAAA;AACH","file":"inject-session-343WIDCM.cjs","sourcesContent":["/**\n * M51 (agent-builder) — inject a SYNTHETIC user+assistant pair into a session's persisted transcript\n * WITHOUT running an LLM turn. This is the Codex review-exit mechanism (`exit_success.xml` appended to\n * the parent thread history so follow-ups like \"fix finding 2\" work): the pair chains onto the DAG\n * leaf (M50 pattern) and the in-memory cache is invalidated so the NEXT send re-hydrates with it.\n */\nimport type { SessionStore } from \"../../types/session-store.js\";\nimport { SessionTranscript } from \"../persistence/session-transcript.js\";\nimport { enqueueSessionWrite, invalidateSessionCache } from \"./agent-session.js\";\nimport type { CompactLocation } from \"./compact-session.js\";\n\nexport async function injectSessionTurn(opts: {\n store: SessionStore;\n loc: CompactLocation;\n sessionId: string;\n userText: string;\n assistantText: string;\n}): Promise<void> {\n await enqueueSessionWrite(opts.loc.cwd, opts.loc.agentId, async () => {\n const prior = await opts.store.readRecords(opts.loc.agentId);\n const transcript = SessionTranscript.fromRecords(prior, {\n cwd: opts.loc.cwd,\n sessionId: opts.sessionId,\n model: opts.loc.model ?? \"unknown\",\n });\n transcript.appendUserTurn(opts.userText);\n transcript.appendAssistantTurn({ text: opts.assistantText });\n await opts.store.appendRecords(opts.loc.agentId, transcript.records().slice(prior.length));\n invalidateSessionCache(opts.loc.cwd, opts.loc.agentId);\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/internal/session/inject-session.ts"],"names":["enqueueSessionWrite","SessionTranscript","invalidateSessionCache"],"mappings":";;;;;;;;;AAWA,eAAsB,kBAAkB,IAAA,EAMtB;AAChB,EAAA,MAAMA,sCAAoB,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,CAAK,GAAA,CAAI,SAAS,YAAY;AACpE,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,MAAM,WAAA,CAAY,IAAA,CAAK,IAAI,OAAO,CAAA;AAC3D,IAAA,MAAM,UAAA,GAAaC,mCAAA,CAAkB,WAAA,CAAY,KAAA,EAAO;AAAA,MACtD,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,IAAS;AAAA,KAC1B,CAAA;AACD,IAAA,UAAA,CAAW,cAAA,CAAe,KAAK,QAAQ,CAAA;AACvC,IAAA,UAAA,CAAW,mBAAA,CAAoB,EAAE,IAAA,EAAM,IAAA,CAAK,eAAe,CAAA;AAC3D,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,UAAA,CAAW,OAAA,EAAQ,CAAE,KAAA,CAAM,KAAA,CAAM,MAAM,CAAC,CAAA;AACzF,IAAAC,wCAAA,CAAuB,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,IAAI,OAAO,CAAA;AAAA,EACvD,CAAC,CAAA;AACH","file":"inject-session-SMH56NXP.cjs","sourcesContent":["/**\n * M51 (agent-builder) — inject a SYNTHETIC user+assistant pair into a session's persisted transcript\n * WITHOUT running an LLM turn. This is the Codex review-exit mechanism (`exit_success.xml` appended to\n * the parent thread history so follow-ups like \"fix finding 2\" work): the pair chains onto the DAG\n * leaf (M50 pattern) and the in-memory cache is invalidated so the NEXT send re-hydrates with it.\n */\nimport type { SessionStore } from \"../../types/session-store.js\";\nimport { SessionTranscript } from \"../persistence/session-transcript.js\";\nimport { enqueueSessionWrite, invalidateSessionCache } from \"./agent-session.js\";\nimport type { CompactLocation } from \"./compact-session.js\";\n\nexport async function injectSessionTurn(opts: {\n store: SessionStore;\n loc: CompactLocation;\n sessionId: string;\n userText: string;\n assistantText: string;\n}): Promise<void> {\n await enqueueSessionWrite(opts.loc.cwd, opts.loc.agentId, async () => {\n const prior = await opts.store.readRecords(opts.loc.agentId);\n const transcript = SessionTranscript.fromRecords(prior, {\n cwd: opts.loc.cwd,\n sessionId: opts.sessionId,\n model: opts.loc.model ?? \"unknown\",\n });\n transcript.appendUserTurn(opts.userText);\n transcript.appendAssistantTurn({ text: opts.assistantText });\n await opts.store.appendRecords(opts.loc.agentId, transcript.records().slice(prior.length));\n invalidateSessionCache(opts.loc.cwd, opts.loc.agentId);\n });\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { enqueueSessionWrite } from './chunk-SDYJESYZ.js';
1
+ import { enqueueSessionWrite } from './chunk-7BTE3RXJ.js';
2
2
  import { invalidateSessionCache } from './chunk-EEZ7CFMM.js';
3
3
  import { SessionTranscript } from './chunk-Q56IYTBZ.js';
4
4
  import './chunk-S2BBRVQX.js';
@@ -21,5 +21,5 @@ async function injectSessionTurn(opts) {
21
21
  }
22
22
 
23
23
  export { injectSessionTurn };
24
- //# sourceMappingURL=inject-session-RZEDWO53.js.map
25
- //# sourceMappingURL=inject-session-RZEDWO53.js.map
24
+ //# sourceMappingURL=inject-session-V5FTK72N.js.map
25
+ //# sourceMappingURL=inject-session-V5FTK72N.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/internal/session/inject-session.ts"],"names":[],"mappings":";;;;;;;AAWA,eAAsB,kBAAkB,IAAA,EAMtB;AAChB,EAAA,MAAM,oBAAoB,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,CAAK,GAAA,CAAI,SAAS,YAAY;AACpE,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,MAAM,WAAA,CAAY,IAAA,CAAK,IAAI,OAAO,CAAA;AAC3D,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,WAAA,CAAY,KAAA,EAAO;AAAA,MACtD,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,IAAS;AAAA,KAC1B,CAAA;AACD,IAAA,UAAA,CAAW,cAAA,CAAe,KAAK,QAAQ,CAAA;AACvC,IAAA,UAAA,CAAW,mBAAA,CAAoB,EAAE,IAAA,EAAM,IAAA,CAAK,eAAe,CAAA;AAC3D,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,UAAA,CAAW,OAAA,EAAQ,CAAE,KAAA,CAAM,KAAA,CAAM,MAAM,CAAC,CAAA;AACzF,IAAA,sBAAA,CAAuB,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,IAAI,OAAO,CAAA;AAAA,EACvD,CAAC,CAAA;AACH","file":"inject-session-RZEDWO53.js","sourcesContent":["/**\n * M51 (agent-builder) — inject a SYNTHETIC user+assistant pair into a session's persisted transcript\n * WITHOUT running an LLM turn. This is the Codex review-exit mechanism (`exit_success.xml` appended to\n * the parent thread history so follow-ups like \"fix finding 2\" work): the pair chains onto the DAG\n * leaf (M50 pattern) and the in-memory cache is invalidated so the NEXT send re-hydrates with it.\n */\nimport type { SessionStore } from \"../../types/session-store.js\";\nimport { SessionTranscript } from \"../persistence/session-transcript.js\";\nimport { enqueueSessionWrite, invalidateSessionCache } from \"./agent-session.js\";\nimport type { CompactLocation } from \"./compact-session.js\";\n\nexport async function injectSessionTurn(opts: {\n store: SessionStore;\n loc: CompactLocation;\n sessionId: string;\n userText: string;\n assistantText: string;\n}): Promise<void> {\n await enqueueSessionWrite(opts.loc.cwd, opts.loc.agentId, async () => {\n const prior = await opts.store.readRecords(opts.loc.agentId);\n const transcript = SessionTranscript.fromRecords(prior, {\n cwd: opts.loc.cwd,\n sessionId: opts.sessionId,\n model: opts.loc.model ?? \"unknown\",\n });\n transcript.appendUserTurn(opts.userText);\n transcript.appendAssistantTurn({ text: opts.assistantText });\n await opts.store.appendRecords(opts.loc.agentId, transcript.records().slice(prior.length));\n invalidateSessionCache(opts.loc.cwd, opts.loc.agentId);\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/internal/session/inject-session.ts"],"names":[],"mappings":";;;;;;;AAWA,eAAsB,kBAAkB,IAAA,EAMtB;AAChB,EAAA,MAAM,oBAAoB,IAAA,CAAK,GAAA,CAAI,KAAK,IAAA,CAAK,GAAA,CAAI,SAAS,YAAY;AACpE,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,MAAM,WAAA,CAAY,IAAA,CAAK,IAAI,OAAO,CAAA;AAC3D,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,WAAA,CAAY,KAAA,EAAO;AAAA,MACtD,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,KAAA,IAAS;AAAA,KAC1B,CAAA;AACD,IAAA,UAAA,CAAW,cAAA,CAAe,KAAK,QAAQ,CAAA;AACvC,IAAA,UAAA,CAAW,mBAAA,CAAoB,EAAE,IAAA,EAAM,IAAA,CAAK,eAAe,CAAA;AAC3D,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,aAAA,CAAc,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,UAAA,CAAW,OAAA,EAAQ,CAAE,KAAA,CAAM,KAAA,CAAM,MAAM,CAAC,CAAA;AACzF,IAAA,sBAAA,CAAuB,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,IAAI,OAAO,CAAA;AAAA,EACvD,CAAC,CAAA;AACH","file":"inject-session-V5FTK72N.js","sourcesContent":["/**\n * M51 (agent-builder) — inject a SYNTHETIC user+assistant pair into a session's persisted transcript\n * WITHOUT running an LLM turn. This is the Codex review-exit mechanism (`exit_success.xml` appended to\n * the parent thread history so follow-ups like \"fix finding 2\" work): the pair chains onto the DAG\n * leaf (M50 pattern) and the in-memory cache is invalidated so the NEXT send re-hydrates with it.\n */\nimport type { SessionStore } from \"../../types/session-store.js\";\nimport { SessionTranscript } from \"../persistence/session-transcript.js\";\nimport { enqueueSessionWrite, invalidateSessionCache } from \"./agent-session.js\";\nimport type { CompactLocation } from \"./compact-session.js\";\n\nexport async function injectSessionTurn(opts: {\n store: SessionStore;\n loc: CompactLocation;\n sessionId: string;\n userText: string;\n assistantText: string;\n}): Promise<void> {\n await enqueueSessionWrite(opts.loc.cwd, opts.loc.agentId, async () => {\n const prior = await opts.store.readRecords(opts.loc.agentId);\n const transcript = SessionTranscript.fromRecords(prior, {\n cwd: opts.loc.cwd,\n sessionId: opts.sessionId,\n model: opts.loc.model ?? \"unknown\",\n });\n transcript.appendUserTurn(opts.userText);\n transcript.appendAssistantTurn({ text: opts.assistantText });\n await opts.store.appendRecords(opts.loc.agentId, transcript.records().slice(prior.length));\n invalidateSessionCache(opts.loc.cwd, opts.loc.agentId);\n });\n}\n"]}
@@ -31,6 +31,21 @@ export declare class FsSessionStore implements SessionStore {
31
31
  constructor(options: FsSessionStoreOptions);
32
32
  readRecords(agentId: string): Promise<SessionRecord[]>;
33
33
  appendRecords(agentId: string, records: readonly SessionRecord[]): Promise<void>;
34
+ /**
35
+ * Toma o lease de escritor da sessão. Lança `SessionBusyError` quando outro processo a detém.
36
+ *
37
+ * **Explícito, e NÃO no `appendRecords`** — a revisão adversarial do M95 mediu por que isso
38
+ * importa: o contrato de `SessionStore` diz que "an `appendRecords` rejection is logged to
39
+ * stderr, NOT thrown to the caller (best-effort write)". Adquirir ali fazia o `SessionBusyError`
40
+ * ser **engolido**, e o resultado era pior que o problema original: em vez de dois escritores
41
+ * intercalarem linhas, o perdedor **perdia o turno em silêncio** — nada em disco, um aviso em
42
+ * stderr invisível sob a TUI, e o chamador sem como reagir.
43
+ *
44
+ * No init o erro chega a quem pode agir: o `exec` forka para um id novo, que é o que a própria
45
+ * mensagem do erro prescreve. É a diferença entre falhar onde dá para decidir e falhar onde só
46
+ * dá para perder.
47
+ */
48
+ acquire(agentId: string): Promise<void>;
34
49
  /**
35
50
  * Solta todo lease que este store detém.
36
51
  *
@@ -31,6 +31,21 @@ export declare class FsSessionStore implements SessionStore {
31
31
  constructor(options: FsSessionStoreOptions);
32
32
  readRecords(agentId: string): Promise<SessionRecord[]>;
33
33
  appendRecords(agentId: string, records: readonly SessionRecord[]): Promise<void>;
34
+ /**
35
+ * Toma o lease de escritor da sessão. Lança `SessionBusyError` quando outro processo a detém.
36
+ *
37
+ * **Explícito, e NÃO no `appendRecords`** — a revisão adversarial do M95 mediu por que isso
38
+ * importa: o contrato de `SessionStore` diz que "an `appendRecords` rejection is logged to
39
+ * stderr, NOT thrown to the caller (best-effort write)". Adquirir ali fazia o `SessionBusyError`
40
+ * ser **engolido**, e o resultado era pior que o problema original: em vez de dois escritores
41
+ * intercalarem linhas, o perdedor **perdia o turno em silêncio** — nada em disco, um aviso em
42
+ * stderr invisível sob a TUI, e o chamador sem como reagir.
43
+ *
44
+ * No init o erro chega a quem pode agir: o `exec` forka para um id novo, que é o que a própria
45
+ * mensagem do erro prescreve. É a diferença entre falhar onde dá para decidir e falhar onde só
46
+ * dá para perder.
47
+ */
48
+ acquire(agentId: string): Promise<void>;
34
49
  /**
35
50
  * Solta todo lease que este store detém.
36
51
  *
@@ -54,11 +54,21 @@ export interface SessionWriterLease {
54
54
  * processes, not just across async tasks in one process.
55
55
  */
56
56
  /**
57
- * Janela de heartbeat: um lock mais velho que isto é considerado obsoleto.
57
+ * Janela de obsolescência **entre máquinas** e entre elas.
58
58
  *
59
- * 30 s. Curta o bastante para não trancar o usuário por minutos depois de um crash; longa o
60
- * bastante para não reclamar o lock de um processo vivo que está lento em I/O. O dono toca o
61
- * arquivo a cada aquisição, então um processo ativo nunca cruza a janela.
59
+ * 30 s a partir da AQUISIÇÃO. O nome "heartbeat" seria mentira: o registro é gravado uma vez, na
60
+ * tomada do lease, e **não** é renovado a cada escrita. A versão anterior deste comentário dizia
61
+ * "o dono toca o arquivo a cada aquisição, então um processo ativo nunca cruza a janela" — falso
62
+ * duas vezes, e a revisão adversarial mediu as duas.
63
+ *
64
+ * No **mesmo host** isso não importa: `reclamavel` decide pelo `pid`, que é exato, e a idade não
65
+ * entra na conta. Entre hosts, importa e é um limite real: um dono remoto **vivo** perde o lease
66
+ * depois de 30 s, porque não há como perguntar a outra máquina se o processo dela existe.
67
+ *
68
+ * **Resíduo declarado, não mecanizado** (a disciplina de `error-handling.md § 4`): renovar o
69
+ * registro a cada append fecharia essa janela, ao custo de um `write` por turno num arquivo que
70
+ * hoje é escrito uma vez por sessão. Não foi feito, e o caso multi-host não é o que motiva este
71
+ * milestone — o enunciado é `exec` e TUI na mesma máquina.
62
72
  */
63
73
  export declare const JANELA_DE_HEARTBEAT_MS = 30000;
64
74
  export declare function acquireSessionWriter(sessionPath: string): Promise<SessionWriterLease>;
@@ -54,11 +54,21 @@ export interface SessionWriterLease {
54
54
  * processes, not just across async tasks in one process.
55
55
  */
56
56
  /**
57
- * Janela de heartbeat: um lock mais velho que isto é considerado obsoleto.
57
+ * Janela de obsolescência **entre máquinas** e entre elas.
58
58
  *
59
- * 30 s. Curta o bastante para não trancar o usuário por minutos depois de um crash; longa o
60
- * bastante para não reclamar o lock de um processo vivo que está lento em I/O. O dono toca o
61
- * arquivo a cada aquisição, então um processo ativo nunca cruza a janela.
59
+ * 30 s a partir da AQUISIÇÃO. O nome "heartbeat" seria mentira: o registro é gravado uma vez, na
60
+ * tomada do lease, e **não** é renovado a cada escrita. A versão anterior deste comentário dizia
61
+ * "o dono toca o arquivo a cada aquisição, então um processo ativo nunca cruza a janela" — falso
62
+ * duas vezes, e a revisão adversarial mediu as duas.
63
+ *
64
+ * No **mesmo host** isso não importa: `reclamavel` decide pelo `pid`, que é exato, e a idade não
65
+ * entra na conta. Entre hosts, importa e é um limite real: um dono remoto **vivo** perde o lease
66
+ * depois de 30 s, porque não há como perguntar a outra máquina se o processo dela existe.
67
+ *
68
+ * **Resíduo declarado, não mecanizado** (a disciplina de `error-handling.md § 4`): renovar o
69
+ * registro a cada append fecharia essa janela, ao custo de um `write` por turno num arquivo que
70
+ * hoje é escrito uma vez por sessão. Não foi feito, e o caso multi-host não é o que motiva este
71
+ * milestone — o enunciado é `exec` e TUI na mesma máquina.
62
72
  */
63
73
  export declare const JANELA_DE_HEARTBEAT_MS = 30000;
64
74
  export declare function acquireSessionWriter(sessionPath: string): Promise<SessionWriterLease>;
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkPNVDQL5Y_cjs = require('./chunk-PNVDQL5Y.cjs');
4
- var chunkNEPJ3TC4_cjs = require('./chunk-NEPJ3TC4.cjs');
4
+ var chunkK2BXB2TZ_cjs = require('./chunk-K2BXB2TZ.cjs');
5
5
  var chunkCJVMDRQB_cjs = require('./chunk-CJVMDRQB.cjs');
6
6
  var chunkJD74LN7R_cjs = require('./chunk-JD74LN7R.cjs');
7
7
  var chunkYLQQX5W2_cjs = require('./chunk-YLQQX5W2.cjs');
@@ -83,11 +83,11 @@ Object.defineProperty(exports, "PersistenceSchema", {
83
83
  });
84
84
  Object.defineProperty(exports, "SessionBusyError", {
85
85
  enumerable: true,
86
- get: function () { return chunkNEPJ3TC4_cjs.SessionBusyError; }
86
+ get: function () { return chunkK2BXB2TZ_cjs.SessionBusyError; }
87
87
  });
88
88
  Object.defineProperty(exports, "acquireSessionWriter", {
89
89
  enumerable: true,
90
- get: function () { return chunkNEPJ3TC4_cjs.acquireSessionWriter; }
90
+ get: function () { return chunkK2BXB2TZ_cjs.acquireSessionWriter; }
91
91
  });
92
92
  Object.defineProperty(exports, "JsonlParseError", {
93
93
  enumerable: true,
@@ -1,5 +1,5 @@
1
1
  export { PersistenceSchema } from './chunk-CAH3G4IS.js';
2
- export { SessionBusyError, acquireSessionWriter } from './chunk-TOVGIP4L.js';
2
+ export { SessionBusyError, acquireSessionWriter } from './chunk-ODB6CFVT.js';
3
3
  export { JsonlParseError, appendJsonl, loadJsonl, readJsonlIds, withFileLock } from './chunk-UAYYNWYJ.js';
4
4
  export { applyWalWithFallback, isCorruptionError, openSqliteResilient, sanitizeFts5Query } from './chunk-77FOZCOT.js';
5
5
  export { withCwdMutex } from './chunk-2XLKLVVR.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theokit/sdk",
3
- "version": "4.33.1",
3
+ "version": "4.34.1",
4
4
  "description": "TypeScript SDK for the Theo agent harness — same surface, local or cloud.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/usetheodev/theokit-sdk#readme",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/internal/persistence/fs-session-store.ts"],"names":["acquireSessionWriter","readTranscript","transcriptPath","path","mkdir","dirname","withFileLock","appendJsonl"],"mappings":";;;;;;;;AAyDA,IAAM,cAAA,uBAAqB,GAAA,EAAyD;AAEpF,eAAe,sBAAsB,IAAA,EAA2C;AAC9E,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA;AACzC,EAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,IAAA,SAAA,CAAU,IAAA,EAAA;AACV,IAAA,OAAO,WAAW,IAAI,CAAA;AAAA,EACxB;AACA,EAAA,MAAM,KAAA,GAAQ,MAAMA,sCAAA,CAAqB,IAAI,CAAA;AAC7C,EAAA,cAAA,CAAe,IAAI,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,EAAM,GAAG,CAAA;AAC3C,EAAA,OAAO,WAAW,IAAI,CAAA;AACxB;AAGA,SAAS,WAAW,IAAA,EAAkC;AACpD,EAAA,IAAI,KAAA,GAAQ,KAAA;AACZ,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,IAAA;AAAA,IACb,SAAS,YAA2B;AAClC,MAAA,IAAI,KAAA,EAAO;AACX,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA;AACvC,MAAA,IAAI,YAAY,MAAA,EAAW;AAC3B,MAAA,OAAA,CAAQ,IAAA,EAAA;AACR,MAAA,IAAI,OAAA,CAAQ,OAAO,CAAA,EAAG;AACtB,MAAA,cAAA,CAAe,OAAO,IAAI,CAAA;AAC1B,MAAA,MAAM,OAAA,CAAQ,MAAM,OAAA,EAAQ;AAAA,IAC9B;AAAA,GACF;AACF;AAEO,IAAM,iBAAN,MAA6C;AAAA,EACzC,QAAA;AAAA,EACA,IAAA;AAAA;AAAA,EAEA,OAAA,uBAAc,GAAA,EAAgC;AAAA,EAEvD,YAAY,OAAA,EAAgC;AAC1C,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,OAAA;AACxB,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,GAAA;AAAA,EACtB;AAAA,EAEA,MAAM,YAAY,OAAA,EAA2C;AAC3D,IAAA,OAAOC,iCAAeC,gCAAA,CAAe,IAAA,CAAK,UAAU,IAAA,CAAK,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,EACzE;AAAA,EAEA,MAAM,aAAA,CAAc,OAAA,EAAiB,OAAA,EAAkD;AAErF,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAMC,SAAOD,gCAAA,CAAe,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,MAAM,OAAO,CAAA;AAE7D,IAAA,MAAME,eAAMC,YAAA,CAAQF,MAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAK9C,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,OAAA,EAAS,MAAM,qBAAA,CAAsBA,MAAI,CAAC,CAAA;AAAA,IAC7D;AACA,IAAA,MAAMG,8BAAA,CAAaH,QAAM,YAAY;AAyBnC,MAAA,KAAA,MAAW,MAAA,IAAU,OAAA,EAASI,6BAAA,CAAYJ,MAAA,EAAM,MAAM,CAAA;AAAA,IACxD,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,OAAA,GAAyB;AAC7B,IAAA,MAAM,SAAS,CAAC,GAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACxC,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,EAAQ,MAAM,KAAA,CAAM,OAAA,EAAQ;AAAA,EAClD;AACF","file":"chunk-2BYBFBNH.cjs","sourcesContent":["/**\n * SE41 — `FsSessionStore`, the DEFAULT reference implementation of the pluggable\n * {@link SessionStore} seam. It reads and append-writes the native Claude-shaped\n * `.jsonl` transcript at `<baseDir>/projects/<encoded-cwd>/<agentId>.jsonl` — the\n * exact on-disk format SE40 introduced (the file the Claude Code CLI can\n * `--continue`). Omitting `local.sessionStore` resolves to this store, so the\n * default persistence path is byte-identical to SE40 behavior.\n *\n * `readRecords` is `readTranscript(transcriptPath(...))` (a missing session →\n * `[]`, not an error — a fresh agent has no history). `appendRecords` is a TRUE\n * append: it reads the prior records, concatenates the new-turn delta, and\n * rewrites the whole line set atomically under the SE40 cross-process file lock\n * (`writeTranscript` never shrinks — the native format is an append-only\n * `parentUuid` DAG). The parent dir is created BEFORE acquiring the lock because\n * the lock's companion `<path>.lock` file needs an existing parent dir (the SE40\n * `mkdir(dirname)`-before-lock fix).\n *\n * @internal\n */\n\nimport { mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { SessionStore } from \"../../types/session-store.js\";\nimport { withFileLock } from \"./file-lock.js\";\nimport { appendJsonl } from \"./jsonl.js\";\nimport { readTranscript, type SessionRecord, transcriptPath } from \"./session-transcript.js\";\nimport { acquireSessionWriter, type SessionWriterLease } from \"./session-writer.js\";\n\n/** Options identifying the on-disk transcript location for the FS default store. */\nexport interface FsSessionStoreOptions {\n /** Transcript base dir (`~/.theokit` default, `~/.claude` for CLI interop) — already `~`-expanded. */\n baseDir: string;\n /** The workspace cwd whose encoded form is the transcript project dir. */\n cwd: string;\n}\n\n/**\n * The default `SessionStore` — reads/append-writes the native `.jsonl` transcript.\n *\n * @internal\n */\n/**\n * Leases compartilhados por caminho, com contagem de referências.\n *\n * `acquireSessionWriter` é ESTRITO de propósito: duas aquisições concorrentes do mesmo caminho, e\n * exatamente uma vence — \"um lease que deixasse as duas passarem seria decorativo\" (o teste do M81\n * diz isso com todas as letras, e está certo). Esse é o contrato do primitivo, e ele não muda.\n *\n * Mas dentro de UM processo é normal existir mais de um store sobre a mesma sessão: os testes\n * golden de compactação e de sends concorrentes fazem exatamente isso, e são registro de\n * comportamento real do runtime. Aplicar o primitivo cru ali transformaria um padrão legítimo em\n * `SessionBusyError`.\n *\n * A conciliação é aqui, no consumidor do primitivo: o processo tira UM lease por caminho e conta\n * quantos stores o usam. O último a soltar libera de fato. Cross-process continua estrito — que é o\n * problema que o M81 enuncia (\"`exec resume --last` pode escrever na sessão viva da TUI\").\n */\nconst compartilhados = new Map<string, { lease: SessionWriterLease; refs: number }>();\n\nasync function adquirirCompartilhado(path: string): Promise<SessionWriterLease> {\n const existente = compartilhados.get(path);\n if (existente !== undefined) {\n existente.refs++;\n return criarProxy(path);\n }\n const lease = await acquireSessionWriter(path);\n compartilhados.set(path, { lease, refs: 1 });\n return criarProxy(path);\n}\n\n/** Um handle que decrementa a contagem; o último a soltar libera o lease de verdade. */\nfunction criarProxy(path: string): SessionWriterLease {\n let solto = false;\n return {\n sessionPath: path,\n release: async (): Promise<void> => {\n if (solto) return;\n solto = true;\n const entrada = compartilhados.get(path);\n if (entrada === undefined) return;\n entrada.refs--;\n if (entrada.refs > 0) return;\n compartilhados.delete(path);\n await entrada.lease.release();\n },\n };\n}\n\nexport class FsSessionStore implements SessionStore {\n readonly #baseDir: string;\n readonly #cwd: string;\n /** Um lease por `agentId` — um store serve mais de uma sessão ao longo da vida do processo. */\n readonly #leases = new Map<string, SessionWriterLease>();\n\n constructor(options: FsSessionStoreOptions) {\n this.#baseDir = options.baseDir;\n this.#cwd = options.cwd;\n }\n\n async readRecords(agentId: string): Promise<SessionRecord[]> {\n return readTranscript(transcriptPath(this.#baseDir, this.#cwd, agentId));\n }\n\n async appendRecords(agentId: string, records: readonly SessionRecord[]): Promise<void> {\n // Empty delta → nothing to persist (avoids an unnecessary lock + rewrite).\n if (records.length === 0) return;\n const path = transcriptPath(this.#baseDir, this.#cwd, agentId);\n // mkdir BEFORE the lock: withFileLock's companion `<path>.lock` needs the parent dir.\n await mkdir(dirname(path), { recursive: true });\n // M95 — a garantia de escritor único do M81 finalmente LIGADA. Ela existia como\n // `acquireSessionWriter` e tinha ZERO chamadores de produção desde o dia em que foi escrita;\n // o roadmap a registrava como entregue. Adquirido no primeiro append (leitura segue livre) e\n // solto em `dispose()`.\n if (!this.#leases.has(agentId)) {\n this.#leases.set(agentId, await adquirirCompartilhado(path));\n }\n await withFileLock(path, async () => {\n // M93 — acrescenta o DELTA em vez de reescrever o arquivo inteiro.\n //\n // Antes: `readTranscript` + `writeTranscript` de tudo, por turno. O(n) de I/O **e** de parse a\n // cada turno, O(n²) por sessão — a nota do consumidor em `agents/lib/session/backtrack.ts`\n // registra 1,4 MB / 3000 linhas em 200 turnos.\n //\n // Correto porque o formato **já é append-only**: o DAG de `parentUuid` não depende da ordem de\n // linha, e cada registro carrega o próprio pai. `appendJsonl` **já existia no pacote** e tinha um\n // único chamador (`eval/runner.ts`) — a primitiva estava lá, o store é que a ignorava (rung 4).\n //\n // O `withFileLock` permanece — mas a afirmação anterior de que \"ele é o que serializa dois\n // `appendRecords` concorrentes\" era forte demais, e a revisão adversarial do M93 mediu isso:\n // removê-lo não reprova nenhum teste. A razão é o próprio parágrafo acima — o DAG de\n // `parentUuid` não depende da ordem de linha, então dois lotes intercalados reconstroem igual.\n // O trabalho que o lock fazia (proteger um read-modify-write) sumiu junto com o rewrite.\n //\n // O que ele ainda cobre é a janela TOCTOU de `precisaDeQuebraAntes` (ler o último byte, depois\n // escrever): sem ele, dois processos podem ambos concluir \"falta \\n\" e produzir uma linha em\n // branco — que o leitor descarta, isto é, benigno. Fica como **defesa declarada, não\n // mecanizada** (a disciplina de `error-handling.md § 4`: enumerar o resíduo em vez de deixar a\n // ausência de teste passar por cobertura).\n //\n // `writeTranscript` continua existindo para **compactação**, a única operação que legitimamente\n // reescreve o arquivo.\n for (const record of records) appendJsonl(path, record);\n });\n }\n\n /**\n * Solta todo lease que este store detém.\n *\n * Sem isto o `.writer.lock` sobrevive ao processo e a próxima abertura teria de esperar a janela\n * de heartbeat — recuperável, mas 30 s de espera para um encerramento LIMPO seria um defeito\n * evitável. Idempotente: chamar duas vezes não é erro.\n */\n async dispose(): Promise<void> {\n const leases = [...this.#leases.values()];\n this.#leases.clear();\n for (const lease of leases) await lease.release();\n }\n}\n"]}