@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.
- package/README.md +97 -506
- package/dist/{src/cli-tools.d.ts → cli-tools.d.ts} +1 -1
- package/dist/cli-tools.js +5 -3
- package/dist/{src/content-store.d.ts → content-store.d.ts} +3 -2
- package/dist/content-store.js +52 -20
- package/dist/{src/d1-store.d.ts → d1-store.d.ts} +62 -1
- package/dist/d1-store.js +625 -65
- package/dist/field-aliases.d.ts +11 -0
- package/dist/field-aliases.js +41 -0
- package/dist/graph/build.d.ts +19 -0
- package/dist/graph/build.js +949 -0
- package/dist/graph/dsl.d.ts +2 -0
- package/dist/graph/dsl.js +243 -0
- package/dist/graph/query.d.ts +47 -0
- package/dist/graph/query.js +447 -0
- package/dist/graph/ranking.d.ts +3 -0
- package/dist/graph/ranking.js +483 -0
- package/dist/graph/schema.d.ts +142 -0
- package/dist/graph/schema.js +133 -0
- package/dist/graph.d.ts +52 -0
- package/dist/graph.js +133 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +91 -2
- package/dist/model-registry.d.ts +8 -0
- package/dist/model-registry.js +351 -25
- package/dist/operations/providers/default.d.ts +10 -0
- package/dist/operations/providers/default.js +514 -0
- package/dist/operations/runtime.d.ts +7 -0
- package/dist/operations/runtime.js +60 -0
- package/dist/operations/services/config-runtime.d.ts +269 -0
- package/dist/operations/services/config-runtime.js +1397 -0
- package/dist/operations/services/d1-migration.d.ts +6 -0
- package/dist/operations/services/d1-migration.js +89 -0
- package/dist/operations/services/deploy.d.ts +371 -0
- package/dist/operations/services/deploy.js +981 -0
- package/dist/operations/services/git-workflow.d.ts +49 -0
- package/dist/operations/services/git-workflow.js +218 -0
- package/dist/operations/services/github-automation.d.ts +156 -0
- package/dist/operations/services/github-automation.js +256 -0
- package/dist/operations/services/local-dev.d.ts +9 -0
- package/dist/operations/services/local-dev.js +106 -0
- package/dist/operations/services/mailpit-runtime.d.ts +4 -0
- package/dist/operations/services/mailpit-runtime.js +59 -0
- package/dist/operations/services/railway-deploy.d.ts +53 -0
- package/dist/operations/services/railway-deploy.js +123 -0
- package/dist/operations/services/runtime-paths.d.ts +19 -0
- package/dist/operations/services/runtime-paths.js +54 -0
- package/dist/operations/services/runtime-tools.d.ts +117 -0
- package/dist/operations/services/runtime-tools.js +358 -0
- package/dist/operations/services/save-deploy-preflight.d.ts +34 -0
- package/dist/operations/services/save-deploy-preflight.js +76 -0
- package/dist/operations/services/template-registry.d.ts +88 -0
- package/dist/operations/services/template-registry.js +407 -0
- package/dist/operations/services/watch-dev.d.ts +21 -0
- package/dist/operations/services/watch-dev.js +284 -0
- package/dist/operations/services/workspace-preflight.d.ts +40 -0
- package/dist/operations/services/workspace-preflight.js +165 -0
- package/dist/operations/services/workspace-save.d.ts +42 -0
- package/dist/operations/services/workspace-save.js +235 -0
- package/dist/operations/services/workspace-tools.d.ts +16 -0
- package/dist/operations/services/workspace-tools.js +270 -0
- package/dist/operations-registry.d.ts +5 -0
- package/dist/operations-registry.js +68 -0
- package/dist/operations-types.d.ts +71 -0
- package/dist/operations-types.js +17 -0
- package/dist/operations.d.ts +6 -0
- package/dist/operations.js +16 -0
- package/dist/platform/books-data.d.ts +1 -0
- package/dist/platform/books-data.js +1 -0
- package/dist/platform/contracts.d.ts +158 -0
- package/dist/platform/contracts.js +0 -0
- package/dist/platform/deploy/config.d.ts +4 -0
- package/dist/platform/deploy/config.js +222 -0
- package/dist/platform/deploy-config.d.ts +1 -0
- package/dist/platform/deploy-config.js +1 -0
- package/dist/platform/deploy-runtime.d.ts +18 -0
- package/dist/platform/deploy-runtime.js +78 -0
- package/dist/platform/env.yaml +394 -0
- package/dist/platform/environment.d.ts +130 -0
- package/dist/platform/environment.js +331 -0
- package/dist/platform/plugin.d.ts +2 -0
- package/dist/platform/plugin.js +4 -0
- package/dist/platform/plugins/constants.d.ts +22 -0
- package/dist/platform/plugins/constants.js +29 -0
- package/dist/platform/plugins/plugin.d.ts +51 -0
- package/dist/platform/plugins/plugin.js +6 -0
- package/dist/platform/plugins/runtime.d.ts +35 -0
- package/dist/platform/plugins/runtime.js +161 -0
- package/dist/platform/plugins.d.ts +6 -0
- package/dist/platform/plugins.js +38 -0
- package/dist/platform/site-config-schema.js +1 -0
- package/dist/platform/tenant/config.d.ts +9 -0
- package/dist/platform/tenant/config.js +154 -0
- package/dist/platform/tenant/runtime-config.d.ts +4 -0
- package/dist/platform/tenant/runtime-config.js +20 -0
- package/dist/platform/tenant-config.d.ts +1 -0
- package/dist/platform/tenant-config.js +1 -0
- package/dist/platform/utils/books-data.d.ts +29 -0
- package/dist/platform/utils/books-data.js +82 -0
- package/dist/platform/utils/site-config-schema.js +321 -0
- package/dist/remote.d.ts +175 -0
- package/dist/remote.js +202 -0
- package/dist/runtime.js +35 -22
- package/dist/scripts/aggregate-book.js +121 -0
- package/dist/scripts/build-dist.js +54 -13
- package/dist/scripts/build-tenant-worker.js +36 -0
- package/dist/scripts/cleanup-markdown.js +373 -0
- package/dist/scripts/cli-test-fixtures.js +48 -0
- package/dist/scripts/config-treeseed.js +95 -0
- package/dist/scripts/ensure-mailpit.js +29 -0
- package/dist/scripts/local-dev.js +129 -0
- package/dist/scripts/logs-mailpit.js +2 -0
- package/dist/scripts/patch-starlight-content-path.js +172 -0
- package/dist/scripts/release-verify.js +34 -6
- package/dist/scripts/run-fixture-astro-command.js +18 -0
- package/dist/scripts/scaffold-site.js +65 -0
- package/dist/scripts/stop-mailpit.js +5 -0
- package/dist/scripts/sync-dev-vars.js +6 -0
- package/dist/scripts/sync-template.js +20 -0
- package/dist/scripts/template-catalog.test.js +100 -0
- package/dist/scripts/template-command.js +31 -0
- package/dist/scripts/tenant-astro-command.js +3 -0
- package/dist/scripts/tenant-build.js +16 -0
- package/dist/scripts/tenant-check.js +7 -0
- package/dist/scripts/tenant-d1-migrate-local.js +11 -0
- package/dist/scripts/tenant-deploy.js +180 -0
- package/dist/scripts/tenant-destroy.js +104 -0
- package/dist/scripts/tenant-dev.js +171 -0
- package/dist/scripts/tenant-lint.js +4 -0
- package/dist/scripts/tenant-test.js +4 -0
- package/dist/scripts/test-cloudflare-local.js +212 -0
- package/dist/scripts/test-scaffold.js +314 -0
- package/dist/scripts/test-smoke.js +71 -13
- package/dist/scripts/treeseed-assert-release-tag-version.js +21 -0
- package/dist/scripts/treeseed-build-dist.js +134 -0
- package/dist/scripts/treeseed-publish-package.js +19 -0
- package/dist/scripts/treeseed-release-verify.js +131 -0
- package/dist/scripts/treeseed-run-ts.js +45 -0
- package/dist/scripts/validate-templates.js +6 -0
- package/dist/scripts/verify-driver.js +29 -0
- package/dist/scripts/workflow-commands.test.js +39 -0
- package/dist/scripts/workspace-close.js +24 -0
- package/dist/scripts/workspace-command-e2e.js +718 -0
- package/dist/scripts/workspace-lint.js +9 -0
- package/dist/scripts/workspace-preflight.js +22 -0
- package/dist/scripts/workspace-publish-changed-packages.js +16 -0
- package/dist/scripts/workspace-release-verify.js +81 -0
- package/dist/scripts/workspace-release.js +42 -0
- package/dist/scripts/workspace-save.js +124 -0
- package/dist/scripts/workspace-start-warning.js +3 -0
- package/dist/scripts/workspace-start.js +71 -0
- package/dist/scripts/workspace-test-unit.js +4 -0
- package/dist/scripts/workspace-test.js +11 -0
- package/dist/sdk-fields.d.ts +11 -0
- package/dist/sdk-fields.js +169 -0
- package/dist/sdk-filters.d.ts +4 -0
- package/dist/sdk-filters.js +12 -15
- package/dist/sdk-types.d.ts +796 -0
- package/dist/sdk-types.js +7 -1
- package/dist/sdk-version.d.ts +2 -0
- package/dist/sdk-version.js +42 -0
- package/dist/sdk.d.ts +215 -0
- package/dist/sdk.js +235 -11
- package/dist/stores/cursor-store.js +9 -3
- package/dist/stores/lease-store.js +8 -2
- package/dist/{src/stores → stores}/message-store.d.ts +1 -1
- package/dist/stores/message-store.js +27 -3
- package/dist/stores/operational-store.d.ts +24 -0
- package/dist/stores/operational-store.js +279 -0
- package/dist/stores/run-store.js +8 -1
- package/dist/stores/subscription-store.js +7 -5
- package/dist/template-catalog.d.ts +13 -0
- package/dist/template-catalog.js +141 -0
- package/dist/treeseed/services/compose.yml +7 -0
- package/dist/treeseed/template-catalog/catalog.fixture.json +55 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/astro.config.d.ts +2 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/astro.config.ts +3 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/package.json +32 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/src/config.yaml +40 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content/empty/.gitkeep +1 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content/knowledge/handbook/index.mdx +11 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content/pages/welcome.mdx +11 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content.config.d.ts +1 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/src/content.config.ts +3 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/src/env.yaml +1 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/src/manifest.yaml +19 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/treeseed.site.yaml +26 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template/tsconfig.json +9 -0
- package/dist/treeseed/template-catalog/templates/starter-basic/template.config.json +90 -0
- package/dist/utils/agents/contracts/messages.d.ts +88 -0
- package/dist/utils/agents/contracts/messages.js +138 -0
- package/dist/utils/agents/contracts/run.d.ts +20 -0
- package/dist/utils/agents/contracts/run.js +0 -0
- package/dist/utils/agents/runtime-types.d.ts +117 -0
- package/dist/utils/agents/runtime-types.js +4 -0
- package/dist/verification.d.ts +20 -0
- package/dist/verification.js +98 -0
- package/dist/workflow/operations.d.ts +396 -0
- package/dist/workflow/operations.js +841 -0
- package/dist/workflow-state.d.ts +56 -0
- package/dist/workflow-state.js +195 -0
- package/dist/workflow-support.d.ts +9 -0
- package/dist/workflow-support.js +176 -0
- package/dist/workflow.d.ts +111 -0
- package/dist/workflow.js +97 -0
- package/package.json +111 -5
- package/scripts/verify-driver.mjs +29 -0
- package/dist/scripts/.ts-run-1775630384291-crtqr3izsa.js +0 -22
- package/dist/scripts/.ts-run-1775630388025-vnjle0z75a.js +0 -129
- package/dist/scripts/assert-release-tag-version.d.ts +0 -1
- package/dist/scripts/build-dist.d.ts +0 -1
- package/dist/scripts/fixture-tools.d.ts +0 -5
- package/dist/scripts/package-tools.d.ts +0 -15
- package/dist/scripts/publish-package.d.ts +0 -1
- package/dist/scripts/release-verify.d.ts +0 -1
- package/dist/scripts/test-smoke.d.ts +0 -1
- package/dist/src/index.d.ts +0 -6
- package/dist/src/model-registry.d.ts +0 -4
- package/dist/src/sdk-filters.d.ts +0 -4
- package/dist/src/sdk-types.d.ts +0 -285
- package/dist/src/sdk.d.ts +0 -109
- package/dist/test/test-fixture.d.ts +0 -1
- package/dist/test/utils/envelopes.test.d.ts +0 -1
- package/dist/test/utils/sdk.test.d.ts +0 -1
- package/dist/vitest.config.d.ts +0 -2
- /package/dist/{src/frontmatter.d.ts → frontmatter.d.ts} +0 -0
- /package/dist/{src/git-runtime.d.ts → git-runtime.d.ts} +0 -0
- /package/dist/{src/runtime.d.ts → runtime.d.ts} +0 -0
- /package/dist/{src/stores → stores}/cursor-store.d.ts +0 -0
- /package/dist/{src/stores → stores}/envelopes.d.ts +0 -0
- /package/dist/{src/stores → stores}/helpers.d.ts +0 -0
- /package/dist/{src/stores → stores}/lease-store.d.ts +0 -0
- /package/dist/{src/stores → stores}/run-store.d.ts +0 -0
- /package/dist/{src/stores → stores}/subscription-store.d.ts +0 -0
- /package/dist/{src/types → types}/agents.d.ts +0 -0
- /package/dist/{src/types → types}/cloudflare.d.ts +0 -0
- /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,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 {
|
|
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() {
|