@treeseed/sdk 0.1.2 → 0.3.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 (237) hide show
  1. package/README.md +97 -506
  2. package/dist/{src/cli-tools.d.ts → cli-tools.d.ts} +1 -1
  3. package/dist/cli-tools.js +5 -3
  4. package/dist/{src/content-store.d.ts → content-store.d.ts} +3 -2
  5. package/dist/content-store.js +52 -20
  6. package/dist/{src/d1-store.d.ts → d1-store.d.ts} +62 -1
  7. package/dist/d1-store.js +625 -65
  8. package/dist/field-aliases.d.ts +11 -0
  9. package/dist/field-aliases.js +41 -0
  10. package/dist/graph/build.d.ts +19 -0
  11. package/dist/graph/build.js +949 -0
  12. package/dist/graph/dsl.d.ts +2 -0
  13. package/dist/graph/dsl.js +243 -0
  14. package/dist/graph/query.d.ts +47 -0
  15. package/dist/graph/query.js +447 -0
  16. package/dist/graph/ranking.d.ts +3 -0
  17. package/dist/graph/ranking.js +483 -0
  18. package/dist/graph/schema.d.ts +142 -0
  19. package/dist/graph/schema.js +133 -0
  20. package/dist/graph.d.ts +52 -0
  21. package/dist/graph.js +133 -0
  22. package/dist/index.d.ts +28 -0
  23. package/dist/index.js +91 -2
  24. package/dist/model-registry.d.ts +8 -0
  25. package/dist/model-registry.js +351 -25
  26. package/dist/operations/providers/default.d.ts +10 -0
  27. package/dist/operations/providers/default.js +514 -0
  28. package/dist/operations/runtime.d.ts +7 -0
  29. package/dist/operations/runtime.js +60 -0
  30. package/dist/operations/services/config-runtime.d.ts +269 -0
  31. package/dist/operations/services/config-runtime.js +1397 -0
  32. package/dist/operations/services/d1-migration.d.ts +6 -0
  33. package/dist/operations/services/d1-migration.js +89 -0
  34. package/dist/operations/services/deploy.d.ts +371 -0
  35. package/dist/operations/services/deploy.js +981 -0
  36. package/dist/operations/services/git-workflow.d.ts +49 -0
  37. package/dist/operations/services/git-workflow.js +218 -0
  38. package/dist/operations/services/github-automation.d.ts +156 -0
  39. package/dist/operations/services/github-automation.js +256 -0
  40. package/dist/operations/services/local-dev.d.ts +9 -0
  41. package/dist/operations/services/local-dev.js +106 -0
  42. package/dist/operations/services/mailpit-runtime.d.ts +4 -0
  43. package/dist/operations/services/mailpit-runtime.js +59 -0
  44. package/dist/operations/services/railway-deploy.d.ts +53 -0
  45. package/dist/operations/services/railway-deploy.js +123 -0
  46. package/dist/operations/services/runtime-paths.d.ts +19 -0
  47. package/dist/operations/services/runtime-paths.js +54 -0
  48. package/dist/operations/services/runtime-tools.d.ts +117 -0
  49. package/dist/operations/services/runtime-tools.js +358 -0
  50. package/dist/operations/services/save-deploy-preflight.d.ts +34 -0
  51. package/dist/operations/services/save-deploy-preflight.js +76 -0
  52. package/dist/operations/services/template-registry.d.ts +88 -0
  53. package/dist/operations/services/template-registry.js +407 -0
  54. package/dist/operations/services/watch-dev.d.ts +21 -0
  55. package/dist/operations/services/watch-dev.js +284 -0
  56. package/dist/operations/services/workspace-preflight.d.ts +40 -0
  57. package/dist/operations/services/workspace-preflight.js +165 -0
  58. package/dist/operations/services/workspace-save.d.ts +42 -0
  59. package/dist/operations/services/workspace-save.js +235 -0
  60. package/dist/operations/services/workspace-tools.d.ts +16 -0
  61. package/dist/operations/services/workspace-tools.js +270 -0
  62. package/dist/operations-registry.d.ts +5 -0
  63. package/dist/operations-registry.js +68 -0
  64. package/dist/operations-types.d.ts +71 -0
  65. package/dist/operations-types.js +17 -0
  66. package/dist/operations.d.ts +6 -0
  67. package/dist/operations.js +16 -0
  68. package/dist/platform/books-data.d.ts +1 -0
  69. package/dist/platform/books-data.js +1 -0
  70. package/dist/platform/contracts.d.ts +158 -0
  71. package/dist/platform/contracts.js +0 -0
  72. package/dist/platform/deploy/config.d.ts +4 -0
  73. package/dist/platform/deploy/config.js +222 -0
  74. package/dist/platform/deploy-config.d.ts +1 -0
  75. package/dist/platform/deploy-config.js +1 -0
  76. package/dist/platform/deploy-runtime.d.ts +18 -0
  77. package/dist/platform/deploy-runtime.js +78 -0
  78. package/dist/platform/env.yaml +394 -0
  79. package/dist/platform/environment.d.ts +130 -0
  80. package/dist/platform/environment.js +331 -0
  81. package/dist/platform/plugin.d.ts +2 -0
  82. package/dist/platform/plugin.js +4 -0
  83. package/dist/platform/plugins/constants.d.ts +22 -0
  84. package/dist/platform/plugins/constants.js +29 -0
  85. package/dist/platform/plugins/plugin.d.ts +51 -0
  86. package/dist/platform/plugins/plugin.js +6 -0
  87. package/dist/platform/plugins/runtime.d.ts +35 -0
  88. package/dist/platform/plugins/runtime.js +161 -0
  89. package/dist/platform/plugins.d.ts +6 -0
  90. package/dist/platform/plugins.js +38 -0
  91. package/dist/platform/site-config-schema.js +1 -0
  92. package/dist/platform/tenant/config.d.ts +9 -0
  93. package/dist/platform/tenant/config.js +154 -0
  94. package/dist/platform/tenant/runtime-config.d.ts +4 -0
  95. package/dist/platform/tenant/runtime-config.js +20 -0
  96. package/dist/platform/tenant-config.d.ts +1 -0
  97. package/dist/platform/tenant-config.js +1 -0
  98. package/dist/platform/utils/books-data.d.ts +29 -0
  99. package/dist/platform/utils/books-data.js +82 -0
  100. package/dist/platform/utils/site-config-schema.js +321 -0
  101. package/dist/remote.d.ts +175 -0
  102. package/dist/remote.js +202 -0
  103. package/dist/runtime.js +35 -22
  104. package/dist/scripts/aggregate-book.js +121 -0
  105. package/dist/scripts/build-dist.js +54 -13
  106. package/dist/scripts/build-tenant-worker.js +36 -0
  107. package/dist/scripts/cleanup-markdown.js +373 -0
  108. package/dist/scripts/cli-test-fixtures.js +48 -0
  109. package/dist/scripts/config-treeseed.js +95 -0
  110. package/dist/scripts/ensure-mailpit.js +29 -0
  111. package/dist/scripts/local-dev.js +129 -0
  112. package/dist/scripts/logs-mailpit.js +2 -0
  113. package/dist/scripts/patch-starlight-content-path.js +172 -0
  114. package/dist/scripts/release-verify.js +34 -6
  115. package/dist/scripts/run-fixture-astro-command.js +18 -0
  116. package/dist/scripts/scaffold-site.js +65 -0
  117. package/dist/scripts/stop-mailpit.js +5 -0
  118. package/dist/scripts/sync-dev-vars.js +6 -0
  119. package/dist/scripts/sync-template.js +20 -0
  120. package/dist/scripts/template-catalog.test.js +100 -0
  121. package/dist/scripts/template-command.js +31 -0
  122. package/dist/scripts/tenant-astro-command.js +3 -0
  123. package/dist/scripts/tenant-build.js +16 -0
  124. package/dist/scripts/tenant-check.js +7 -0
  125. package/dist/scripts/tenant-d1-migrate-local.js +11 -0
  126. package/dist/scripts/tenant-deploy.js +180 -0
  127. package/dist/scripts/tenant-destroy.js +104 -0
  128. package/dist/scripts/tenant-dev.js +171 -0
  129. package/dist/scripts/tenant-lint.js +4 -0
  130. package/dist/scripts/tenant-test.js +4 -0
  131. package/dist/scripts/test-cloudflare-local.js +212 -0
  132. package/dist/scripts/test-scaffold.js +314 -0
  133. package/dist/scripts/test-smoke.js +71 -13
  134. package/dist/scripts/treeseed-assert-release-tag-version.js +21 -0
  135. package/dist/scripts/treeseed-build-dist.js +134 -0
  136. package/dist/scripts/treeseed-publish-package.js +19 -0
  137. package/dist/scripts/treeseed-release-verify.js +131 -0
  138. package/dist/scripts/treeseed-run-ts.js +45 -0
  139. package/dist/scripts/validate-templates.js +6 -0
  140. package/dist/scripts/verify-driver.js +29 -0
  141. package/dist/scripts/workflow-commands.test.js +39 -0
  142. package/dist/scripts/workspace-close.js +24 -0
  143. package/dist/scripts/workspace-command-e2e.js +718 -0
  144. package/dist/scripts/workspace-lint.js +9 -0
  145. package/dist/scripts/workspace-preflight.js +22 -0
  146. package/dist/scripts/workspace-publish-changed-packages.js +16 -0
  147. package/dist/scripts/workspace-release-verify.js +81 -0
  148. package/dist/scripts/workspace-release.js +42 -0
  149. package/dist/scripts/workspace-save.js +124 -0
  150. package/dist/scripts/workspace-start-warning.js +3 -0
  151. package/dist/scripts/workspace-start.js +71 -0
  152. package/dist/scripts/workspace-test-unit.js +4 -0
  153. package/dist/scripts/workspace-test.js +11 -0
  154. package/dist/sdk-fields.d.ts +11 -0
  155. package/dist/sdk-fields.js +169 -0
  156. package/dist/sdk-filters.d.ts +4 -0
  157. package/dist/sdk-filters.js +12 -15
  158. package/dist/sdk-types.d.ts +796 -0
  159. package/dist/sdk-types.js +7 -1
  160. package/dist/sdk-version.d.ts +2 -0
  161. package/dist/sdk-version.js +42 -0
  162. package/dist/sdk.d.ts +215 -0
  163. package/dist/sdk.js +235 -11
  164. package/dist/stores/cursor-store.js +9 -3
  165. package/dist/stores/lease-store.js +8 -2
  166. package/dist/{src/stores → stores}/message-store.d.ts +1 -1
  167. package/dist/stores/message-store.js +27 -3
  168. package/dist/stores/operational-store.d.ts +24 -0
  169. package/dist/stores/operational-store.js +279 -0
  170. package/dist/stores/run-store.js +8 -1
  171. package/dist/stores/subscription-store.js +7 -5
  172. package/dist/template-catalog.d.ts +13 -0
  173. package/dist/template-catalog.js +141 -0
  174. package/dist/treeseed/services/compose.yml +7 -0
  175. package/dist/treeseed/template-catalog/catalog.fixture.json +55 -0
  176. package/dist/treeseed/template-catalog/templates/starter-basic/template/astro.config.d.ts +2 -0
  177. package/dist/treeseed/template-catalog/templates/starter-basic/template/astro.config.ts +3 -0
  178. package/dist/treeseed/template-catalog/templates/starter-basic/template/package.json +32 -0
  179. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/config.yaml +40 -0
  180. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content/empty/.gitkeep +1 -0
  181. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content/knowledge/handbook/index.mdx +11 -0
  182. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content/pages/welcome.mdx +11 -0
  183. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content.config.d.ts +1 -0
  184. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content.config.ts +3 -0
  185. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/env.yaml +1 -0
  186. package/dist/treeseed/template-catalog/templates/starter-basic/template/src/manifest.yaml +19 -0
  187. package/dist/treeseed/template-catalog/templates/starter-basic/template/treeseed.site.yaml +26 -0
  188. package/dist/treeseed/template-catalog/templates/starter-basic/template/tsconfig.json +9 -0
  189. package/dist/treeseed/template-catalog/templates/starter-basic/template.config.json +90 -0
  190. package/dist/utils/agents/contracts/messages.d.ts +88 -0
  191. package/dist/utils/agents/contracts/messages.js +138 -0
  192. package/dist/utils/agents/contracts/run.d.ts +20 -0
  193. package/dist/utils/agents/contracts/run.js +0 -0
  194. package/dist/utils/agents/runtime-types.d.ts +117 -0
  195. package/dist/utils/agents/runtime-types.js +4 -0
  196. package/dist/verification.d.ts +20 -0
  197. package/dist/verification.js +98 -0
  198. package/dist/workflow/operations.d.ts +396 -0
  199. package/dist/workflow/operations.js +841 -0
  200. package/dist/workflow-state.d.ts +56 -0
  201. package/dist/workflow-state.js +195 -0
  202. package/dist/workflow-support.d.ts +9 -0
  203. package/dist/workflow-support.js +176 -0
  204. package/dist/workflow.d.ts +111 -0
  205. package/dist/workflow.js +97 -0
  206. package/package.json +111 -5
  207. package/scripts/verify-driver.mjs +29 -0
  208. package/dist/scripts/.ts-run-1775630384291-crtqr3izsa.js +0 -22
  209. package/dist/scripts/.ts-run-1775630388025-vnjle0z75a.js +0 -129
  210. package/dist/scripts/assert-release-tag-version.d.ts +0 -1
  211. package/dist/scripts/build-dist.d.ts +0 -1
  212. package/dist/scripts/fixture-tools.d.ts +0 -5
  213. package/dist/scripts/package-tools.d.ts +0 -15
  214. package/dist/scripts/publish-package.d.ts +0 -1
  215. package/dist/scripts/release-verify.d.ts +0 -1
  216. package/dist/scripts/test-smoke.d.ts +0 -1
  217. package/dist/src/index.d.ts +0 -6
  218. package/dist/src/model-registry.d.ts +0 -4
  219. package/dist/src/sdk-filters.d.ts +0 -4
  220. package/dist/src/sdk-types.d.ts +0 -285
  221. package/dist/src/sdk.d.ts +0 -109
  222. package/dist/test/test-fixture.d.ts +0 -1
  223. package/dist/test/utils/envelopes.test.d.ts +0 -1
  224. package/dist/test/utils/sdk.test.d.ts +0 -1
  225. package/dist/vitest.config.d.ts +0 -2
  226. /package/dist/{src/frontmatter.d.ts → frontmatter.d.ts} +0 -0
  227. /package/dist/{src/git-runtime.d.ts → git-runtime.d.ts} +0 -0
  228. /package/dist/{src/runtime.d.ts → runtime.d.ts} +0 -0
  229. /package/dist/{src/stores → stores}/cursor-store.d.ts +0 -0
  230. /package/dist/{src/stores → stores}/envelopes.d.ts +0 -0
  231. /package/dist/{src/stores → stores}/helpers.d.ts +0 -0
  232. /package/dist/{src/stores → stores}/lease-store.d.ts +0 -0
  233. /package/dist/{src/stores → stores}/run-store.d.ts +0 -0
  234. /package/dist/{src/stores → stores}/subscription-store.d.ts +0 -0
  235. /package/dist/{src/types → types}/agents.d.ts +0 -0
  236. /package/dist/{src/types → types}/cloudflare.d.ts +0 -0
  237. /package/dist/{src/wrangler-d1.d.ts → wrangler-d1.d.ts} +0 -0
package/dist/sdk-types.js CHANGED
@@ -11,7 +11,13 @@ const SDK_MODEL_NAMES = [
11
11
  "agent",
12
12
  "agent_run",
13
13
  "agent_cursor",
14
- "content_lease"
14
+ "content_lease",
15
+ "work_day",
16
+ "task",
17
+ "task_event",
18
+ "task_output",
19
+ "graph_run",
20
+ "report"
15
21
  ];
16
22
  const SDK_OPERATIONS = ["get", "read", "search", "follow", "pick", "create", "update"];
17
23
  const SDK_STORAGE_BACKENDS = ["content", "d1"];
@@ -0,0 +1,2 @@
1
+ export declare function resolveSdkRecordVersion(record: Record<string, unknown> | null | undefined): string | null;
2
+ export declare function assertExpectedVersion(expectedVersion: string | undefined, record: Record<string, unknown> | null | undefined, label: string): void;
@@ -0,0 +1,42 @@
1
+ function firstString(record, keys) {
2
+ for (const key of keys) {
3
+ const value = record[key];
4
+ if (typeof value === "string" && value.trim().length > 0) {
5
+ return value;
6
+ }
7
+ }
8
+ return null;
9
+ }
10
+ function resolveSdkRecordVersion(record) {
11
+ if (!record) {
12
+ return null;
13
+ }
14
+ return firstString(record, [
15
+ "updatedAt",
16
+ "updated_at",
17
+ "leaseExpiresAt",
18
+ "lease_expires_at",
19
+ "finishedAt",
20
+ "finished_at",
21
+ "startedAt",
22
+ "started_at",
23
+ "createdAt",
24
+ "created_at"
25
+ ]);
26
+ }
27
+ function assertExpectedVersion(expectedVersion, record, label) {
28
+ if (!expectedVersion) {
29
+ return;
30
+ }
31
+ const currentVersion = resolveSdkRecordVersion(record);
32
+ if (!currentVersion) {
33
+ throw new Error(`${label} does not expose a comparable version for optimistic updates.`);
34
+ }
35
+ if (currentVersion !== expectedVersion) {
36
+ throw new Error(`${label} version mismatch. Expected ${expectedVersion} but found ${currentVersion}.`);
37
+ }
38
+ }
39
+ export {
40
+ assertExpectedVersion,
41
+ resolveSdkRecordVersion
42
+ };
package/dist/sdk.d.ts ADDED
@@ -0,0 +1,215 @@
1
+ import type { AgentPermissionConfig, AgentRuntimeSpec } from './types/agents.ts';
2
+ import { ContentStore } from './content-store.ts';
3
+ import { type AgentDatabase } from './d1-store.ts';
4
+ import { type LoadedTreeseedPluginEntry } from './platform/plugins.ts';
5
+ import type { SdkAckMessageRequest, SdkClaimMessageRequest, SdkClaimTaskRequest, SdkCloseWorkDayRequest, SdkCompleteTaskRequest, SdkCreateReportRequest, SdkCreateMessageRequest, SdkCreateTaskRequest, SdkCursorRequest, SdkFailTaskRequest, SdkFollowRequest, SdkGetRequest, SdkGetCursorRequest, SdkJsonEnvelope, SdkLeaseReleaseRequest, SdkManagerContextPayload, SdkMutationRequest, SdkGraphQueryOptions, SdkGraphQueryRequest, SdkGraphRefreshRequest, SdkGraphSearchOptions, SdkContextPackRequest, SdkGraphDslParseResult, SdkPickRequest, SdkRecordRunRequest, SdkSearchRequest, SdkStartWorkDayRequest, SdkTaskProgressRequest, SdkTaskSearchRequest, SdkUpdateRequest, SdkModelDefinition, SdkModelRegistry, SdkGraphRankingProvider } from './sdk-types.ts';
6
+ export interface AgentSdkOptions {
7
+ repoRoot?: string;
8
+ database?: AgentDatabase;
9
+ models?: SdkModelDefinition[];
10
+ modelRegistry?: SdkModelRegistry;
11
+ graphRankingProvider?: SdkGraphRankingProvider;
12
+ plugins?: LoadedTreeseedPluginEntry[];
13
+ }
14
+ export declare class AgentSdk {
15
+ readonly database: AgentDatabase;
16
+ readonly content: ContentStore;
17
+ readonly models: SdkModelRegistry;
18
+ private readonly graph;
19
+ constructor(options?: AgentSdkOptions);
20
+ static createLocal(options: {
21
+ repoRoot?: string;
22
+ databaseName?: string;
23
+ persistTo?: string;
24
+ models?: SdkModelDefinition[];
25
+ modelRegistry?: SdkModelRegistry;
26
+ }): AgentSdk;
27
+ private envelope;
28
+ get(request: SdkGetRequest): Promise<SdkJsonEnvelope<Record<string, unknown> | import("./sdk-types.ts").SdkContentEntry | null>>;
29
+ read(request: SdkGetRequest): Promise<{
30
+ operation: "read";
31
+ ok: boolean;
32
+ model: import("./sdk-types.ts").SdkModelName;
33
+ payload: Record<string, unknown> | import("./sdk-types.ts").SdkContentEntry | null;
34
+ meta?: Record<string, unknown>;
35
+ }>;
36
+ search(request: SdkSearchRequest): Promise<SdkJsonEnvelope<Record<string, unknown>[] | import("./sdk-types.ts").SdkContentEntry[]>>;
37
+ follow(request: SdkFollowRequest): Promise<SdkJsonEnvelope<{
38
+ items: Record<string, unknown>[];
39
+ since: string;
40
+ } | {
41
+ items: import("./sdk-types.ts").SdkContentEntry[];
42
+ since: string;
43
+ }>>;
44
+ pick(request: SdkPickRequest): Promise<SdkJsonEnvelope<import("./sdk-types.ts").SdkPickResult<Record<string, unknown>> | import("./sdk-types.ts").SdkPickResult<import("./sdk-types.ts").SdkContentEntry>>>;
45
+ create(request: SdkMutationRequest): Promise<SdkJsonEnvelope<Record<string, unknown> | {
46
+ item: import("./sdk-types.ts").SdkContentEntry;
47
+ git: import("./git-runtime.ts").GitMutationResult;
48
+ }>>;
49
+ update(request: SdkUpdateRequest): Promise<SdkJsonEnvelope<Record<string, unknown> | {
50
+ item: import("./sdk-types.ts").SdkContentEntry;
51
+ git: import("./git-runtime.ts").GitMutationResult;
52
+ } | null>>;
53
+ claimMessage(request: SdkClaimMessageRequest): Promise<SdkJsonEnvelope<import("./sdk-types.ts").SdkMessageEntity | null>>;
54
+ ackMessage(request: SdkAckMessageRequest): Promise<SdkJsonEnvelope<{
55
+ id: number;
56
+ status: "pending" | "claimed" | "completed" | "failed" | "dead_letter";
57
+ }>>;
58
+ createMessage(request: SdkCreateMessageRequest): Promise<SdkJsonEnvelope<import("./sdk-types.ts").SdkMessageEntity>>;
59
+ recordRun(request: SdkRecordRunRequest): Promise<SdkJsonEnvelope<Record<string, unknown>>>;
60
+ getCursor(request: SdkGetCursorRequest): Promise<SdkJsonEnvelope<string | null>>;
61
+ upsertCursor(request: SdkCursorRequest): Promise<SdkJsonEnvelope<SdkCursorRequest>>;
62
+ releaseLease(request: SdkLeaseReleaseRequest): Promise<SdkJsonEnvelope<SdkLeaseReleaseRequest>>;
63
+ releaseAllLeases(): Promise<SdkJsonEnvelope<{
64
+ count: number;
65
+ }>>;
66
+ startWorkDay(request: SdkStartWorkDayRequest): Promise<SdkJsonEnvelope<import("./sdk-types.ts").SdkWorkDayEntity | null>>;
67
+ closeWorkDay(request: SdkCloseWorkDayRequest): Promise<SdkJsonEnvelope<import("./sdk-types.ts").SdkWorkDayEntity | null>>;
68
+ createTask(request: SdkCreateTaskRequest): Promise<SdkJsonEnvelope<import("./sdk-types.ts").SdkTaskEntity | null>>;
69
+ claimTask(request: SdkClaimTaskRequest): Promise<SdkJsonEnvelope<import("./sdk-types.ts").SdkTaskEntity | null>>;
70
+ recordTaskProgress(request: SdkTaskProgressRequest): Promise<SdkJsonEnvelope<import("./sdk-types.ts").SdkTaskEntity | null>>;
71
+ completeTask(request: SdkCompleteTaskRequest): Promise<SdkJsonEnvelope<import("./sdk-types.ts").SdkTaskEntity | null>>;
72
+ failTask(request: SdkFailTaskRequest): Promise<SdkJsonEnvelope<import("./sdk-types.ts").SdkTaskEntity | null>>;
73
+ appendTaskEvent(request: {
74
+ taskId: string;
75
+ kind: string;
76
+ data?: Record<string, unknown>;
77
+ actor: string;
78
+ }): Promise<SdkJsonEnvelope<Record<string, unknown> | null>>;
79
+ searchTasks(request: SdkTaskSearchRequest): Promise<SdkJsonEnvelope<import("./sdk-types.ts").SdkTaskEntity[]>>;
80
+ createReport(request: SdkCreateReportRequest): Promise<SdkJsonEnvelope<import("./sdk-types.ts").SdkReportEntity | null>>;
81
+ getManagerContext(taskId: string): Promise<SdkJsonEnvelope<SdkManagerContextPayload>>;
82
+ listAgentSpecs(options?: {
83
+ enabled?: boolean;
84
+ }): Promise<AgentRuntimeSpec[]>;
85
+ listRawAgentSpecs(options?: {
86
+ enabled?: boolean;
87
+ }): Promise<Record<string, unknown>[] | import("./sdk-types.ts").SdkContentEntry[]>;
88
+ scopeForAgent(agent: Pick<AgentRuntimeSpec, 'slug' | 'permissions'>): ScopedAgentSdk;
89
+ /** Advanced graph maintenance helper. Most application code should use parseGraphDsl() -> queryGraph() -> buildContextPack(). */
90
+ refreshGraph(request?: SdkGraphRefreshRequest): Promise<import("./sdk-types.ts").SdkGraphRefreshPayload>;
91
+ /** Advanced lexical graph primitive for file nodes. Prefer queryGraph() or buildContextPack() for AI-context retrieval. */
92
+ searchFiles(query: string, options?: SdkGraphSearchOptions): Promise<import("./sdk-types.ts").SdkGraphSearchResult[]>;
93
+ /** Advanced lexical graph primitive for section nodes. Prefer queryGraph() or buildContextPack() for AI-context retrieval. */
94
+ searchSections(query: string, options?: SdkGraphSearchOptions): Promise<import("./sdk-types.ts").SdkGraphSearchResult[]>;
95
+ /** Advanced lexical graph primitive for entity nodes. Prefer queryGraph() or buildContextPack() for AI-context retrieval. */
96
+ searchEntities(query: string, options?: SdkGraphSearchOptions): Promise<import("./sdk-types.ts").SdkGraphSearchResult[]>;
97
+ /** Advanced graph primitive that returns one raw graph node by id. */
98
+ getGraphNode(id: string): Promise<import("./sdk-types.ts").SdkGraphNode | null>;
99
+ /** Advanced graph primitive for direct neighborhood inspection. Prefer queryGraph() for ranked retrieval. */
100
+ getNeighbors(id: string, options?: SdkGraphQueryOptions): Promise<{
101
+ node: import("./sdk-types.ts").SdkGraphNode | null;
102
+ nodes: import("./sdk-types.ts").SdkGraphNode[];
103
+ edges: import("./sdk-types.ts").SdkGraphEdge[];
104
+ }>;
105
+ /** Advanced traversal primitive for direct reference walking. Prefer queryGraph() when you need ranking and ctx-aware behavior. */
106
+ followReferences(id: string, options?: SdkGraphQueryOptions): Promise<import("./sdk-types.ts").SdkGraphTraversalResult>;
107
+ /** Advanced graph primitive for incoming-link inspection. */
108
+ getBacklinks(id: string, options?: SdkGraphQueryOptions): Promise<{
109
+ node: import("./sdk-types.ts").SdkGraphNode | null;
110
+ nodes: import("./sdk-types.ts").SdkGraphNode[];
111
+ edges: import("./sdk-types.ts").SdkGraphEdge[];
112
+ }>;
113
+ /** Advanced graph primitive for local relatedness. Prefer queryGraph() for the primary ranked graph workflow. */
114
+ getRelated(id: string, options?: SdkGraphQueryOptions): Promise<import("./sdk-types.ts").SdkGraphQueryNodeResult[]>;
115
+ /** Advanced traversal primitive for raw subgraph extraction. Prefer buildContextPack() when you need prompt-ready output. */
116
+ getSubgraph(seedIds: string[], options?: SdkGraphQueryOptions): Promise<import("./sdk-types.ts").SdkGraphTraversalResult>;
117
+ /** Primary graph workflow helper. Resolves roots before ranking and traversal. */
118
+ resolveSeeds(request: SdkGraphQueryRequest): Promise<import("./sdk-types.ts").SdkGraphSeedResolution>;
119
+ /** Primary graph workflow entrypoint for ranked graph retrieval. */
120
+ queryGraph(request: SdkGraphQueryRequest): Promise<import("./sdk-types.ts").SdkGraphQueryResult>;
121
+ /** Primary graph workflow entrypoint for prompt-ready AI context assembly. */
122
+ buildContextPack(request: SdkContextPackRequest): Promise<import("./sdk-types.ts").SdkContextPack>;
123
+ /** Primary graph workflow helper. Parses the public ctx DSL into a typed graph request. */
124
+ parseGraphDsl(source: string): Promise<SdkGraphDslParseResult>;
125
+ /** Primary graph workflow helper for resolving ids, paths, and anchors into graph nodes. */
126
+ resolveReference(reference: string, options?: {
127
+ fromNodeId?: string;
128
+ fromPath?: string;
129
+ models?: string[];
130
+ }): Promise<import("./sdk-types.ts").SdkGraphNode | null>;
131
+ /** Primary graph workflow helper for explaining why two nodes are connected. */
132
+ explainReferenceChain(fromId: string, toId: string): Promise<import("./sdk-types.ts").SdkGraphPathExplanation | null>;
133
+ }
134
+ /** Operational SDK wrapper that enforces agent permissions on top of AgentSdk. */
135
+ export declare class ScopedAgentSdk {
136
+ private readonly base;
137
+ private readonly actor;
138
+ private readonly permissions;
139
+ constructor(base: AgentSdk, actor: string, permissions: AgentPermissionConfig[]);
140
+ private assertAllowed;
141
+ private allowedModelsFor;
142
+ private assertGraphNodeAllowed;
143
+ get(request: SdkGetRequest): Promise<SdkJsonEnvelope<Record<string, unknown> | import("./sdk-types.ts").SdkContentEntry | null>>;
144
+ read(request: SdkGetRequest): Promise<{
145
+ operation: "read";
146
+ ok: boolean;
147
+ model: import("./sdk-types.ts").SdkModelName;
148
+ payload: Record<string, unknown> | import("./sdk-types.ts").SdkContentEntry | null;
149
+ meta?: Record<string, unknown>;
150
+ }>;
151
+ search(request: SdkSearchRequest): Promise<SdkJsonEnvelope<Record<string, unknown>[] | import("./sdk-types.ts").SdkContentEntry[]>>;
152
+ follow(request: SdkFollowRequest): Promise<SdkJsonEnvelope<{
153
+ items: Record<string, unknown>[];
154
+ since: string;
155
+ } | {
156
+ items: import("./sdk-types.ts").SdkContentEntry[];
157
+ since: string;
158
+ }>>;
159
+ pick(request: SdkPickRequest): Promise<SdkJsonEnvelope<import("./sdk-types.ts").SdkPickResult<Record<string, unknown>> | import("./sdk-types.ts").SdkPickResult<import("./sdk-types.ts").SdkContentEntry>>>;
160
+ create(request: Omit<SdkMutationRequest, 'actor'>): Promise<SdkJsonEnvelope<Record<string, unknown> | {
161
+ item: import("./sdk-types.ts").SdkContentEntry;
162
+ git: import("./git-runtime.ts").GitMutationResult;
163
+ }>>;
164
+ update(request: Omit<SdkUpdateRequest, 'actor'>): Promise<SdkJsonEnvelope<Record<string, unknown> | {
165
+ item: import("./sdk-types.ts").SdkContentEntry;
166
+ git: import("./git-runtime.ts").GitMutationResult;
167
+ } | null>>;
168
+ claimMessage(request: SdkClaimMessageRequest): Promise<SdkJsonEnvelope<import("./sdk-types.ts").SdkMessageEntity | null>>;
169
+ ackMessage(request: SdkAckMessageRequest): Promise<SdkJsonEnvelope<{
170
+ id: number;
171
+ status: "pending" | "claimed" | "completed" | "failed" | "dead_letter";
172
+ }>>;
173
+ createMessage(request: Omit<SdkCreateMessageRequest, 'actor'>): Promise<SdkJsonEnvelope<import("./sdk-types.ts").SdkMessageEntity>>;
174
+ recordRun(request: SdkRecordRunRequest): Promise<SdkJsonEnvelope<Record<string, unknown>>>;
175
+ getCursor(request: SdkGetCursorRequest): Promise<SdkJsonEnvelope<string | null>>;
176
+ upsertCursor(request: SdkCursorRequest): Promise<SdkJsonEnvelope<SdkCursorRequest>>;
177
+ releaseLease(request: SdkLeaseReleaseRequest): Promise<SdkJsonEnvelope<SdkLeaseReleaseRequest>>;
178
+ releaseAllLeases(): Promise<SdkJsonEnvelope<{
179
+ count: number;
180
+ }>>;
181
+ refreshGraph(request?: SdkGraphRefreshRequest): Promise<import("./sdk-types.ts").SdkGraphRefreshPayload>;
182
+ /** Advanced lexical graph primitive for file nodes. Scoped to models the agent may search. */
183
+ searchFiles(query: string, options?: SdkGraphSearchOptions): Promise<import("./sdk-types.ts").SdkGraphSearchResult[]>;
184
+ /** Advanced lexical graph primitive for section nodes. Scoped to models the agent may search. */
185
+ searchSections(query: string, options?: SdkGraphSearchOptions): Promise<import("./sdk-types.ts").SdkGraphSearchResult[]>;
186
+ /** Advanced lexical graph primitive for entity nodes. Scoped to models the agent may search. */
187
+ searchEntities(query: string, options?: SdkGraphSearchOptions): Promise<import("./sdk-types.ts").SdkGraphSearchResult[]>;
188
+ getGraphNode(id: string): Promise<import("./sdk-types.ts").SdkGraphNode | null>;
189
+ getNeighbors(id: string, options?: SdkGraphQueryOptions): Promise<{
190
+ node: import("./sdk-types.ts").SdkGraphNode | null;
191
+ nodes: import("./sdk-types.ts").SdkGraphNode[];
192
+ edges: import("./sdk-types.ts").SdkGraphEdge[];
193
+ }>;
194
+ followReferences(id: string, options?: SdkGraphQueryOptions): Promise<import("./sdk-types.ts").SdkGraphTraversalResult>;
195
+ getBacklinks(id: string, options?: SdkGraphQueryOptions): Promise<{
196
+ node: import("./sdk-types.ts").SdkGraphNode | null;
197
+ nodes: import("./sdk-types.ts").SdkGraphNode[];
198
+ edges: import("./sdk-types.ts").SdkGraphEdge[];
199
+ }>;
200
+ getRelated(id: string, options?: SdkGraphQueryOptions): Promise<import("./sdk-types.ts").SdkGraphQueryNodeResult[]>;
201
+ getSubgraph(seedIds: string[], options?: SdkGraphQueryOptions): Promise<import("./sdk-types.ts").SdkGraphTraversalResult>;
202
+ /** Primary graph workflow helper, scoped to followable models. */
203
+ resolveSeeds(request: SdkGraphQueryRequest): Promise<import("./sdk-types.ts").SdkGraphSeedResolution>;
204
+ /** Primary graph workflow entrypoint for ranked graph retrieval, scoped to followable models. */
205
+ queryGraph(request: SdkGraphQueryRequest): Promise<import("./sdk-types.ts").SdkGraphQueryResult>;
206
+ /** Primary graph workflow entrypoint for prompt-ready context assembly, scoped to followable models. */
207
+ buildContextPack(request: SdkContextPackRequest): Promise<import("./sdk-types.ts").SdkContextPack>;
208
+ parseGraphDsl(source: string): Promise<SdkGraphDslParseResult>;
209
+ resolveReference(reference: string, options?: {
210
+ fromNodeId?: string;
211
+ fromPath?: string;
212
+ models?: string[];
213
+ }): Promise<import("./sdk-types.ts").SdkGraphNode | null>;
214
+ explainReferenceChain(fromId: string, toId: string): Promise<import("./sdk-types.ts").SdkGraphPathExplanation | null>;
215
+ }
package/dist/sdk.js CHANGED
@@ -2,7 +2,9 @@ import { resolveSdkRepoRoot } from "./runtime.js";
2
2
  import { normalizeAgentCliOptions } from "./cli-tools.js";
3
3
  import { ContentStore } from "./content-store.js";
4
4
  import { CloudflareD1AgentDatabase, MemoryAgentDatabase } from "./d1-store.js";
5
- import { resolveModelDefinition } from "./model-registry.js";
5
+ import { ContentGraphRuntime } from "./graph.js";
6
+ import { loadTreeseedPlugins } from "./platform/plugins.js";
7
+ import { buildScopedModelRegistry, resolveModelDefinition } from "./model-registry.js";
6
8
  import { WranglerD1Database } from "./wrangler-d1.js";
7
9
  function normalizeAgentSpec(entry) {
8
10
  if (!entry) {
@@ -27,10 +29,25 @@ function operationAllowed(permissions, model, operation) {
27
29
  class AgentSdk {
28
30
  database;
29
31
  content;
32
+ models;
33
+ graph;
30
34
  constructor(options = {}) {
31
35
  const repoRoot = resolveSdkRepoRoot(options.repoRoot);
36
+ this.models = options.modelRegistry ?? buildScopedModelRegistry(repoRoot, options.models);
32
37
  this.database = options.database ?? new MemoryAgentDatabase();
33
- this.content = new ContentStore(repoRoot, this.database);
38
+ this.content = new ContentStore(repoRoot, this.database, this.models);
39
+ let plugins = options.plugins;
40
+ if (!plugins) {
41
+ try {
42
+ plugins = loadTreeseedPlugins();
43
+ } catch {
44
+ plugins = [];
45
+ }
46
+ }
47
+ this.graph = new ContentGraphRuntime(repoRoot, this.models, {
48
+ rankingProvider: options.graphRankingProvider,
49
+ plugins
50
+ });
34
51
  }
35
52
  static createLocal(options) {
36
53
  const repoRoot = resolveSdkRepoRoot(options.repoRoot);
@@ -41,20 +58,22 @@ class AgentSdk {
41
58
  );
42
59
  return new AgentSdk({
43
60
  repoRoot,
44
- database: new CloudflareD1AgentDatabase(d1)
61
+ database: new CloudflareD1AgentDatabase(d1),
62
+ models: options.models,
63
+ modelRegistry: options.modelRegistry
45
64
  });
46
65
  }
47
66
  envelope(model, operation, payload, meta) {
48
67
  return {
49
68
  ok: true,
50
- model: resolveModelDefinition(model).name,
69
+ model: resolveModelDefinition(model, this.models).name,
51
70
  operation,
52
71
  payload,
53
72
  meta
54
73
  };
55
74
  }
56
75
  async get(request) {
57
- const definition = resolveModelDefinition(request.model);
76
+ const definition = resolveModelDefinition(request.model, this.models);
58
77
  const payload = definition.storage === "content" ? await this.content.get({ ...request, model: definition.name }) : await this.database.get({ ...request, model: definition.name });
59
78
  return this.envelope(definition.name, "get", payload);
60
79
  }
@@ -65,33 +84,33 @@ class AgentSdk {
65
84
  }));
66
85
  }
67
86
  async search(request) {
68
- const definition = resolveModelDefinition(request.model);
87
+ const definition = resolveModelDefinition(request.model, this.models);
69
88
  const payload = definition.storage === "content" ? await this.content.search({ ...request, model: definition.name }) : await this.database.search({ ...request, model: definition.name });
70
89
  return this.envelope(definition.name, "search", payload, {
71
90
  count: Array.isArray(payload) ? payload.length : 0
72
91
  });
73
92
  }
74
93
  async follow(request) {
75
- const definition = resolveModelDefinition(request.model);
94
+ const definition = resolveModelDefinition(request.model, this.models);
76
95
  const payload = definition.storage === "content" ? await this.content.follow({ ...request, model: definition.name }) : await this.database.follow({ ...request, model: definition.name });
77
96
  return this.envelope(definition.name, "follow", payload, {
78
97
  count: payload.items.length
79
98
  });
80
99
  }
81
100
  async pick(request) {
82
- const definition = resolveModelDefinition(request.model);
101
+ const definition = resolveModelDefinition(request.model, this.models);
83
102
  const payload = definition.storage === "content" ? await this.content.pick({ ...request, model: definition.name }) : await this.database.pick({ ...request, model: definition.name });
84
103
  return this.envelope(definition.name, "pick", payload, {
85
104
  claimed: Boolean(payload.item)
86
105
  });
87
106
  }
88
107
  async create(request) {
89
- const definition = resolveModelDefinition(request.model);
108
+ const definition = resolveModelDefinition(request.model, this.models);
90
109
  const payload = definition.storage === "content" ? await this.content.create({ ...request, model: definition.name }) : await this.database.create({ ...request, model: definition.name });
91
110
  return this.envelope(definition.name, "create", payload);
92
111
  }
93
112
  async update(request) {
94
- const definition = resolveModelDefinition(request.model);
113
+ const definition = resolveModelDefinition(request.model, this.models);
95
114
  const payload = definition.storage === "content" ? await this.content.update({ ...request, model: definition.name }) : await this.database.update({ ...request, model: definition.name });
96
115
  return this.envelope(definition.name, "update", payload);
97
116
  }
@@ -129,6 +148,50 @@ class AgentSdk {
129
148
  const count = await this.database.releaseAllLeases();
130
149
  return this.envelope("content_lease", "update", { count });
131
150
  }
151
+ async startWorkDay(request) {
152
+ const payload = await this.database.startWorkDay(request);
153
+ return this.envelope("work_day", "create", payload);
154
+ }
155
+ async closeWorkDay(request) {
156
+ const payload = await this.database.closeWorkDay(request);
157
+ return this.envelope("work_day", "update", payload);
158
+ }
159
+ async createTask(request) {
160
+ const payload = await this.database.createTask(request);
161
+ return this.envelope("task", "create", payload);
162
+ }
163
+ async claimTask(request) {
164
+ const payload = await this.database.claimTask(request);
165
+ return this.envelope("task", "update", payload);
166
+ }
167
+ async recordTaskProgress(request) {
168
+ const payload = await this.database.recordTaskProgress(request);
169
+ return this.envelope("task", "update", payload);
170
+ }
171
+ async completeTask(request) {
172
+ const payload = await this.database.completeTask(request);
173
+ return this.envelope("task", "update", payload);
174
+ }
175
+ async failTask(request) {
176
+ const payload = await this.database.failTask(request);
177
+ return this.envelope("task", "update", payload);
178
+ }
179
+ async appendTaskEvent(request) {
180
+ const payload = await this.database.appendTaskEvent(request);
181
+ return this.envelope("task_event", "create", payload);
182
+ }
183
+ async searchTasks(request) {
184
+ const payload = await this.database.searchTasks(request);
185
+ return this.envelope("task", "search", payload, { count: payload.length });
186
+ }
187
+ async createReport(request) {
188
+ const payload = await this.database.createReport(request);
189
+ return this.envelope("report", "create", payload);
190
+ }
191
+ async getManagerContext(taskId) {
192
+ const payload = await this.database.getManagerContext(taskId);
193
+ return this.envelope("task", "get", payload);
194
+ }
132
195
  async listAgentSpecs(options) {
133
196
  const rawEntries = await this.listRawAgentSpecs(options);
134
197
  return rawEntries.map((entry) => normalizeAgentSpec(entry)).filter((entry) => Boolean(entry && entry.slug));
@@ -145,6 +208,70 @@ class AgentSdk {
145
208
  scopeForAgent(agent) {
146
209
  return new ScopedAgentSdk(this, agent.slug, agent.permissions);
147
210
  }
211
+ /** Advanced graph maintenance helper. Most application code should use parseGraphDsl() -> queryGraph() -> buildContextPack(). */
212
+ refreshGraph(request) {
213
+ return this.graph.refresh(request);
214
+ }
215
+ /** Advanced lexical graph primitive for file nodes. Prefer queryGraph() or buildContextPack() for AI-context retrieval. */
216
+ searchFiles(query, options) {
217
+ return this.graph.searchFiles(query, options);
218
+ }
219
+ /** Advanced lexical graph primitive for section nodes. Prefer queryGraph() or buildContextPack() for AI-context retrieval. */
220
+ searchSections(query, options) {
221
+ return this.graph.searchSections(query, options);
222
+ }
223
+ /** Advanced lexical graph primitive for entity nodes. Prefer queryGraph() or buildContextPack() for AI-context retrieval. */
224
+ searchEntities(query, options) {
225
+ return this.graph.searchEntities(query, options);
226
+ }
227
+ /** Advanced graph primitive that returns one raw graph node by id. */
228
+ getGraphNode(id) {
229
+ return this.graph.getNode(id);
230
+ }
231
+ /** Advanced graph primitive for direct neighborhood inspection. Prefer queryGraph() for ranked retrieval. */
232
+ getNeighbors(id, options) {
233
+ return this.graph.getNeighbors(id, options);
234
+ }
235
+ /** Advanced traversal primitive for direct reference walking. Prefer queryGraph() when you need ranking and ctx-aware behavior. */
236
+ followReferences(id, options) {
237
+ return this.graph.followReferences(id, options);
238
+ }
239
+ /** Advanced graph primitive for incoming-link inspection. */
240
+ getBacklinks(id, options) {
241
+ return this.graph.getBacklinks(id, options);
242
+ }
243
+ /** Advanced graph primitive for local relatedness. Prefer queryGraph() for the primary ranked graph workflow. */
244
+ getRelated(id, options) {
245
+ return this.graph.getRelated(id, options);
246
+ }
247
+ /** Advanced traversal primitive for raw subgraph extraction. Prefer buildContextPack() when you need prompt-ready output. */
248
+ getSubgraph(seedIds, options) {
249
+ return this.graph.getSubgraph(seedIds, options);
250
+ }
251
+ /** Primary graph workflow helper. Resolves roots before ranking and traversal. */
252
+ resolveSeeds(request) {
253
+ return this.graph.resolveSeeds(request);
254
+ }
255
+ /** Primary graph workflow entrypoint for ranked graph retrieval. */
256
+ queryGraph(request) {
257
+ return this.graph.queryGraph(request);
258
+ }
259
+ /** Primary graph workflow entrypoint for prompt-ready AI context assembly. */
260
+ buildContextPack(request) {
261
+ return this.graph.buildContextPack(request);
262
+ }
263
+ /** Primary graph workflow helper. Parses the public ctx DSL into a typed graph request. */
264
+ parseGraphDsl(source) {
265
+ return this.graph.parseGraphDsl(source);
266
+ }
267
+ /** Primary graph workflow helper for resolving ids, paths, and anchors into graph nodes. */
268
+ resolveReference(reference, options) {
269
+ return this.graph.resolveReference(reference, options);
270
+ }
271
+ /** Primary graph workflow helper for explaining why two nodes are connected. */
272
+ explainReferenceChain(fromId, toId) {
273
+ return this.graph.explainReferenceChain(fromId, toId);
274
+ }
148
275
  }
149
276
  class ScopedAgentSdk {
150
277
  constructor(base, actor, permissions) {
@@ -156,11 +283,26 @@ class ScopedAgentSdk {
156
283
  actor;
157
284
  permissions;
158
285
  assertAllowed(model, operation) {
159
- const normalized = resolveModelDefinition(model).name;
286
+ const normalized = resolveModelDefinition(model, this.base.models).name;
160
287
  if (!operationAllowed(this.permissions, normalized, operation)) {
161
288
  throw new Error(`Agent "${this.actor}" is not allowed to ${operation} ${normalized}.`);
162
289
  }
163
290
  }
291
+ allowedModelsFor(operation) {
292
+ return this.permissions.filter((permission) => permission.operations.map(normalizeOperation).includes(normalizeOperation(operation))).map((permission) => resolveModelDefinition(permission.model, this.base.models).name);
293
+ }
294
+ async assertGraphNodeAllowed(id, operation) {
295
+ const node = await this.base.getGraphNode(id);
296
+ if (!node?.sourceModel) {
297
+ return node;
298
+ }
299
+ const allowedOps = operation === "get" ? ["search", "follow"] : [operation];
300
+ const permitted = allowedOps.some((op) => this.allowedModelsFor(op).includes(node.sourceModel));
301
+ if (!permitted) {
302
+ throw new Error(`Agent "${this.actor}" is not allowed to ${operation} graph node ${id}.`);
303
+ }
304
+ return node;
305
+ }
164
306
  get(request) {
165
307
  this.assertAllowed(request.model, "get");
166
308
  return this.base.get(request);
@@ -225,6 +367,88 @@ class ScopedAgentSdk {
225
367
  releaseAllLeases() {
226
368
  return this.base.releaseAllLeases();
227
369
  }
370
+ refreshGraph(request) {
371
+ return this.base.refreshGraph(request);
372
+ }
373
+ /** Advanced lexical graph primitive for file nodes. Scoped to models the agent may search. */
374
+ searchFiles(query, options) {
375
+ const allowedModels = this.allowedModelsFor("search");
376
+ return this.base.searchFiles(query, { ...options, models: options?.models?.filter((model) => allowedModels.includes(model)) ?? allowedModels });
377
+ }
378
+ /** Advanced lexical graph primitive for section nodes. Scoped to models the agent may search. */
379
+ searchSections(query, options) {
380
+ const allowedModels = this.allowedModelsFor("search");
381
+ return this.base.searchSections(query, { ...options, models: options?.models?.filter((model) => allowedModels.includes(model)) ?? allowedModels });
382
+ }
383
+ /** Advanced lexical graph primitive for entity nodes. Scoped to models the agent may search. */
384
+ searchEntities(query, options) {
385
+ const allowedModels = this.allowedModelsFor("search");
386
+ return this.base.searchEntities(query, { ...options, models: options?.models?.filter((model) => allowedModels.includes(model)) ?? allowedModels });
387
+ }
388
+ async getGraphNode(id) {
389
+ return this.assertGraphNodeAllowed(id, "get");
390
+ }
391
+ async getNeighbors(id, options) {
392
+ await this.assertGraphNodeAllowed(id, "follow");
393
+ const allowedModels = this.allowedModelsFor("follow");
394
+ return this.base.getNeighbors(id, { ...options, models: options?.models?.filter((model) => allowedModels.includes(model)) ?? allowedModels });
395
+ }
396
+ async followReferences(id, options) {
397
+ await this.assertGraphNodeAllowed(id, "follow");
398
+ const allowedModels = this.allowedModelsFor("follow");
399
+ return this.base.followReferences(id, { ...options, models: options?.models?.filter((model) => allowedModels.includes(model)) ?? allowedModels });
400
+ }
401
+ async getBacklinks(id, options) {
402
+ await this.assertGraphNodeAllowed(id, "follow");
403
+ const allowedModels = this.allowedModelsFor("follow");
404
+ return this.base.getBacklinks(id, { ...options, models: options?.models?.filter((model) => allowedModels.includes(model)) ?? allowedModels });
405
+ }
406
+ async getRelated(id, options) {
407
+ await this.assertGraphNodeAllowed(id, "follow");
408
+ const allowedModels = this.allowedModelsFor("follow");
409
+ return this.base.getRelated(id, { ...options, models: options?.models?.filter((model) => allowedModels.includes(model)) ?? allowedModels });
410
+ }
411
+ getSubgraph(seedIds, options) {
412
+ const allowedModels = this.allowedModelsFor("follow");
413
+ return this.base.getSubgraph(seedIds, { ...options, models: options?.models?.filter((model) => allowedModels.includes(model)) ?? allowedModels });
414
+ }
415
+ /** Primary graph workflow helper, scoped to followable models. */
416
+ resolveSeeds(request) {
417
+ const allowedModels = this.allowedModelsFor("follow");
418
+ return this.base.resolveSeeds({
419
+ ...request,
420
+ options: { ...request.options, models: request.options?.models?.filter((model) => allowedModels.includes(model)) ?? allowedModels }
421
+ });
422
+ }
423
+ /** Primary graph workflow entrypoint for ranked graph retrieval, scoped to followable models. */
424
+ queryGraph(request) {
425
+ const allowedModels = this.allowedModelsFor("follow");
426
+ return this.base.queryGraph({
427
+ ...request,
428
+ options: { ...request.options, models: request.options?.models?.filter((model) => allowedModels.includes(model)) ?? allowedModels }
429
+ });
430
+ }
431
+ /** Primary graph workflow entrypoint for prompt-ready context assembly, scoped to followable models. */
432
+ buildContextPack(request) {
433
+ const allowedModels = this.allowedModelsFor("follow");
434
+ return this.base.buildContextPack({
435
+ ...request,
436
+ options: { ...request.options, models: request.options?.models?.filter((model) => allowedModels.includes(model)) ?? allowedModels }
437
+ });
438
+ }
439
+ parseGraphDsl(source) {
440
+ return this.base.parseGraphDsl(source);
441
+ }
442
+ resolveReference(reference, options) {
443
+ const allowedModels = this.allowedModelsFor("follow");
444
+ return this.base.resolveReference(reference, { ...options, models: options?.models?.filter((model) => allowedModels.includes(model)) ?? allowedModels });
445
+ }
446
+ explainReferenceChain(fromId, toId) {
447
+ return Promise.all([
448
+ this.assertGraphNodeAllowed(fromId, "follow"),
449
+ this.assertGraphNodeAllowed(toId, "follow")
450
+ ]).then(() => this.base.explainReferenceChain(fromId, toId));
451
+ }
228
452
  }
229
453
  export {
230
454
  AgentSdk,
@@ -1,3 +1,4 @@
1
+ import { assertExpectedVersion } from "../sdk-version.js";
1
2
  import { SqliteStoreBase, nowIso, toSqlValue } from "./helpers.js";
2
3
  import { createCursorEnvelope, cursorEntityFromEnvelope, TRESEED_ENVELOPE_SCHEMA_VERSION } from "./envelopes.js";
3
4
  function cursorFromRow(row) {
@@ -98,9 +99,14 @@ class CursorStore extends SqliteStoreBase {
98
99
  );
99
100
  }
100
101
  async update(request) {
101
- const agentSlug = String(request.data.agentSlug ?? request.id ?? request.key ?? "");
102
- const cursorKey = String(request.data.cursorKey ?? request.slug ?? "");
103
- const cursorValue = String(request.data.cursorValue ?? "");
102
+ const agentSlug = String(request.data.agent_slug ?? request.data.agentSlug ?? request.id ?? request.key ?? "");
103
+ const cursorKey = String(request.data.cursor_key ?? request.data.cursorKey ?? request.slug ?? "");
104
+ const cursorValue = String(request.data.cursor_value ?? request.data.cursorValue ?? "");
105
+ assertExpectedVersion(
106
+ request.expectedVersion,
107
+ await this.getByKey(`${agentSlug}:${cursorKey}`),
108
+ `agent_cursor "${agentSlug}:${cursorKey}"`
109
+ );
104
110
  await this.upsert({
105
111
  agentSlug,
106
112
  cursorKey,
@@ -1,4 +1,5 @@
1
1
  import crypto from "node:crypto";
2
+ import { assertExpectedVersion } from "../sdk-version.js";
2
3
  import { SqliteStoreBase, nowIso, toSqlValue } from "./helpers.js";
3
4
  import { createLeaseEnvelope, leaseEntityFromEnvelope, TRESEED_ENVELOPE_SCHEMA_VERSION } from "./envelopes.js";
4
5
  function leaseFromRow(row) {
@@ -117,9 +118,14 @@ class LeaseStore extends SqliteStoreBase {
117
118
  }
118
119
  async update(request) {
119
120
  const model = String(request.data.model ?? request.id ?? "");
120
- const itemKey = String(request.data.itemKey ?? request.slug ?? request.key ?? "");
121
- const claimedBy = String(request.data.claimedBy ?? request.actor);
121
+ const itemKey = String(request.data.item_key ?? request.data.itemKey ?? request.slug ?? request.key ?? "");
122
+ const claimedBy = String(request.data.claimed_by ?? request.data.claimedBy ?? request.actor);
122
123
  const leaseSeconds = Number(request.data.leaseSeconds ?? 300);
124
+ assertExpectedVersion(
125
+ request.expectedVersion,
126
+ await this.getByKey(`${model}:${itemKey}`),
127
+ `content_lease "${model}:${itemKey}"`
128
+ );
123
129
  return this.create({ model, itemKey, claimedBy, leaseSeconds });
124
130
  }
125
131
  async releaseAll() {