@theokit/sdk 2.3.0 → 2.5.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 (101) hide show
  1. package/CHANGELOG.md +113 -0
  2. package/dist/a2a/index.cjs +103 -48
  3. package/dist/a2a/index.cjs.map +1 -1
  4. package/dist/a2a/index.js +104 -49
  5. package/dist/a2a/index.js.map +1 -1
  6. package/dist/compaction.cjs +78 -0
  7. package/dist/compaction.cjs.map +1 -0
  8. package/dist/compaction.d.cts +76 -0
  9. package/dist/compaction.d.ts +76 -0
  10. package/dist/compaction.js +70 -0
  11. package/dist/compaction.js.map +1 -0
  12. package/dist/{cron-B_H8rn-j.d.cts → cron-B656C3iq.d.cts} +8 -0
  13. package/dist/{cron-DX6HbHxd.d.ts → cron-CM2M9mhB.d.ts} +8 -0
  14. package/dist/cron.cjs +104 -57
  15. package/dist/cron.cjs.map +1 -1
  16. package/dist/cron.d.cts +1 -1
  17. package/dist/cron.d.ts +1 -1
  18. package/dist/cron.js +104 -57
  19. package/dist/cron.js.map +1 -1
  20. package/dist/eval.cjs +296 -73
  21. package/dist/eval.cjs.map +1 -1
  22. package/dist/eval.d.cts +2 -0
  23. package/dist/eval.d.ts +2 -0
  24. package/dist/eval.js +295 -75
  25. package/dist/eval.js.map +1 -1
  26. package/dist/index.cjs +135 -65
  27. package/dist/index.cjs.map +1 -1
  28. package/dist/index.d.cts +42 -7
  29. package/dist/index.d.ts +42 -7
  30. package/dist/index.js +135 -66
  31. package/dist/index.js.map +1 -1
  32. package/dist/internal/agent-loop/loop.d.ts +5 -0
  33. package/dist/internal/eval/code-runner.d.ts +28 -0
  34. package/dist/internal/llm/model-capabilities.d.ts +40 -0
  35. package/dist/internal/llm/model-identifier.d.ts +9 -1
  36. package/dist/internal/llm/model-option.d.ts +38 -0
  37. package/dist/internal/persistence/index.cjs +68 -0
  38. package/dist/internal/persistence/index.cjs.map +1 -1
  39. package/dist/internal/persistence/index.d.cts +1 -0
  40. package/dist/internal/persistence/index.d.ts +1 -0
  41. package/dist/internal/persistence/index.js +65 -1
  42. package/dist/internal/persistence/index.js.map +1 -1
  43. package/dist/internal/persistence/jsonl.d.cts +34 -0
  44. package/dist/internal/persistence/jsonl.d.ts +34 -0
  45. package/dist/internal/runtime/compression/compression-attempt.d.ts +24 -0
  46. package/dist/internal/runtime/compression/compression-config.d.ts +33 -0
  47. package/dist/internal/runtime/compression/compression-decision.d.ts +10 -0
  48. package/dist/internal/runtime/compression/compression-helpers.d.ts +18 -0
  49. package/dist/internal/runtime/compression/compression-model-registry.d.ts +41 -0
  50. package/dist/internal/runtime/compression/compression-summarizer.d.ts +29 -0
  51. package/dist/internal/runtime/context/project-instructions.d.ts +66 -0
  52. package/dist/internal/runtime/context/replay-history.d.ts +43 -0
  53. package/dist/internal/runtime/hooks/hooks-frontmatter.d.ts +1 -1
  54. package/dist/internal/runtime/skills/discover-skills.d.ts +68 -0
  55. package/dist/internal/runtime/skills/skills-block.d.ts +18 -0
  56. package/dist/internal/runtime/skills/subagent-tool-scope.d.ts +25 -0
  57. package/dist/messages.cjs +24 -0
  58. package/dist/messages.cjs.map +1 -0
  59. package/dist/messages.d.cts +33 -0
  60. package/dist/messages.d.ts +33 -0
  61. package/dist/messages.js +20 -0
  62. package/dist/messages.js.map +1 -0
  63. package/dist/models.cjs +233 -0
  64. package/dist/models.cjs.map +1 -0
  65. package/dist/models.d.cts +16 -0
  66. package/dist/models.d.ts +16 -0
  67. package/dist/models.js +228 -0
  68. package/dist/models.js.map +1 -0
  69. package/dist/permission-engine.d.ts +12 -4
  70. package/dist/project.cjs +149 -0
  71. package/dist/project.cjs.map +1 -0
  72. package/dist/project.d.cts +14 -0
  73. package/dist/project.d.ts +14 -0
  74. package/dist/project.js +146 -0
  75. package/dist/project.js.map +1 -0
  76. package/dist/sandbox/index.cjs +71 -1
  77. package/dist/sandbox/index.cjs.map +1 -1
  78. package/dist/sandbox/index.d.cts +1 -0
  79. package/dist/sandbox/index.d.ts +1 -0
  80. package/dist/sandbox/index.js +70 -2
  81. package/dist/sandbox/index.js.map +1 -1
  82. package/dist/sandbox/provision.d.cts +53 -0
  83. package/dist/sandbox/provision.d.ts +53 -0
  84. package/dist/sandbox/shell-escape.d.cts +8 -0
  85. package/dist/sandbox/shell-escape.d.ts +8 -0
  86. package/dist/scorers.d.ts +19 -1
  87. package/dist/skills.cjs +282 -0
  88. package/dist/skills.cjs.map +1 -0
  89. package/dist/skills.d.cts +19 -0
  90. package/dist/skills.d.ts +19 -0
  91. package/dist/skills.js +279 -0
  92. package/dist/skills.js.map +1 -0
  93. package/dist/subagents.cjs +24 -0
  94. package/dist/subagents.cjs.map +1 -0
  95. package/dist/subagents.d.cts +14 -0
  96. package/dist/subagents.d.ts +14 -0
  97. package/dist/subagents.js +21 -0
  98. package/dist/subagents.js.map +1 -0
  99. package/dist/types/agent.d.ts +8 -0
  100. package/dist/types/eval.d.ts +71 -0
  101. package/package.json +74 -14
package/dist/index.cjs CHANGED
@@ -8959,6 +8959,8 @@ function parseSubagentMarkdown(raw, filename) {
8959
8959
  if (fields.model !== void 0) {
8960
8960
  definition.model = fields.model === "inherit" ? "inherit" : { id: fields.model };
8961
8961
  }
8962
+ const tools = fields.tools?.split(/[\s,]+/).map((t) => t.trim()).filter((t) => t.length > 0);
8963
+ if (tools !== void 0 && tools.length > 0) definition.tools = tools;
8962
8964
  return { name, definition };
8963
8965
  }
8964
8966
  function splitFrontmatter2(raw, filename) {
@@ -9122,21 +9124,24 @@ ${lines.join("\n")}
9122
9124
  }
9123
9125
  };
9124
9126
 
9127
+ // src/internal/runtime/skills/skills-block.ts
9128
+ function buildSkillsBlock(skills) {
9129
+ if (skills.length === 0) return void 0;
9130
+ const lines = skills.map(
9131
+ (skill) => ` - ${escapeBlockBody(skill.name)}: ${escapeBlockBody(skill.description)}`
9132
+ );
9133
+ return `<skills>
9134
+ ${lines.join("\n")}
9135
+ </skills>`;
9136
+ }
9137
+
9125
9138
  // src/internal/runtime/system-prompt/sources/skills-provider.ts
9126
9139
  var SkillsPromptProvider = class {
9127
9140
  id = "skills";
9128
9141
  priority = 20;
9129
9142
  contribute(ctx) {
9130
9143
  if (ctx.skillsAutoInject === false) return Promise.resolve(void 0);
9131
- if (ctx.skills.length === 0) return Promise.resolve(void 0);
9132
- const lines = ctx.skills.map((skill) => {
9133
- const name = escapeBlockBody(skill.name);
9134
- const description = escapeBlockBody(skill.description);
9135
- return ` - ${name}: ${description}`;
9136
- });
9137
- return Promise.resolve(`<skills>
9138
- ${lines.join("\n")}
9139
- </skills>`);
9144
+ return Promise.resolve(buildSkillsBlock(ctx.skills));
9140
9145
  }
9141
9146
  };
9142
9147
 
@@ -10245,7 +10250,7 @@ async function loadPluginManifestFromMarkdown(pluginsRoot, folderName) {
10245
10250
  return metadata;
10246
10251
  }
10247
10252
 
10248
- // src/internal/runtime/skills/skills-manager.ts
10253
+ // src/internal/runtime/skills/discover-skills.ts
10249
10254
  init_errors();
10250
10255
  init_path_guard();
10251
10256
 
@@ -10318,6 +10323,61 @@ function hasContent(value) {
10318
10323
  return value !== void 0 && value.trim().length > 0;
10319
10324
  }
10320
10325
 
10326
+ // src/internal/runtime/skills/discover-skills.ts
10327
+ async function discoverSkills(dir, options) {
10328
+ let entries;
10329
+ try {
10330
+ entries = await readWorkspaceDir(dir, "skills_read_error", "skills directory");
10331
+ } catch {
10332
+ return [];
10333
+ }
10334
+ const skills = [];
10335
+ for (const entry of entries) {
10336
+ if (!entry.isDirectory()) continue;
10337
+ let skillDir;
10338
+ try {
10339
+ skillDir = safePathJoin(dir, entry.name);
10340
+ assertNoSymlinkEscape(skillDir, dir);
10341
+ } catch {
10342
+ continue;
10343
+ }
10344
+ const skillPath = path.join(skillDir, "SKILL.md");
10345
+ let raw;
10346
+ try {
10347
+ raw = await promises.readFile(skillPath, "utf8");
10348
+ } catch {
10349
+ continue;
10350
+ }
10351
+ const skill = tryParseSkill(raw, entry.name, skillPath, options);
10352
+ if (skill !== void 0) skills.push(skill);
10353
+ }
10354
+ return skills;
10355
+ }
10356
+ function tryParseSkill(raw, fallbackName, source, options) {
10357
+ try {
10358
+ const frontmatter = parseSkillFrontmatter(raw, fallbackName);
10359
+ const skill = {
10360
+ name: frontmatter.name,
10361
+ description: frontmatter.description,
10362
+ source
10363
+ };
10364
+ if (frontmatter.category !== void 0) skill.category = frontmatter.category;
10365
+ if (frontmatter.dependencies !== void 0) skill.dependencies = frontmatter.dependencies;
10366
+ return skill;
10367
+ } catch (cause) {
10368
+ if (cause instanceof exports.ConfigurationError) {
10369
+ options?.onInvalidSkill?.({
10370
+ name: fallbackName,
10371
+ source,
10372
+ code: cause.code ?? "unknown",
10373
+ message: cause.message
10374
+ });
10375
+ return void 0;
10376
+ }
10377
+ throw cause;
10378
+ }
10379
+ }
10380
+
10321
10381
  // src/internal/runtime/skills/skills-manager.ts
10322
10382
  var SkillsManager = class {
10323
10383
  constructor(cwd, _enabled, settingSourcesIncludeProject) {
@@ -10335,56 +10395,20 @@ var SkillsManager = class {
10335
10395
  await this.refresh();
10336
10396
  }
10337
10397
  async refresh() {
10338
- this.skills = [];
10339
10398
  const skillsRoot = path.join(this.cwd, ".theokit", "skills");
10340
- const entries = await readWorkspaceDir(skillsRoot, "skills_read_error", "skills directory");
10341
- for (const entry of entries) {
10342
- if (!entry.isDirectory()) continue;
10343
- let skillDir;
10344
- try {
10345
- skillDir = safePathJoin(skillsRoot, entry.name);
10346
- assertNoSymlinkEscape(skillDir, skillsRoot);
10347
- } catch {
10348
- continue;
10349
- }
10350
- const skillPath = path.join(skillDir, "SKILL.md");
10351
- let raw;
10352
- try {
10353
- raw = await promises.readFile(skillPath, "utf8");
10354
- } catch {
10355
- continue;
10399
+ this.skills = await discoverSkills(skillsRoot, {
10400
+ onInvalidSkill: (info) => {
10401
+ process.stderr.write(
10402
+ `[theokit-sdk] skill ${info.name} skipped (${info.code}): ${info.message}
10403
+ `
10404
+ );
10356
10405
  }
10357
- const metadata = tryParseSkill(raw, entry.name, skillPath);
10358
- if (metadata !== void 0) this.skills.push(metadata);
10359
- }
10406
+ });
10360
10407
  }
10361
10408
  list() {
10362
10409
  return Promise.resolve(this.skills);
10363
10410
  }
10364
10411
  };
10365
- function tryParseSkill(raw, fallbackName, source) {
10366
- try {
10367
- const frontmatter = parseSkillFrontmatter(raw, fallbackName);
10368
- const metadata = {
10369
- name: frontmatter.name,
10370
- description: frontmatter.description,
10371
- source
10372
- };
10373
- if (frontmatter.category !== void 0) metadata.category = frontmatter.category;
10374
- if (frontmatter.dependencies !== void 0) metadata.dependencies = frontmatter.dependencies;
10375
- return metadata;
10376
- } catch (cause) {
10377
- if (cause instanceof exports.ConfigurationError) {
10378
- const code = cause.code ?? "unknown";
10379
- process.stderr.write(
10380
- `[theokit-sdk] skill ${fallbackName} skipped (${code}): ${cause.message}
10381
- `
10382
- );
10383
- return void 0;
10384
- }
10385
- throw cause;
10386
- }
10387
- }
10388
10412
 
10389
10413
  // src/internal/runtime/local-agent/local-agent-bootstrap.ts
10390
10414
  function registerLocalAgent(args) {
@@ -10797,6 +10821,7 @@ async function initLoopContext(inputs) {
10797
10821
  finalStatus: "finished",
10798
10822
  usage: new UsageAccumulator(),
10799
10823
  nudgeAttempts: 0,
10824
+ stopFeedbackAttempts: 0,
10800
10825
  ...memoryProviderHandle !== void 0 ? { memoryProviderHandle } : {},
10801
10826
  ...memorySystemPromptAdditions !== void 0 ? { memorySystemPromptAdditions } : {}
10802
10827
  };
@@ -10941,8 +10966,9 @@ function registerLoopError(ctx, cause) {
10941
10966
  if (ctx.error !== void 0) return;
10942
10967
  const rawMessage = cause?.message;
10943
10968
  const message = typeof rawMessage === "string" ? rawMessage : cause instanceof Error ? cause.message : String(cause);
10969
+ const metaCode = cause?.metadata?.code;
10944
10970
  const rawCode = cause?.code;
10945
- const code = typeof rawCode === "string" ? rawCode : void 0;
10971
+ const code = typeof metaCode === "string" ? metaCode : typeof rawCode === "string" ? rawCode : void 0;
10946
10972
  ctx.error = code !== void 0 ? { message, code, cause } : { message, cause };
10947
10973
  }
10948
10974
  async function runCollectorLoop(generator, inputs, ctx) {
@@ -11738,6 +11764,7 @@ function computeUsageCost(inputs, usage) {
11738
11764
 
11739
11765
  // src/internal/agent-loop/loop.ts
11740
11766
  var MAX_NUDGE_ATTEMPTS = 2;
11767
+ var MAX_STOP_FEEDBACK_ATTEMPTS = 2;
11741
11768
  async function runAgentLoop(inputs) {
11742
11769
  const sendSpan = inputs.telemetry?.startSpan("agent.send", {
11743
11770
  agentId: inputs.agentId,
@@ -11895,6 +11922,28 @@ function shouldNudgeAndContinue(ctx, llmOutput) {
11895
11922
  });
11896
11923
  return true;
11897
11924
  }
11925
+ async function reflectAfterStop(inputs, ctx) {
11926
+ const result = await inputs.hooks.run({
11927
+ event: "stop",
11928
+ agentId: inputs.agentId,
11929
+ runId: inputs.runId
11930
+ });
11931
+ if (result.blocked) return false;
11932
+ if (ctx.stopFeedbackAttempts >= MAX_STOP_FEEDBACK_ATTEMPTS) return false;
11933
+ const feedback = result.decisions.find(
11934
+ (d) => d.decision === "feedback" && (d.feedback ?? "").length > 0
11935
+ )?.feedback;
11936
+ if (feedback === void 0) return false;
11937
+ ctx.stopFeedbackAttempts += 1;
11938
+ ctx.messages.push({ role: "user", content: [{ type: "text", text: feedback }] });
11939
+ return true;
11940
+ }
11941
+ async function finishOrReflect(inputs, ctx, llmOutput) {
11942
+ if (shouldNudgeAndContinue(ctx, llmOutput)) return "continue";
11943
+ if (await reflectAfterStop(inputs, ctx)) return "continue";
11944
+ ctx.finalStatus = "finished";
11945
+ return "done";
11946
+ }
11898
11947
  async function runIteration(inputs, ctx) {
11899
11948
  const llmOutput = await streamLlmTurn(inputs, ctx);
11900
11949
  accumulateUsage(ctx.usage, llmOutput);
@@ -11928,9 +11977,7 @@ async function continueOrTerminate(inputs, ctx, llmOutput) {
11928
11977
  await emitAssistantTextStep(inputs, ctx, llmOutput.text);
11929
11978
  }
11930
11979
  if (llmOutput.stopReason !== "tool_use" || llmOutput.toolCalls.length === 0) {
11931
- if (shouldNudgeAndContinue(ctx, llmOutput)) return "continue";
11932
- ctx.finalStatus = "finished";
11933
- return "done";
11980
+ return finishOrReflect(inputs, ctx, llmOutput);
11934
11981
  }
11935
11982
  ctx.messages.push(buildAssistantTurn(llmOutput.text, llmOutput.toolCalls));
11936
11983
  const toolResults = await dispatchTools(inputs, ctx.tools, llmOutput.toolCalls, ctx.events);
@@ -18668,25 +18715,47 @@ async function migrateSqliteToLance2(options) {
18668
18715
 
18669
18716
  // src/permission-engine.ts
18670
18717
  var PermissionEngine = class {
18671
- constructor(rules) {
18718
+ constructor(rules, options = {}) {
18672
18719
  this.rules = rules;
18720
+ this.defaultAction = options.defaultAction ?? "allow";
18673
18721
  }
18674
18722
  rules;
18723
+ defaultAction;
18675
18724
  /**
18676
- * Evaluate a tool name against the rules. First match wins; default "allow".
18725
+ * Evaluate a tool name against the rules. First match wins; falls back to the
18726
+ * configured `defaultAction` (default `"allow"`) when no rule matches.
18677
18727
  */
18678
18728
  evaluate(toolName) {
18679
18729
  for (const rule of this.rules) {
18680
- if (typeof rule.tool === "string") {
18681
- if (rule.tool === toolName) return rule.action;
18682
- } else {
18683
- if (rule.tool.test(toolName)) return rule.action;
18684
- }
18730
+ const matches = typeof rule.tool === "string" ? rule.tool === toolName : rule.tool.test(toolName);
18731
+ if (matches) return rule.action;
18685
18732
  }
18686
- return "allow";
18733
+ return this.defaultAction;
18687
18734
  }
18688
18735
  };
18689
18736
 
18737
+ // src/permission-plugin.ts
18738
+ function createPermissionPlugin(engine, opts = {}) {
18739
+ return definePlugin({
18740
+ name: opts.name ?? "permission-engine",
18741
+ version: "1.0.0",
18742
+ kind: "general",
18743
+ register(ctx) {
18744
+ ctx.on("pre_tool_call", (rawCtx) => {
18745
+ const { name } = rawCtx;
18746
+ const action = engine.evaluate(name);
18747
+ if (action === "deny") {
18748
+ return { block: true, message: `denied by permission engine: ${name}` };
18749
+ }
18750
+ if (action === "ask") {
18751
+ return opts.onAsk ? opts.onAsk(name) : { block: true, message: `requires approval: ${name}` };
18752
+ }
18753
+ return void 0;
18754
+ });
18755
+ }
18756
+ });
18757
+ }
18758
+
18690
18759
  // src/security.ts
18691
18760
  init_security();
18692
18761
  var Security = class {
@@ -19476,6 +19545,7 @@ exports.computeCost = computeCost;
19476
19545
  exports.createAgentFactory = createAgentFactory;
19477
19546
  exports.createCounterBudgetTracker = createCounterBudgetTracker;
19478
19547
  exports.createNoopMemoryProvider = createNoopMemoryProvider;
19548
+ exports.createPermissionPlugin = createPermissionPlugin;
19479
19549
  exports.createSquad = createSquad;
19480
19550
  exports.definePlugin = definePlugin;
19481
19551
  exports.defineProvider = defineProvider;