@theokit/sdk 4.50.0 → 4.51.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 (91) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/{agent-JA4ILE5O.cjs → agent-B2WU3JP6.cjs} +10 -9
  3. package/dist/{agent-JA4ILE5O.cjs.map → agent-B2WU3JP6.cjs.map} +1 -1
  4. package/dist/{agent-GKX5FE5K.js → agent-DI2QQHSJ.js} +9 -8
  5. package/dist/{agent-GKX5FE5K.js.map → agent-DI2QQHSJ.js.map} +1 -1
  6. package/dist/{chunk-3NLOQEJR.js → chunk-34XOCZJO.js} +5 -16
  7. package/dist/chunk-34XOCZJO.js.map +1 -0
  8. package/dist/{chunk-64TJCXY5.cjs → chunk-3G6ZDZ6L.cjs} +5 -5
  9. package/dist/{chunk-64TJCXY5.cjs.map → chunk-3G6ZDZ6L.cjs.map} +1 -1
  10. package/dist/{chunk-JO76RWCA.cjs → chunk-72HEBGWN.cjs} +4 -4
  11. package/dist/{chunk-JO76RWCA.cjs.map → chunk-72HEBGWN.cjs.map} +1 -1
  12. package/dist/{chunk-XARLSCKA.js → chunk-ACHVCIDQ.js} +11 -11
  13. package/dist/chunk-ACHVCIDQ.js.map +1 -0
  14. package/dist/{chunk-RJBHWM6D.js → chunk-E54KDYOE.js} +3 -3
  15. package/dist/{chunk-RJBHWM6D.js.map → chunk-E54KDYOE.js.map} +1 -1
  16. package/dist/{chunk-2S6B5B2A.js → chunk-E7WDXT4X.js} +3 -3
  17. package/dist/{chunk-2S6B5B2A.js.map → chunk-E7WDXT4X.js.map} +1 -1
  18. package/dist/{chunk-TSK4VVBW.cjs → chunk-F7OBYH2X.cjs} +52 -52
  19. package/dist/chunk-F7OBYH2X.cjs.map +1 -0
  20. package/dist/{chunk-6FSQ3CHQ.js → chunk-JGYYNDAZ.js} +5 -6
  21. package/dist/chunk-JGYYNDAZ.js.map +1 -0
  22. package/dist/{chunk-UU7MAO2D.cjs → chunk-OKLYRPKL.cjs} +4 -16
  23. package/dist/chunk-OKLYRPKL.cjs.map +1 -0
  24. package/dist/{chunk-EON4YTR6.js → chunk-R2A3WIJY.js} +3 -3
  25. package/dist/{chunk-EON4YTR6.js.map → chunk-R2A3WIJY.js.map} +1 -1
  26. package/dist/chunk-RIAM53CP.js +22 -0
  27. package/dist/chunk-RIAM53CP.js.map +1 -0
  28. package/dist/{chunk-GH52NOCL.cjs → chunk-RWMNTFHZ.cjs} +9 -9
  29. package/dist/{chunk-GH52NOCL.cjs.map → chunk-RWMNTFHZ.cjs.map} +1 -1
  30. package/dist/{chunk-MZQHVN7C.js → chunk-SEZJGV7C.js} +3 -3
  31. package/dist/{chunk-MZQHVN7C.js.map → chunk-SEZJGV7C.js.map} +1 -1
  32. package/dist/{chunk-FAUKVJCC.cjs → chunk-UQHIEUDY.cjs} +3 -3
  33. package/dist/{chunk-FAUKVJCC.cjs.map → chunk-UQHIEUDY.cjs.map} +1 -1
  34. package/dist/{chunk-UJ7HK7BX.js → chunk-VK7SIDYI.js} +3 -3
  35. package/dist/{chunk-UJ7HK7BX.js.map → chunk-VK7SIDYI.js.map} +1 -1
  36. package/dist/chunk-VKJ7V7EB.cjs +25 -0
  37. package/dist/chunk-VKJ7V7EB.cjs.map +1 -0
  38. package/dist/{chunk-74VVGK7P.cjs → chunk-WUUSAMFC.cjs} +5 -5
  39. package/dist/{chunk-74VVGK7P.cjs.map → chunk-WUUSAMFC.cjs.map} +1 -1
  40. package/dist/{chunk-XA3TSBAH.cjs → chunk-XABN5HY6.cjs} +4 -5
  41. package/dist/chunk-XABN5HY6.cjs.map +1 -0
  42. package/dist/{compact-session-UUCBTBCZ.cjs → compact-session-FKYCJRAK.cjs} +4 -3
  43. package/dist/{compact-session-UUCBTBCZ.cjs.map → compact-session-FKYCJRAK.cjs.map} +1 -1
  44. package/dist/{compact-session-GF2CBKXB.js → compact-session-LF4YOT5S.js} +4 -3
  45. package/dist/{compact-session-GF2CBKXB.js.map → compact-session-LF4YOT5S.js.map} +1 -1
  46. package/dist/context/index.cjs +6 -5
  47. package/dist/context/index.cjs.map +1 -1
  48. package/dist/context/index.js +3 -2
  49. package/dist/context/index.js.map +1 -1
  50. package/dist/cron.cjs +9 -8
  51. package/dist/cron.js +8 -7
  52. package/dist/eval.cjs +8 -7
  53. package/dist/eval.cjs.map +1 -1
  54. package/dist/eval.js +7 -6
  55. package/dist/eval.js.map +1 -1
  56. package/dist/filesystem/index.cjs +6 -5
  57. package/dist/filesystem/index.cjs.map +1 -1
  58. package/dist/filesystem/index.js +2 -1
  59. package/dist/filesystem/index.js.map +1 -1
  60. package/dist/{index-manager-YFFEPISE.cjs → index-manager-34ELCOAP.cjs} +6 -5
  61. package/dist/{index-manager-YFFEPISE.cjs.map → index-manager-34ELCOAP.cjs.map} +1 -1
  62. package/dist/index-manager-OMJVYS2U.js +12 -0
  63. package/dist/{index-manager-X5IPG2JL.js.map → index-manager-OMJVYS2U.js.map} +1 -1
  64. package/dist/index.cjs +127 -35
  65. package/dist/index.cjs.map +1 -1
  66. package/dist/index.d.cts +239 -1
  67. package/dist/index.d.ts +239 -1
  68. package/dist/index.js +98 -13
  69. package/dist/index.js.map +1 -1
  70. package/dist/{inject-session-I3HK3AHB.cjs → inject-session-J7Y6XACY.cjs} +4 -4
  71. package/dist/{inject-session-I3HK3AHB.cjs.map → inject-session-J7Y6XACY.cjs.map} +1 -1
  72. package/dist/{inject-session-NR64GB3T.js → inject-session-MWRJENH4.js} +3 -3
  73. package/dist/{inject-session-NR64GB3T.js.map → inject-session-MWRJENH4.js.map} +1 -1
  74. package/dist/internal/memory/adapters/index.cjs +2 -1
  75. package/dist/internal/memory/adapters/index.js +2 -1
  76. package/dist/internal/security/index.cjs +9 -8
  77. package/dist/internal/security/index.js +2 -1
  78. package/dist/path-safety.cjs +9 -8
  79. package/dist/path-safety.js +2 -1
  80. package/dist/skills.cjs +5 -4
  81. package/dist/skills.js +3 -2
  82. package/dist/workflow.cjs +11 -10
  83. package/dist/workflow.js +3 -2
  84. package/package.json +1 -1
  85. package/dist/chunk-3NLOQEJR.js.map +0 -1
  86. package/dist/chunk-6FSQ3CHQ.js.map +0 -1
  87. package/dist/chunk-TSK4VVBW.cjs.map +0 -1
  88. package/dist/chunk-UU7MAO2D.cjs.map +0 -1
  89. package/dist/chunk-XA3TSBAH.cjs.map +0 -1
  90. package/dist/chunk-XARLSCKA.js.map +0 -1
  91. package/dist/index-manager-X5IPG2JL.js +0 -11
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/internal/runtime/skills/skill-frontmatter.ts","../src/internal/runtime/skills/discover-skills.ts","../src/internal/runtime/system-prompt/escape.ts","../src/internal/runtime/skills/skills-block.ts"],"names":[],"mappings":";;;;;;;AAMA,SAAS,SAAS,CAAA,EAAqD;AACrE,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,GAAI,MAAA;AACrC;AAGA,SAAS,eAAe,GAAA,EAAiE;AACvF,EAAA,MAAM,MAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG,GAAA,CAAI,CAAC,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA;AAC7D,EAAA,OAAO,GAAA;AACT;AA8BO,SAAS,qBAAA,CAAsB,KAAa,YAAA,EAAwC;AACzF,EAAA,MAAM,MAAA,GAAS,0BAAA,CAA2B,GAAA,EAAK,YAAY,CAAA;AAC3D,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,MAAA,EAAQ,YAAY,CAAA;AAC7C,EAAA,oBAAA,CAAqB,QAAQ,IAAI,CAAA;AACjC,EAAA,OAAO,gBAAA,CAAiB,QAAQ,IAAI,CAAA;AACtC;AAOO,SAAS,sBAAsB,GAAA,EAAqB;AACzD,EAAA,MAAM,KAAA,GAAQ,6BAAA,CAA8B,IAAA,CAAK,GAAG,CAAA;AACpD,EAAA,OAAA,CAAQ,KAAA,KAAU,IAAA,GAAO,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,MAAM,CAAC,CAAA,CAAE,MAAM,CAAA,EAAG,IAAA,EAAK;AAClE;AAEA,SAAS,0BAAA,CAA2B,KAAa,YAAA,EAAoC;AACnF,EAAA,MAAM,KAAA,GAAQ,+BAAA,CAAgC,IAAA,CAAK,GAAG,CAAA;AACtD,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,MAAA,EAAS,YAAY,CAAA,uBAAA,CAAA,EAA2B;AAAA,MAC3E,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAGhC,EAAA,IAAI;AACF,IAAA,OAAO,cAAA,CAAe,eAAA,CAAgB,WAAW,CAAC,CAAA;AAAA,EACpD,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACpE,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,CAAA,MAAA,EAAS,YAAY,CAAA,iCAAA,EAAoC,MAAM,CAAA,CAAA;AAAA,MAC/D,EAAE,IAAA,EAAM,gBAAA,EAAkB,KAAA;AAAM,KAClC;AAAA,EACF;AACF;AAEA,SAAS,WAAA,CAAY,QAAsB,YAAA,EAA8B;AACvE,EAAA,IAAI,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA,SAAU,MAAA,CAAO,IAAA;AAC3C,EAAA,IAAI,UAAA,CAAW,YAAY,CAAA,EAAG,OAAO,YAAA;AACrC,EAAA,MAAM,IAAI,mBAAmB,uDAAA,EAAyD;AAAA,IACpF,IAAA,EAAM;AAAA,GACP,CAAA;AACH;AAEA,SAAS,oBAAA,CAAqB,QAAsB,IAAA,EAAoB;AACtE,EAAA,IAAI,CAAC,UAAA,CAAW,MAAA,CAAO,WAAW,CAAA,EAAG;AACnC,IAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,MAAA,EAAS,IAAI,CAAA,uCAAA,CAAA,EAA2C;AAAA,MACnF,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACF;AAEA,SAAS,gBAAA,CAAiB,QAAsB,IAAA,EAAgC;AAC9E,EAAA,MAAM,cAAc,MAAA,CAAO,WAAA;AAC3B,EAAA,IAAI,gBAAgB,MAAA,EAAW;AAE7B,IAAA,MAAM,IAAI,mBAAmB,CAAA,MAAA,EAAS,IAAI,wBAAwB,EAAE,IAAA,EAAM,kBAAkB,CAAA;AAAA,EAC9F;AACA,EAAA,MAAM,MAAA,GAA2B,EAAE,IAAA,EAAM,WAAA,EAAY;AACrD,EAAA,IAAI,WAAW,MAAA,CAAO,QAAQ,CAAA,EAAG,MAAA,CAAO,WAAW,MAAA,CAAO,QAAA;AAC1D,EAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,MAAA,CAAO,YAAY,CAAA;AAClD,EAAA,IAAI,IAAA,KAAS,MAAA,EAAW,MAAA,CAAO,YAAA,GAAe,IAAA;AAC9C,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,kBAAkB,GAAA,EAA+C;AACxE,EAAA,IAAI,CAAC,UAAA,CAAW,GAAG,CAAA,EAAG,OAAO,MAAA;AAC7B,EAAA,MAAM,OAAQ,GAAA,CACX,KAAA,CAAM,GAAG,CAAA,CACT,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAC,CAAA;AAC7B,EAAA,OAAO,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAA,GAAO,MAAA;AAClC;AAEA,SAAS,WAAW,KAAA,EAA4C;AAC9D,EAAA,OAAO,KAAA,KAAU,MAAA,IAAa,KAAA,CAAM,IAAA,GAAO,MAAA,GAAS,CAAA;AACtD;;;AC7CA,eAAsB,cAAA,CACpB,KACA,OAAA,EACkB;AAClB,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,MAAM,gBAAA,CAAiB,GAAA,EAAK,mBAAA,EAAqB,kBAAkB,CAAA;AAAA,EAC/E,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,SAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,EAAY,EAAG;AAC1B,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,YAAA,CAAa,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AACvC,MAAA,qBAAA,CAAsB,UAAU,GAAG,CAAA;AAAA,IACrC,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AAC3C,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,MAAM,QAAA,CAAS,SAAA,EAAW,MAAM,CAAA;AAAA,IACxC,CAAA,CAAA,MAAQ;AAEN,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAQ,aAAA,CAAc,GAAA,EAAK,KAAA,CAAM,IAAA,EAAM,WAAW,OAAO,CAAA;AAC/D,IAAA,IAAI,KAAA,KAAU,MAAA,EAAW,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,EAC5C;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,aAAA,CACP,GAAA,EACA,YAAA,EACA,MAAA,EACA,OAAA,EACmB;AACnB,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,GAAc,qBAAA,CAAsB,GAAA,EAAK,YAAY,CAAA;AAC3D,IAAA,MAAM,KAAA,GAAe;AAAA,MACnB,MAAM,WAAA,CAAY,IAAA;AAAA,MAClB,aAAa,WAAA,CAAY,WAAA;AAAA,MACzB;AAAA,KACF;AACA,IAAA,IAAI,WAAA,CAAY,QAAA,KAAa,KAAA,CAAA,EAAW,KAAA,CAAM,WAAW,WAAA,CAAY,QAAA;AACrE,IAAA,IAAI,WAAA,CAAY,YAAA,KAAiB,KAAA,CAAA,EAAW,KAAA,CAAM,eAAe,WAAA,CAAY,YAAA;AAC7E,IAAA,OAAO,KAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,kBAAA,EAAoB;AACvC,MAAA,OAAA,EAAS,cAAA,GAAiB;AAAA,QACxB,IAAA,EAAM,YAAA;AAAA,QACN,MAAA;AAAA,QACA,IAAA,EAAM,MAAM,IAAA,IAAQ,SAAA;AAAA,QACpB,SAAS,KAAA,CAAM;AAAA,OAChB,CAAA;AACD,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;;;ACtIO,IAAM,eAAA,GAAkB,CAAC,CAAA,KAC9B,CAAA,CAAE,QAAQ,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,MAAM;;;ACO9D,SAAS,iBACd,MAAA,EACoB;AACpB,EAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAChC,EAAA,MAAM,QAAQ,MAAA,CAAO,GAAA;AAAA,IACnB,CAAC,KAAA,KAAU,CAAA,IAAA,EAAO,eAAA,CAAgB,KAAA,CAAM,IAAI,CAAC,CAAA,EAAA,EAAK,eAAA,CAAgB,KAAA,CAAM,WAAW,CAAC,CAAA;AAAA,GACtF;AACA,EAAA,OAAO,CAAA;AAAA,EAAa,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA,SAAA,CAAA;AACtC","file":"chunk-2S6B5B2A.js","sourcesContent":["import { ConfigurationError } from \"../../../errors.js\";\nimport { type FrontmatterValue, parseSimpleYaml } from \"../context/yaml-frontmatter.js\";\n\ntype StringFields = Record<string, string | undefined>;\n\n/** Narrow a FrontmatterValue to string; non-strings + undefined → undefined. */\nfunction asString(v: FrontmatterValue | undefined): string | undefined {\n return typeof v === \"string\" ? v : undefined;\n}\n\n/** Coerce parser output to legacy string-only shape (skill schema is all-string). */\nfunction toStringFields(raw: Record<string, FrontmatterValue | undefined>): StringFields {\n const out: StringFields = {};\n for (const [k, v] of Object.entries(raw)) out[k] = asString(v);\n return out;\n}\n\n/**\n * Strict skill frontmatter schema (ADR D10).\n *\n * Required: `name`, `description`.\n * Optional: `category`, `dependencies` (comma-separated string in the\n * simple-YAML dialect — parsed to `string[]`).\n *\n * Unknown fields are ignored (forward-compat). Malformed YAML or missing\n * required fields surface as `ConfigurationError` with one of the typed\n * codes below.\n *\n * @internal\n */\nexport interface SkillFrontmatter {\n name: string;\n description: string;\n category?: string;\n dependencies?: string[];\n}\n\n/**\n * Parse a SKILL.md file body into validated frontmatter.\n *\n * @throws ConfigurationError(code: \"missing_frontmatter\") — no `---` block at file head.\n * @throws ConfigurationError(code: \"schema_invalid\") — YAML malformed OR required field missing.\n *\n * @internal\n */\nexport function parseSkillFrontmatter(raw: string, fallbackName: string): SkillFrontmatter {\n const fields = extractAndParseFrontmatter(raw, fallbackName);\n const name = resolveName(fields, fallbackName);\n ensureRequiredFields(fields, name);\n return buildFrontmatter(fields, name);\n}\n\n/**\n * SE20 — return a SKILL.md's BODY (everything after the frontmatter block), trimmed.\n * When there is no frontmatter block, the whole file is the body. Reuses the same\n * frontmatter regex as {@link parseSkillFrontmatter} (DRY).\n */\nexport function stripSkillFrontmatter(raw: string): string {\n const match = /^---\\s*\\n[\\s\\S]*?\\n---\\s*\\n/.exec(raw);\n return (match === null ? raw : raw.slice(match[0].length)).trim();\n}\n\nfunction extractAndParseFrontmatter(raw: string, fallbackName: string): StringFields {\n const match = /^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n/.exec(raw);\n if (match === null) {\n throw new ConfigurationError(`Skill ${fallbackName} is missing frontmatter`, {\n code: \"missing_frontmatter\",\n });\n }\n const frontmatter = match[1] ?? \"\";\n // EC-5: guard against syntactically invalid frontmatter so the loader\n // surfaces schema_invalid rather than crashing.\n try {\n return toStringFields(parseSimpleYaml(frontmatter));\n } catch (cause) {\n const detail = cause instanceof Error ? cause.message : String(cause);\n throw new ConfigurationError(\n `Skill ${fallbackName} has malformed YAML frontmatter: ${detail}`,\n { code: \"schema_invalid\", cause },\n );\n }\n}\n\nfunction resolveName(fields: StringFields, fallbackName: string): string {\n if (hasContent(fields.name)) return fields.name;\n if (hasContent(fallbackName)) return fallbackName;\n throw new ConfigurationError(\"Skill at unknown path is missing required field: name\", {\n code: \"schema_invalid\",\n });\n}\n\nfunction ensureRequiredFields(fields: StringFields, name: string): void {\n if (!hasContent(fields.description)) {\n throw new ConfigurationError(`Skill ${name} is missing required field: description`, {\n code: \"schema_invalid\",\n });\n }\n}\n\nfunction buildFrontmatter(fields: StringFields, name: string): SkillFrontmatter {\n const description = fields.description;\n if (description === undefined) {\n // ensureRequiredFields already threw; this is unreachable but satisfies TS\n throw new ConfigurationError(`Skill ${name} missing description`, { code: \"schema_invalid\" });\n }\n const result: SkillFrontmatter = { name, description };\n if (hasContent(fields.category)) result.category = fields.category;\n const deps = parseDependencies(fields.dependencies);\n if (deps !== undefined) result.dependencies = deps;\n return result;\n}\n\nfunction parseDependencies(raw: string | undefined): string[] | undefined {\n if (!hasContent(raw)) return undefined;\n const deps = (raw as string)\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n return deps.length > 0 ? deps : undefined;\n}\n\nfunction hasContent(value: string | undefined): value is string {\n return value !== undefined && value.trim().length > 0;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { ConfigurationError } from \"../../../errors.js\";\nimport { assertNoSymlinkEscape, safePathJoin } from \"../../security/path-guard.js\";\nimport { readWorkspaceDir } from \"../config/workspace-dir.js\";\nimport { parseSkillFrontmatter } from \"./skill-frontmatter.js\";\n\n/**\n * A discovered skill's metadata. The skill BODY is never included — only the\n * strict frontmatter fields plus the resolved `source` path.\n *\n * Public via `@theokit/sdk/skills`.\n *\n * @public\n */\nexport interface Skill {\n name: string;\n description: string;\n /** Absolute path to the discovered `SKILL.md`. */\n source: string;\n category?: string;\n dependencies?: string[];\n}\n\n/**\n * Information passed to `onInvalidSkill` when a `SKILL.md` is present but its\n * frontmatter is malformed (missing required field or invalid YAML).\n *\n * @public\n */\nexport interface InvalidSkillInfo {\n /** The skill directory name (used as the fallback skill name). */\n name: string;\n /** Absolute path to the offending `SKILL.md`. */\n source: string;\n /** Typed reason: `missing_frontmatter` or `schema_invalid`. */\n code: string;\n message: string;\n}\n\n/**\n * Options for {@link discoverSkills}.\n *\n * @public\n */\nexport interface DiscoverSkillsOptions {\n /**\n * Called once per directory that contains a `SKILL.md` with malformed\n * frontmatter. The skill is excluded from the result; discovery continues\n * (strict-frontmatter ADR / EC-5). A directory WITHOUT a `SKILL.md` is NOT a\n * malformed skill and does not trigger this callback.\n *\n * Default: no-op (a library primitive must not write to the consumer's\n * stderr by default).\n */\n onInvalidSkill?: (info: InvalidSkillInfo) => void;\n}\n\n/**\n * Discover `SKILL.md` skills under an arbitrary directory.\n *\n * For each immediate subdirectory `<dir>/<name>/` containing a `SKILL.md`, the\n * file's strict YAML frontmatter is parsed (`name`/`description` required;\n * `category`/`dependencies` optional). Malformed skills are skipped (optionally\n * reported via {@link DiscoverSkillsOptions.onInvalidSkill}); a subdirectory\n * whose realpath escapes `dir` (via symlink) is skipped (symlink-escape guard,\n * reusing `@theokit/sdk/path-safety`).\n *\n * NEVER throws: a missing, unreadable, or non-directory `dir` yields `[]`.\n *\n * Discovery order follows the filesystem `readdir` order (OS-dependent). Sort\n * the result before {@link buildSkillsBlock} if a stable block order matters.\n *\n * Public via `@theokit/sdk/skills`.\n *\n * @public\n */\nexport async function discoverSkills(\n dir: string,\n options?: DiscoverSkillsOptions,\n): Promise<Skill[]> {\n let entries: Awaited<ReturnType<typeof readWorkspaceDir>>;\n try {\n entries = await readWorkspaceDir(dir, \"skills_read_error\", \"skills directory\");\n } catch {\n // never-throw contract: unreadable / not-a-directory → no skills (EC-1)\n return [];\n }\n\n const skills: Skill[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n let skillDir: string;\n try {\n skillDir = safePathJoin(dir, entry.name);\n assertNoSymlinkEscape(skillDir, dir);\n } catch {\n continue;\n }\n const skillPath = join(skillDir, \"SKILL.md\");\n let raw: string;\n try {\n raw = await readFile(skillPath, \"utf8\");\n } catch {\n // no SKILL.md in this subdir → not a skill, not an error (EC-2)\n continue;\n }\n const skill = tryParseSkill(raw, entry.name, skillPath, options);\n if (skill !== undefined) skills.push(skill);\n }\n return skills;\n}\n\nfunction tryParseSkill(\n raw: string,\n fallbackName: string,\n source: string,\n options: DiscoverSkillsOptions | undefined,\n): Skill | undefined {\n try {\n const frontmatter = parseSkillFrontmatter(raw, fallbackName);\n const skill: Skill = {\n name: frontmatter.name,\n description: frontmatter.description,\n source,\n };\n if (frontmatter.category !== undefined) skill.category = frontmatter.category;\n if (frontmatter.dependencies !== undefined) skill.dependencies = frontmatter.dependencies;\n return skill;\n } catch (cause) {\n if (cause instanceof ConfigurationError) {\n options?.onInvalidSkill?.({\n name: fallbackName,\n source,\n code: cause.code ?? \"unknown\",\n message: cause.message,\n });\n return undefined;\n }\n throw cause;\n }\n}\n","/**\n * Block-body XML escape (ADR D9 — prompt-injection defence).\n *\n * Order matters: `&` MUST be escaped first so subsequent `<`/`>` replacements\n * do not double-encode the `&` characters they introduce.\n *\n * @internal\n */\nexport const escapeBlockBody = (s: string): string =>\n s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n","import { escapeBlockBody } from \"../system-prompt/escape.js\";\n\n/**\n * Render the `<skills>` system-prompt block from a skill list.\n *\n * Input is the structural subset `{ name, description }` — the skill BODY is\n * NOT in the type, so it cannot leak into the prompt. Both fields are passed\n * through `escapeBlockBody` to neutralise prompt-injection vectors hidden in\n * user-controlled SKILL.md frontmatter (injection-escape ADR).\n *\n * Returns `undefined` for an empty list so the caller can omit the block.\n *\n * Public via `@theokit/sdk/skills`.\n *\n * @public\n */\nexport function buildSkillsBlock(\n skills: ReadonlyArray<{ name: string; description: string }>,\n): string | undefined {\n if (skills.length === 0) return undefined;\n const lines = skills.map(\n (skill) => ` - ${escapeBlockBody(skill.name)}: ${escapeBlockBody(skill.description)}`,\n );\n return `<skills>\\n${lines.join(\"\\n\")}\\n</skills>`;\n}\n"]}
1
+ {"version":3,"sources":["../src/internal/runtime/skills/skill-frontmatter.ts","../src/internal/runtime/skills/discover-skills.ts","../src/internal/runtime/system-prompt/escape.ts","../src/internal/runtime/skills/skills-block.ts"],"names":[],"mappings":"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","file":"chunk-E7WDXT4X.js","sourcesContent":["import { ConfigurationError } from \"../../../errors.js\";\nimport { type FrontmatterValue, parseSimpleYaml } from \"../context/yaml-frontmatter.js\";\n\ntype StringFields = Record<string, string | undefined>;\n\n/** Narrow a FrontmatterValue to string; non-strings + undefined → undefined. */\nfunction asString(v: FrontmatterValue | undefined): string | undefined {\n return typeof v === \"string\" ? v : undefined;\n}\n\n/** Coerce parser output to legacy string-only shape (skill schema is all-string). */\nfunction toStringFields(raw: Record<string, FrontmatterValue | undefined>): StringFields {\n const out: StringFields = {};\n for (const [k, v] of Object.entries(raw)) out[k] = asString(v);\n return out;\n}\n\n/**\n * Strict skill frontmatter schema (ADR D10).\n *\n * Required: `name`, `description`.\n * Optional: `category`, `dependencies` (comma-separated string in the\n * simple-YAML dialect — parsed to `string[]`).\n *\n * Unknown fields are ignored (forward-compat). Malformed YAML or missing\n * required fields surface as `ConfigurationError` with one of the typed\n * codes below.\n *\n * @internal\n */\nexport interface SkillFrontmatter {\n name: string;\n description: string;\n category?: string;\n dependencies?: string[];\n}\n\n/**\n * Parse a SKILL.md file body into validated frontmatter.\n *\n * @throws ConfigurationError(code: \"missing_frontmatter\") — no `---` block at file head.\n * @throws ConfigurationError(code: \"schema_invalid\") — YAML malformed OR required field missing.\n *\n * @internal\n */\nexport function parseSkillFrontmatter(raw: string, fallbackName: string): SkillFrontmatter {\n const fields = extractAndParseFrontmatter(raw, fallbackName);\n const name = resolveName(fields, fallbackName);\n ensureRequiredFields(fields, name);\n return buildFrontmatter(fields, name);\n}\n\n/**\n * SE20 — return a SKILL.md's BODY (everything after the frontmatter block), trimmed.\n * When there is no frontmatter block, the whole file is the body. Reuses the same\n * frontmatter regex as {@link parseSkillFrontmatter} (DRY).\n */\nexport function stripSkillFrontmatter(raw: string): string {\n const match = /^---\\s*\\n[\\s\\S]*?\\n---\\s*\\n/.exec(raw);\n return (match === null ? raw : raw.slice(match[0].length)).trim();\n}\n\nfunction extractAndParseFrontmatter(raw: string, fallbackName: string): StringFields {\n const match = /^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n/.exec(raw);\n if (match === null) {\n throw new ConfigurationError(`Skill ${fallbackName} is missing frontmatter`, {\n code: \"missing_frontmatter\",\n });\n }\n const frontmatter = match[1] ?? \"\";\n // EC-5: guard against syntactically invalid frontmatter so the loader\n // surfaces schema_invalid rather than crashing.\n try {\n return toStringFields(parseSimpleYaml(frontmatter));\n } catch (cause) {\n const detail = cause instanceof Error ? cause.message : String(cause);\n throw new ConfigurationError(\n `Skill ${fallbackName} has malformed YAML frontmatter: ${detail}`,\n { code: \"schema_invalid\", cause },\n );\n }\n}\n\nfunction resolveName(fields: StringFields, fallbackName: string): string {\n if (hasContent(fields.name)) return fields.name;\n if (hasContent(fallbackName)) return fallbackName;\n throw new ConfigurationError(\"Skill at unknown path is missing required field: name\", {\n code: \"schema_invalid\",\n });\n}\n\nfunction ensureRequiredFields(fields: StringFields, name: string): void {\n if (!hasContent(fields.description)) {\n throw new ConfigurationError(`Skill ${name} is missing required field: description`, {\n code: \"schema_invalid\",\n });\n }\n}\n\nfunction buildFrontmatter(fields: StringFields, name: string): SkillFrontmatter {\n const description = fields.description;\n if (description === undefined) {\n // ensureRequiredFields already threw; this is unreachable but satisfies TS\n throw new ConfigurationError(`Skill ${name} missing description`, { code: \"schema_invalid\" });\n }\n const result: SkillFrontmatter = { name, description };\n if (hasContent(fields.category)) result.category = fields.category;\n const deps = parseDependencies(fields.dependencies);\n if (deps !== undefined) result.dependencies = deps;\n return result;\n}\n\nfunction parseDependencies(raw: string | undefined): string[] | undefined {\n if (!hasContent(raw)) return undefined;\n const deps = (raw as string)\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n return deps.length > 0 ? deps : undefined;\n}\n\nfunction hasContent(value: string | undefined): value is string {\n return value !== undefined && value.trim().length > 0;\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nimport { ConfigurationError } from \"../../../errors.js\";\nimport { assertNoSymlinkEscape, safePathJoin } from \"../../security/path-guard.js\";\nimport { readWorkspaceDir } from \"../config/workspace-dir.js\";\nimport { parseSkillFrontmatter } from \"./skill-frontmatter.js\";\n\n/**\n * A discovered skill's metadata. The skill BODY is never included — only the\n * strict frontmatter fields plus the resolved `source` path.\n *\n * Public via `@theokit/sdk/skills`.\n *\n * @public\n */\nexport interface Skill {\n name: string;\n description: string;\n /** Absolute path to the discovered `SKILL.md`. */\n source: string;\n category?: string;\n dependencies?: string[];\n}\n\n/**\n * Information passed to `onInvalidSkill` when a `SKILL.md` is present but its\n * frontmatter is malformed (missing required field or invalid YAML).\n *\n * @public\n */\nexport interface InvalidSkillInfo {\n /** The skill directory name (used as the fallback skill name). */\n name: string;\n /** Absolute path to the offending `SKILL.md`. */\n source: string;\n /** Typed reason: `missing_frontmatter` or `schema_invalid`. */\n code: string;\n message: string;\n}\n\n/**\n * Options for {@link discoverSkills}.\n *\n * @public\n */\nexport interface DiscoverSkillsOptions {\n /**\n * Called once per directory that contains a `SKILL.md` with malformed\n * frontmatter. The skill is excluded from the result; discovery continues\n * (strict-frontmatter ADR / EC-5). A directory WITHOUT a `SKILL.md` is NOT a\n * malformed skill and does not trigger this callback.\n *\n * Default: no-op (a library primitive must not write to the consumer's\n * stderr by default).\n */\n onInvalidSkill?: (info: InvalidSkillInfo) => void;\n}\n\n/**\n * Discover `SKILL.md` skills under an arbitrary directory.\n *\n * For each immediate subdirectory `<dir>/<name>/` containing a `SKILL.md`, the\n * file's strict YAML frontmatter is parsed (`name`/`description` required;\n * `category`/`dependencies` optional). Malformed skills are skipped (optionally\n * reported via {@link DiscoverSkillsOptions.onInvalidSkill}); a subdirectory\n * whose realpath escapes `dir` (via symlink) is skipped (symlink-escape guard,\n * reusing `@theokit/sdk/path-safety`).\n *\n * NEVER throws: a missing, unreadable, or non-directory `dir` yields `[]`.\n *\n * Discovery order follows the filesystem `readdir` order (OS-dependent). Sort\n * the result before {@link buildSkillsBlock} if a stable block order matters.\n *\n * Public via `@theokit/sdk/skills`.\n *\n * @public\n */\nexport async function discoverSkills(\n dir: string,\n options?: DiscoverSkillsOptions,\n): Promise<Skill[]> {\n let entries: Awaited<ReturnType<typeof readWorkspaceDir>>;\n try {\n entries = await readWorkspaceDir(dir, \"skills_read_error\", \"skills directory\");\n } catch {\n // never-throw contract: unreadable / not-a-directory → no skills (EC-1)\n return [];\n }\n\n const skills: Skill[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n let skillDir: string;\n try {\n skillDir = safePathJoin(dir, entry.name);\n assertNoSymlinkEscape(skillDir, dir);\n } catch {\n continue;\n }\n const skillPath = join(skillDir, \"SKILL.md\");\n let raw: string;\n try {\n raw = await readFile(skillPath, \"utf8\");\n } catch {\n // no SKILL.md in this subdir → not a skill, not an error (EC-2)\n continue;\n }\n const skill = tryParseSkill(raw, entry.name, skillPath, options);\n if (skill !== undefined) skills.push(skill);\n }\n return skills;\n}\n\nfunction tryParseSkill(\n raw: string,\n fallbackName: string,\n source: string,\n options: DiscoverSkillsOptions | undefined,\n): Skill | undefined {\n try {\n const frontmatter = parseSkillFrontmatter(raw, fallbackName);\n const skill: Skill = {\n name: frontmatter.name,\n description: frontmatter.description,\n source,\n };\n if (frontmatter.category !== undefined) skill.category = frontmatter.category;\n if (frontmatter.dependencies !== undefined) skill.dependencies = frontmatter.dependencies;\n return skill;\n } catch (cause) {\n if (cause instanceof ConfigurationError) {\n options?.onInvalidSkill?.({\n name: fallbackName,\n source,\n code: cause.code ?? \"unknown\",\n message: cause.message,\n });\n return undefined;\n }\n throw cause;\n }\n}\n","/**\n * Block-body XML escape (ADR D9 — prompt-injection defence).\n *\n * Order matters: `&` MUST be escaped first so subsequent `<`/`>` replacements\n * do not double-encode the `&` characters they introduce.\n *\n * @internal\n */\nexport const escapeBlockBody = (s: string): string =>\n s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n","import { escapeBlockBody } from \"../system-prompt/escape.js\";\n\n/**\n * Render the `<skills>` system-prompt block from a skill list.\n *\n * Input is the structural subset `{ name, description }` — the skill BODY is\n * NOT in the type, so it cannot leak into the prompt. Both fields are passed\n * through `escapeBlockBody` to neutralise prompt-injection vectors hidden in\n * user-controlled SKILL.md frontmatter (injection-escape ADR).\n *\n * Returns `undefined` for an empty list so the caller can omit the block.\n *\n * Public via `@theokit/sdk/skills`.\n *\n * @public\n */\nexport function buildSkillsBlock(\n skills: ReadonlyArray<{ name: string; description: string }>,\n): string | undefined {\n if (skills.length === 0) return undefined;\n const lines = skills.map(\n (skill) => ` - ${escapeBlockBody(skill.name)}: ${escapeBlockBody(skill.description)}`,\n );\n return `<skills>\\n${lines.join(\"\\n\")}\\n</skills>`;\n}\n"]}
@@ -1,14 +1,14 @@
1
1
  'use strict';
2
2
 
3
- var chunkFAUKVJCC_cjs = require('./chunk-FAUKVJCC.cjs');
3
+ var chunkUQHIEUDY_cjs = require('./chunk-UQHIEUDY.cjs');
4
4
  var chunkBV2MWEMV_cjs = require('./chunk-BV2MWEMV.cjs');
5
5
  var chunkKCQUYQ3V_cjs = require('./chunk-KCQUYQ3V.cjs');
6
6
  var chunkNRA36JKG_cjs = require('./chunk-NRA36JKG.cjs');
7
7
  var chunkQFFNMJAS_cjs = require('./chunk-QFFNMJAS.cjs');
8
- var chunkGH52NOCL_cjs = require('./chunk-GH52NOCL.cjs');
8
+ var chunkRWMNTFHZ_cjs = require('./chunk-RWMNTFHZ.cjs');
9
9
  var chunkHECR7KF5_cjs = require('./chunk-HECR7KF5.cjs');
10
10
  var chunkBBZYXVLZ_cjs = require('./chunk-BBZYXVLZ.cjs');
11
- var chunkUU7MAO2D_cjs = require('./chunk-UU7MAO2D.cjs');
11
+ var chunkOKLYRPKL_cjs = require('./chunk-OKLYRPKL.cjs');
12
12
  var chunk6X2HUT4A_cjs = require('./chunk-6X2HUT4A.cjs');
13
13
  var chunk7PESI6YD_cjs = require('./chunk-7PESI6YD.cjs');
14
14
  var chunk6JSIEDKL_cjs = require('./chunk-6JSIEDKL.cjs');
@@ -25,8 +25,9 @@ var chunkX2YQP452_cjs = require('./chunk-X2YQP452.cjs');
25
25
  var chunkNNNUQELM_cjs = require('./chunk-NNNUQELM.cjs');
26
26
  var chunkVYHJZVL5_cjs = require('./chunk-VYHJZVL5.cjs');
27
27
  var chunkGLEKLAUW_cjs = require('./chunk-GLEKLAUW.cjs');
28
- var chunk64TJCXY5_cjs = require('./chunk-64TJCXY5.cjs');
29
- var chunkXA3TSBAH_cjs = require('./chunk-XA3TSBAH.cjs');
28
+ var chunk3G6ZDZ6L_cjs = require('./chunk-3G6ZDZ6L.cjs');
29
+ var chunkXABN5HY6_cjs = require('./chunk-XABN5HY6.cjs');
30
+ var chunkVKJ7V7EB_cjs = require('./chunk-VKJ7V7EB.cjs');
30
31
  var chunkBRHRQOJA_cjs = require('./chunk-BRHRQOJA.cjs');
31
32
  var chunkYULF6FPB_cjs = require('./chunk-YULF6FPB.cjs');
32
33
  var chunkZHPET3LZ_cjs = require('./chunk-ZHPET3LZ.cjs');
@@ -893,7 +894,7 @@ async function readLegacyFacts(jsonPath) {
893
894
  }
894
895
  async function writeMigratedFacts(cwd, jsonPath, facts) {
895
896
  try {
896
- for (const fact of facts) await chunkGH52NOCL_cjs.appendFactToMarkdown(cwd, fact);
897
+ for (const fact of facts) await chunkRWMNTFHZ_cjs.appendFactToMarkdown(cwd, fact);
897
898
  await promises.unlink(jsonPath).catch(() => void 0);
898
899
  chunkZHPET3LZ_cjs.diag(`[theokit-sdk] migrated ${facts.length} fact(s) from ${jsonPath} to MEMORY.md
899
900
  `);
@@ -910,11 +911,11 @@ async function migrateLegacyJson(cwd, config) {
910
911
  const key = `${cwd}::${config.namespace ?? "default"}::${config.scope ?? "agent"}::${config.userId ?? "default"}`;
911
912
  if (migrationRun.has(key)) return { migrated: false, factCount: 0, reason: "already-migrated" };
912
913
  migrationRun.add(key);
913
- const jsonPath = chunkGH52NOCL_cjs.legacyMemoryJsonPath(cwd, config);
914
+ const jsonPath = chunkRWMNTFHZ_cjs.legacyMemoryJsonPath(cwd, config);
914
915
  if (!await fileExists(jsonPath)) {
915
916
  return { migrated: false, factCount: 0, reason: "no-legacy-json" };
916
917
  }
917
- if (await fileExists(chunkGH52NOCL_cjs.memoryMdPath(cwd))) {
918
+ if (await fileExists(chunkRWMNTFHZ_cjs.memoryMdPath(cwd))) {
918
919
  chunkZHPET3LZ_cjs.diag(
919
920
  `[theokit-sdk] memory migration skipped: both MEMORY.md and legacy JSON exist at ${jsonPath}; leaving both intact
920
921
  `
@@ -939,13 +940,13 @@ function extractMemoryFact(message) {
939
940
  async function readMemoryFacts(cwd, config) {
940
941
  if (!config.enabled) return [];
941
942
  await migrateLegacyJson(cwd, config);
942
- return chunkGH52NOCL_cjs.readFacts(cwd, config);
943
+ return chunkRWMNTFHZ_cjs.readFacts(cwd, config);
943
944
  }
944
945
  async function appendMemoryFact(cwd, config, fact) {
945
946
  if (!config.enabled) return;
946
947
  await migrateLegacyJson(cwd, config);
947
948
  const sanitized = { text: chunkZHPET3LZ_cjs.redactSecrets(fact.text) };
948
- await chunkGH52NOCL_cjs.appendFact(cwd, config, sanitized);
949
+ await chunkRWMNTFHZ_cjs.appendFact(cwd, config, sanitized);
949
950
  }
950
951
 
951
952
  // src/internal/runtime/fixtures/fixture-scripts.ts
@@ -1918,9 +1919,9 @@ var CloudAgent = class {
1918
1919
  }
1919
1920
  downloadArtifact(path) {
1920
1921
  try {
1921
- chunkXA3TSBAH_cjs.validateArtifactPath(path);
1922
+ chunkXABN5HY6_cjs.validateArtifactPath(path);
1922
1923
  } catch (cause) {
1923
- if (cause instanceof chunkXA3TSBAH_cjs.PathTraversalError) {
1924
+ if (cause instanceof chunkXABN5HY6_cjs.PathTraversalError) {
1924
1925
  return Promise.reject(
1925
1926
  new chunkYULF6FPB_cjs.ConfigurationError(`Artifact path must stay inside the workspace: ${path}`, {
1926
1927
  code: "artifact_path_traversal",
@@ -2679,7 +2680,7 @@ async function runPostRunLifecycle(inputs) {
2679
2680
  try {
2680
2681
  const partial = await safeConversation(run);
2681
2682
  if (partial !== void 0) {
2682
- chunkFAUKVJCC_cjs.persistTurnToTranscript(sessionStore, { cwd: workspaceCwd, agentId, model }, agentId, {
2683
+ chunkUQHIEUDY_cjs.persistTurnToTranscript(sessionStore, { cwd: workspaceCwd, agentId, model }, agentId, {
2683
2684
  userText,
2684
2685
  conversation: partial
2685
2686
  });
@@ -2689,11 +2690,11 @@ async function runPostRunLifecycle(inputs) {
2689
2690
  chunkZHPET3LZ_cjs.diag(`[theokit-sdk] partial transcript write failed (${agentId}): ${msg}
2690
2691
  `);
2691
2692
  }
2692
- await chunkFAUKVJCC_cjs.flushSessionWrites();
2693
+ await chunkUQHIEUDY_cjs.flushSessionWrites();
2693
2694
  return;
2694
2695
  }
2695
2696
  if (result.result !== void 0) {
2696
- chunkFAUKVJCC_cjs.appendSessionMessage(agentId, { role: "assistant", text: result.result });
2697
+ chunkUQHIEUDY_cjs.appendSessionMessage(agentId, { role: "assistant", text: result.result });
2697
2698
  }
2698
2699
  const conversation = await safeConversation(run);
2699
2700
  const resolvedWindow = resolveWindowForRun(model, contextWindow);
@@ -2704,7 +2705,7 @@ async function runPostRunLifecycle(inputs) {
2704
2705
  }
2705
2706
  const lastRequestUsage = result.usage?.requests?.at(-1)?.totalTokens;
2706
2707
  const usageForTrigger = lastRequestUsage ?? result.usage?.totalTokens;
2707
- chunkFAUKVJCC_cjs.persistTurnToTranscript(
2708
+ chunkUQHIEUDY_cjs.persistTurnToTranscript(
2708
2709
  sessionStore,
2709
2710
  { cwd: workspaceCwd, agentId, model },
2710
2711
  agentId,
@@ -2738,7 +2739,7 @@ async function runPostRunLifecycle(inputs) {
2738
2739
  if (memoryProvider?.recordSessionSummary !== void 0) {
2739
2740
  await memoryProvider.recordSessionSummary(summaryArgs);
2740
2741
  } else {
2741
- await chunkGH52NOCL_cjs.writeSessionSummary(summaryArgs);
2742
+ await chunkRWMNTFHZ_cjs.writeSessionSummary(summaryArgs);
2742
2743
  }
2743
2744
  if (!shouldUsePortMemoryPath()) {
2744
2745
  void memoryGlue.syncIfReady();
@@ -2758,7 +2759,7 @@ async function runPostRunLifecycle(inputs) {
2758
2759
  agentId,
2759
2760
  runId: result.id
2760
2761
  });
2761
- await chunkFAUKVJCC_cjs.flushSessionWrites();
2762
+ await chunkUQHIEUDY_cjs.flushSessionWrites();
2762
2763
  }
2763
2764
  async function safeConversation(run) {
2764
2765
  try {
@@ -2866,7 +2867,7 @@ var SkillsManager = class {
2866
2867
  }
2867
2868
  async refresh() {
2868
2869
  const skillsRoot = this.skillsDir ?? path.join(this.cwd, ".theokit", "skills");
2869
- const discovered = await chunk64TJCXY5_cjs.discoverSkills(skillsRoot, {
2870
+ const discovered = await chunk3G6ZDZ6L_cjs.discoverSkills(skillsRoot, {
2870
2871
  onInvalidSkill: (info) => {
2871
2872
  chunkZHPET3LZ_cjs.diag(`[theokit-sdk] skill ${info.name} skipped (${info.code}): ${info.message}
2872
2873
  `);
@@ -2892,7 +2893,7 @@ var SkillsManager = class {
2892
2893
  async get(name) {
2893
2894
  const skill = this.skills.find((s) => s.name === name);
2894
2895
  if (skill === void 0) return void 0;
2895
- const instructions = typeof skill.instructions === "string" ? skill.instructions : chunk64TJCXY5_cjs.stripSkillFrontmatter(await promises.readFile(skill.source, "utf8"));
2896
+ const instructions = typeof skill.instructions === "string" ? skill.instructions : chunk3G6ZDZ6L_cjs.stripSkillFrontmatter(await promises.readFile(skill.source, "utf8"));
2896
2897
  const references = skill.references;
2897
2898
  return {
2898
2899
  name: skill.name,
@@ -2992,7 +2993,7 @@ var ActiveMemoryPromptProvider = class {
2992
2993
  if (ctx.activeMemorySummary === void 0 || ctx.activeMemorySummary.length === 0) {
2993
2994
  return Promise.resolve(void 0);
2994
2995
  }
2995
- const body = chunk64TJCXY5_cjs.escapeBlockBody(ctx.activeMemorySummary);
2996
+ const body = chunk3G6ZDZ6L_cjs.escapeBlockBody(ctx.activeMemorySummary);
2996
2997
  return Promise.resolve(`<active-memory>
2997
2998
  ${body}
2998
2999
  </active-memory>`);
@@ -3045,7 +3046,7 @@ function formatSource(name, tokens) {
3045
3046
  if (tokens.length === 0) {
3046
3047
  return ` <source name="${escapeAttribute(name)}" />`;
3047
3048
  }
3048
- const body = chunk64TJCXY5_cjs.escapeBlockBody(tokens.join(" "));
3049
+ const body = chunk3G6ZDZ6L_cjs.escapeBlockBody(tokens.join(" "));
3049
3050
  return ` <source name="${escapeAttribute(name)}">
3050
3051
  ${body}
3051
3052
  </source>`;
@@ -3061,7 +3062,7 @@ var MemoryPromptProvider = class {
3061
3062
  contribute(ctx) {
3062
3063
  if (ctx.memoryAutoInject === false) return Promise.resolve(void 0);
3063
3064
  if (ctx.memory.length === 0) return Promise.resolve(void 0);
3064
- const lines = ctx.memory.map((fact) => ` - ${chunk64TJCXY5_cjs.escapeBlockBody(fact.text)}`);
3065
+ const lines = ctx.memory.map((fact) => ` - ${chunk3G6ZDZ6L_cjs.escapeBlockBody(fact.text)}`);
3065
3066
  return Promise.resolve(`<memory>
3066
3067
  ${lines.join("\n")}
3067
3068
  </memory>`);
@@ -3083,7 +3084,7 @@ var SkillsPromptProvider = class {
3083
3084
  priority = 20;
3084
3085
  contribute(ctx) {
3085
3086
  if (ctx.skillsAutoInject === false) return Promise.resolve(void 0);
3086
- return Promise.resolve(chunk64TJCXY5_cjs.buildSkillsBlock(ctx.skills));
3087
+ return Promise.resolve(chunk3G6ZDZ6L_cjs.buildSkillsBlock(ctx.skills));
3087
3088
  }
3088
3089
  };
3089
3090
 
@@ -3345,7 +3346,7 @@ var HISTOGRAM_NAMES = {
3345
3346
  };
3346
3347
  function safeRequire(moduleName) {
3347
3348
  try {
3348
- const r = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-TSK4VVBW.cjs', document.baseURI).href)));
3349
+ const r = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-F7OBYH2X.cjs', document.baseURI).href)));
3349
3350
  return r(moduleName);
3350
3351
  } catch {
3351
3352
  return void 0;
@@ -3570,7 +3571,7 @@ var cachedOtel;
3570
3571
  function loadOtel() {
3571
3572
  if (cachedOtel === void 0) {
3572
3573
  try {
3573
- const r = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-TSK4VVBW.cjs', document.baseURI).href)));
3574
+ const r = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-F7OBYH2X.cjs', document.baseURI).href)));
3574
3575
  const mod = r("@opentelemetry/api");
3575
3576
  cachedOtel = mod;
3576
3577
  } catch {
@@ -3890,7 +3891,7 @@ function applyAggregateCap(sources, maxTotal) {
3890
3891
  }
3891
3892
  const remaining = maxTotal - totalBytes;
3892
3893
  if (remaining > 0) {
3893
- const { finalContent } = chunkUU7MAO2D_cjs.truncateWithMarker(s.content, remaining);
3894
+ const { finalContent } = chunkOKLYRPKL_cjs.truncateWithMarker(s.content, remaining);
3894
3895
  kept.push({ ...s, content: finalContent, truncated: true });
3895
3896
  totalBytes = maxTotal;
3896
3897
  } else {
@@ -3964,9 +3965,9 @@ var FileContextManager = class {
3964
3965
  this.lastScope = [...touchedFiles];
3965
3966
  const config = await loadContextConfig(this.cwd);
3966
3967
  const legacy = await loadSources(config, this.cwd);
3967
- const maxBytesPerFile = this.settings.maxBytesPerFile ?? chunkUU7MAO2D_cjs.DEFAULT_MAX_BYTES_PER_FILE;
3968
+ const maxBytesPerFile = this.settings.maxBytesPerFile ?? chunkOKLYRPKL_cjs.DEFAULT_MAX_BYTES_PER_FILE;
3968
3969
  const maxBytesTotal = this.settings.maxBytesTotal ?? DEFAULT_MAX_BYTES_TOTAL;
3969
- const discovered = await chunkUU7MAO2D_cjs.runDiscovery({
3970
+ const discovered = await chunkOKLYRPKL_cjs.runDiscovery({
3970
3971
  cwd: this.cwd,
3971
3972
  maxBytesPerFile,
3972
3973
  skipLegacyTheokitContext: true,
@@ -4106,7 +4107,7 @@ async function loadSources(config, cwd) {
4106
4107
  continue;
4107
4108
  }
4108
4109
  const absolute = path.resolve(cwd, source.path);
4109
- if (!chunkUU7MAO2D_cjs.insideRoot(absolute, cwd)) {
4110
+ if (!chunkVKJ7V7EB_cjs.insideRoot(absolute, cwd)) {
4110
4111
  results.push({ ...source, status: "excluded", tokens: [] });
4111
4112
  continue;
4112
4113
  }
@@ -4216,7 +4217,7 @@ var PluginsManager = class {
4216
4217
  const entry = metadata.entry;
4217
4218
  if (entry === void 0) return;
4218
4219
  const pluginRoot = path.join(this.cwd, ".theokit", "plugins", folderName);
4219
- const entryPath = chunkXA3TSBAH_cjs.safePathJoin(pluginRoot, entry);
4220
+ const entryPath = chunkXABN5HY6_cjs.safePathJoin(pluginRoot, entry);
4220
4221
  try {
4221
4222
  await promises.readFile(entryPath, "utf8");
4222
4223
  } catch (cause) {
@@ -6808,7 +6809,7 @@ var HttpMcpClient = class extends BaseMcpClient {
6808
6809
  function resolveMcpCwd(configCwd) {
6809
6810
  if (configCwd === void 0) return process.cwd();
6810
6811
  if (path.isAbsolute(configCwd)) return configCwd;
6811
- return chunkXA3TSBAH_cjs.safePathJoin(process.cwd(), configCwd);
6812
+ return chunkXABN5HY6_cjs.safePathJoin(process.cwd(), configCwd);
6812
6813
  }
6813
6814
 
6814
6815
  // src/internal/providers/register-plugin-providers.ts
@@ -7327,7 +7328,7 @@ function buildRealRunOptions(args) {
7327
7328
  };
7328
7329
  }
7329
7330
  async function createFixtureRunHelper(args) {
7330
- const sessionMessages = chunkFAUKVJCC_cjs.getSessionMessages(args.inputs.agentId);
7331
+ const sessionMessages = chunkUQHIEUDY_cjs.getSessionMessages(args.inputs.agentId);
7331
7332
  const projectMcpServers = args.inputs.settingSourcesIncludeProject ? await readProjectMcpServers(args.inputs.workspaceCwd) : {};
7332
7333
  return createLocalRun({
7333
7334
  agentId: args.inputs.agentId,
@@ -7602,10 +7603,10 @@ async function disposeLocalAgentSession(agent) {
7602
7603
  agent.lifecycleAbortController.abort();
7603
7604
  await chunkYLQQX5W2_cjs.withCwdMutex(`agent-send:${agent.agentId}`, () => Promise.resolve());
7604
7605
  disposeSessionMcpClients(agent.agentId);
7605
- await chunkFAUKVJCC_cjs.flushSessionWrites();
7606
+ await chunkUQHIEUDY_cjs.flushSessionWrites();
7606
7607
  await flushRegistrySaves(agent.workspaceCwd);
7607
7608
  await disposeSessionStore(agent.sessionStore);
7608
- chunkFAUKVJCC_cjs.discardSession(agent.workspaceCwd, agent.agentId);
7609
+ chunkUQHIEUDY_cjs.discardSession(agent.workspaceCwd, agent.agentId);
7609
7610
  }
7610
7611
  async function reloadLocalAgent(agent) {
7611
7612
  if (agent.context !== void 0) await agent.context.refresh();
@@ -7619,7 +7620,7 @@ async function reloadLocalAgent(agent) {
7619
7620
  }
7620
7621
  async function persistActiveMemoryTranscript(cwd, transcript) {
7621
7622
  try {
7622
- const dir = path.join(chunkGH52NOCL_cjs.memoryDir(cwd), "transcripts", "active-memory");
7623
+ const dir = path.join(chunkRWMNTFHZ_cjs.memoryDir(cwd), "transcripts", "active-memory");
7623
7624
  const file = path.join(dir, `${transcript.runId}.json`);
7624
7625
  await chunkNETYW4V3_cjs.atomicWriteJson(file, transcript);
7625
7626
  } catch (cause) {
@@ -8249,7 +8250,7 @@ function createMemorySearchTool(opts) {
8249
8250
  };
8250
8251
  }
8251
8252
  function createMemoryGetTool(opts) {
8252
- const memoryRoot = path.resolve(chunkGH52NOCL_cjs.memoryDir(opts.cwd));
8253
+ const memoryRoot = path.resolve(chunkRWMNTFHZ_cjs.memoryDir(opts.cwd));
8253
8254
  return {
8254
8255
  name: "memory_get",
8255
8256
  description: GET_DESCRIPTION,
@@ -8314,8 +8315,7 @@ function capByTotalChars(hits, maxTotalChars) {
8314
8315
  return { hits: kept, truncated: false };
8315
8316
  }
8316
8317
  function isPathInside(root, candidate) {
8317
- const normalizedRoot = root.endsWith("/") ? root : `${root}/`;
8318
- return candidate === root || candidate.startsWith(normalizedRoot);
8318
+ return chunkVKJ7V7EB_cjs.atOrInsideRoot(candidate, root);
8319
8319
  }
8320
8320
 
8321
8321
  // src/internal/local-agent/local-agent-memory.ts
@@ -8356,7 +8356,7 @@ var LocalAgentMemory = class {
8356
8356
  const openOpts = { cwd: this.workspaceCwd };
8357
8357
  if (embedding !== void 0) openOpts.embedding = embedding;
8358
8358
  if (cfg?.backend !== void 0) openOpts.backend = cfg.backend;
8359
- this.index = await chunkGH52NOCL_cjs.IndexManager.open(openOpts);
8359
+ this.index = await chunkRWMNTFHZ_cjs.IndexManager.open(openOpts);
8360
8360
  await this.index.sync();
8361
8361
  this.toolsCache = [
8362
8362
  createMemorySearchTool({ index: this.index }),
@@ -8603,7 +8603,7 @@ function createLocalAgentMemoryProvider(opts) {
8603
8603
  return { facts: [], systemPromptAdditions: summary };
8604
8604
  },
8605
8605
  async recordSessionSummary(args) {
8606
- await chunkGH52NOCL_cjs.writeSessionSummary(args);
8606
+ await chunkRWMNTFHZ_cjs.writeSessionSummary(args);
8607
8607
  },
8608
8608
  async sync(handle) {
8609
8609
  const state = handle[INTERNAL_LAM_KEY];
@@ -8782,8 +8782,8 @@ async function localAgentUsePersonality(args) {
8782
8782
  registry,
8783
8783
  store: args.personalityStore,
8784
8784
  invalidateCache: (reason) => args.invalidateCache(reason),
8785
- appendSessionMessage: (msg) => chunkFAUKVJCC_cjs.appendSessionMessage(args.agentId, msg),
8786
- clearSession: () => chunkFAUKVJCC_cjs.clearSession(args.agentId),
8785
+ appendSessionMessage: (msg) => chunkUQHIEUDY_cjs.appendSessionMessage(args.agentId, msg),
8786
+ clearSession: () => chunkUQHIEUDY_cjs.clearSession(args.agentId),
8787
8787
  opts: args.opts ?? {}
8788
8788
  })
8789
8789
  );
@@ -9137,7 +9137,7 @@ async function executeSendLocked(inputs, message, options) {
9137
9137
  if (inputs.options.onBeforeSend !== void 0) {
9138
9138
  await inputs.options.onBeforeSend({
9139
9139
  conversationId: inputs.agentId,
9140
- previousMessageCount: chunkFAUKVJCC_cjs.getSessionMessages(inputs.agentId).length
9140
+ previousMessageCount: chunkUQHIEUDY_cjs.getSessionMessages(inputs.agentId).length
9141
9141
  });
9142
9142
  }
9143
9143
  await inputs.runPreHook(userText);
@@ -9149,8 +9149,8 @@ async function executeSendLocked(inputs, message, options) {
9149
9149
  userText,
9150
9150
  sendOptions: options
9151
9151
  });
9152
- const priorMessages = [...chunkFAUKVJCC_cjs.getSessionMessages(inputs.agentId)];
9153
- chunkFAUKVJCC_cjs.appendSessionMessage(inputs.agentId, { role: "user", text: userText });
9152
+ const priorMessages = [...chunkUQHIEUDY_cjs.getSessionMessages(inputs.agentId)];
9153
+ chunkUQHIEUDY_cjs.appendSessionMessage(inputs.agentId, { role: "user", text: userText });
9154
9154
  await persistMemoryFactIfWritePrompt(inputs.workspaceCwd, inputs.options.memory, userText);
9155
9155
  const memoryFacts = await readMemoryForSend(inputs.workspaceCwd, inputs.options.memory);
9156
9156
  const portPathActive = shouldUsePortMemoryPath();
@@ -9362,7 +9362,7 @@ var LocalAgent = class {
9362
9362
  );
9363
9363
  await acquireLeaseIfPossible(this.sessionStore, this.agentId);
9364
9364
  try {
9365
- await chunkFAUKVJCC_cjs.hydrateSession(this.agentId, { store: this.sessionStore, cwd: this.workspaceCwd });
9365
+ await chunkUQHIEUDY_cjs.hydrateSession(this.agentId, { store: this.sessionStore, cwd: this.workspaceCwd });
9366
9366
  await this.personalityStore.hydrate(this.agentId);
9367
9367
  } catch (err) {
9368
9368
  await releaseLeaseIfPossible(this.sessionStore, this.agentId);
@@ -10152,9 +10152,9 @@ var Agent = class _Agent {
10152
10152
  `No local agent "${agentId}" registered \u2014 compact targets local sessions.`
10153
10153
  );
10154
10154
  }
10155
- const { compactSessionTranscript, buildDefaultSummarizer: buildDefaultSummarizer2 } = await import('./compact-session-UUCBTBCZ.cjs');
10155
+ const { compactSessionTranscript, buildDefaultSummarizer: buildDefaultSummarizer2 } = await import('./compact-session-FKYCJRAK.cjs');
10156
10156
  const { cwd, model, store } = await openLocalStore(reg);
10157
- return chunkFAUKVJCC_cjs.enqueueSessionWrite(
10157
+ return chunkUQHIEUDY_cjs.enqueueSessionWrite(
10158
10158
  cwd,
10159
10159
  agentId,
10160
10160
  () => compactSessionTranscript({
@@ -10188,7 +10188,7 @@ var Agent = class _Agent {
10188
10188
  `No local agent "${agentId}" registered \u2014 injectSessionTurn targets local sessions.`
10189
10189
  );
10190
10190
  }
10191
- const { injectSessionTurn } = await import('./inject-session-I3HK3AHB.cjs');
10191
+ const { injectSessionTurn } = await import('./inject-session-J7Y6XACY.cjs');
10192
10192
  const { cwd, model, store } = await openLocalStore(reg);
10193
10193
  await injectSessionTurn({
10194
10194
  store,
@@ -10333,5 +10333,5 @@ exports.generateCronId = generateCronId;
10333
10333
  exports.getPricingEntry = getPricingEntry;
10334
10334
  exports.openRouterMemoryEmbeddingProviderAdapter = openRouterMemoryEmbeddingProviderAdapter;
10335
10335
  exports.resolveApiKey = resolveApiKey;
10336
- //# sourceMappingURL=chunk-TSK4VVBW.cjs.map
10337
- //# sourceMappingURL=chunk-TSK4VVBW.cjs.map
10336
+ //# sourceMappingURL=chunk-F7OBYH2X.cjs.map
10337
+ //# sourceMappingURL=chunk-F7OBYH2X.cjs.map