@a5c-ai/kradle 5.0.1-staging.3abdf9534c25
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/Dockerfile +31 -0
- package/README.md +187 -0
- package/bin/kradle-demo.mjs +23 -0
- package/bin/kradle-server.mjs +14 -0
- package/dist/kradle-controller-ui.json +3482 -0
- package/dist/kradle-lifecycle.json +201 -0
- package/dist/kradle-runtime-snapshot.json +3125 -0
- package/dist/kradle-summary.json +724 -0
- package/docs/README.md +61 -0
- package/docs/agents/README.md +83 -0
- package/docs/agents/acceptance-test-matrix.md +193 -0
- package/docs/agents/agent-mux-adapter-contract.md +167 -0
- package/docs/agents/agent-mux-source-map.md +310 -0
- package/docs/agents/agent-run-memory-import-spec.md +256 -0
- package/docs/agents/agent-stack-management-spec.md +421 -0
- package/docs/agents/api-contract-spec.md +309 -0
- package/docs/agents/artifacts-writeback-spec.md +145 -0
- package/docs/agents/chart-packaging-spec.md +128 -0
- package/docs/agents/ci-orchestration-spec.md +140 -0
- package/docs/agents/context-assembly-spec.md +219 -0
- package/docs/agents/controller-reconciliation-spec.md +255 -0
- package/docs/agents/crd-schema-spec.md +315 -0
- package/docs/agents/decision-log-open-questions.md +169 -0
- package/docs/agents/developer-implementation-checklist.md +329 -0
- package/docs/agents/dispatching-design.md +262 -0
- package/docs/agents/gaps-agent-mux-to-kradle-crds.md +298 -0
- package/docs/agents/glossary.md +66 -0
- package/docs/agents/implementation-blueprint.md +324 -0
- package/docs/agents/implementation-rollout-slices.md +251 -0
- package/docs/agents/memory-context-integration-spec.md +194 -0
- package/docs/agents/memory-ontology-schema-spec.md +253 -0
- package/docs/agents/memory-operations-runbook.md +121 -0
- package/docs/agents/mvp-vertical-slice-spec.md +146 -0
- package/docs/agents/observability-audit-spec.md +265 -0
- package/docs/agents/operator-runbook.md +174 -0
- package/docs/agents/org-memory-api-payload-examples.md +333 -0
- package/docs/agents/org-memory-controller-sequence-spec.md +181 -0
- package/docs/agents/org-memory-e2e-fixture-plan.md +161 -0
- package/docs/agents/org-memory-ui-implementation-map.md +114 -0
- package/docs/agents/org-memory-vertical-slice-spec.md +168 -0
- package/docs/agents/org-resource-model-delta-spec.md +111 -0
- package/docs/agents/org-route-resource-model-spec.md +183 -0
- package/docs/agents/org-scoping-namespace-spec.md +114 -0
- package/docs/agents/rbac-secrets-management-spec.md +406 -0
- package/docs/agents/repository-page-integration-spec.md +255 -0
- package/docs/agents/resource-contract-examples.md +808 -0
- package/docs/agents/resource-relationship-map.md +190 -0
- package/docs/agents/security-threat-model.md +188 -0
- package/docs/agents/shared-memory-company-brain-spec.md +358 -0
- package/docs/agents/storage-migration-spec.md +168 -0
- package/docs/agents/subagent-orchestration-spec.md +152 -0
- package/docs/agents/system-overview.md +88 -0
- package/docs/agents/tools-mcp-skills-spec.md +189 -0
- package/docs/agents/traceability-matrix.md +79 -0
- package/docs/agents/ui-flow-spec.md +211 -0
- package/docs/agents/ui-ux-system-spec.md +426 -0
- package/docs/agents/workspace-lifecycle-spec.md +166 -0
- package/docs/architecture-spec.md +78 -0
- package/docs/architecture-v2.md +2759 -0
- package/docs/components/control-plane.md +78 -0
- package/docs/components/data-plane.md +69 -0
- package/docs/components/hooks-events.md +67 -0
- package/docs/components/identity-rbac-policy.md +73 -0
- package/docs/components/kubevela-oam.md +70 -0
- package/docs/components/operations-publishing.md +81 -0
- package/docs/components/runners-ci.md +66 -0
- package/docs/components/web-ui.md +94 -0
- package/docs/crd-behaviors-and-relationships.md +3926 -0
- package/docs/external/README.md +47 -0
- package/docs/external/bidirectional-sync-design.md +134 -0
- package/docs/external/cicd-interface.md +64 -0
- package/docs/external/external-backend-controllers.md +170 -0
- package/docs/external/external-backend-crds.md +234 -0
- package/docs/external/external-backend-ui-spec.md +151 -0
- package/docs/external/external-backend-ux-flows.md +115 -0
- package/docs/external/external-object-mapping.md +125 -0
- package/docs/external/git-forge-interface.md +68 -0
- package/docs/external/github-integration-design.md +151 -0
- package/docs/external/issue-tracking-interface.md +66 -0
- package/docs/external/provider-capability-manifests.md +204 -0
- package/docs/external/provider-catalog.md +139 -0
- package/docs/external/provider-rollout-testing.md +78 -0
- package/docs/external/research-results.md +48 -0
- package/docs/external/security-auth-permissions.md +81 -0
- package/docs/external/sync-state-machines.md +108 -0
- package/docs/external/unified-external-backend-model.md +107 -0
- package/docs/external/user-facing-changes.md +67 -0
- package/docs/gaps.md +161 -0
- package/docs/install.md +94 -0
- package/docs/integration-and-design-decisions.md +1530 -0
- package/docs/kradle-design.md +334 -0
- package/docs/local-minikube.md +55 -0
- package/docs/ontology/README.md +32 -0
- package/docs/ontology/bounded-contexts.md +29 -0
- package/docs/ontology/events-and-hooks.md +32 -0
- package/docs/ontology/oam-kubevela.md +32 -0
- package/docs/ontology/operations-and-release.md +25 -0
- package/docs/ontology/personas-and-actors.md +32 -0
- package/docs/ontology/policies-and-invariants.md +33 -0
- package/docs/ontology/problem-space.md +30 -0
- package/docs/ontology/resource-contracts.md +40 -0
- package/docs/ontology/resource-taxonomy.md +42 -0
- package/docs/ontology/runners-and-ci.md +29 -0
- package/docs/ontology/solution-space.md +24 -0
- package/docs/ontology/storage-and-data-boundaries.md +29 -0
- package/docs/ontology/validation-matrix.md +24 -0
- package/docs/ontology/web-ui-excellent-flows.md +32 -0
- package/docs/ontology/workflows.md +39 -0
- package/docs/ontology/world.md +35 -0
- package/docs/openapi.yaml +1291 -0
- package/docs/product-requirements.md +62 -0
- package/docs/requirements-v2.md +235 -0
- package/docs/roadmap-mvp.md +87 -0
- package/docs/sdk-api-reference.md +1108 -0
- package/docs/system-requirements.md +90 -0
- package/docs/system-spec-v2.md +1230 -0
- package/docs/tests/README.md +53 -0
- package/docs/tests/agent-qa-plan.md +63 -0
- package/docs/tests/browser-ui-tests.md +62 -0
- package/docs/tests/ci-quality-gates.md +48 -0
- package/docs/tests/coverage-model.md +64 -0
- package/docs/tests/e2e-scenario-tests.md +53 -0
- package/docs/tests/fixtures-test-data.md +63 -0
- package/docs/tests/observability-reliability-tests.md +54 -0
- package/docs/tests/product-test-matrix.md +145 -0
- package/docs/tests/qa-adoption-roadmap.md +130 -0
- package/docs/tests/qa-automation-plan.md +101 -0
- package/docs/tests/security-compliance-tests.md +57 -0
- package/docs/tests/test-framework-tools.md +88 -0
- package/docs/tests/test-suite-layout.md +121 -0
- package/docs/tests/unit-integration-tests.md +48 -0
- package/docs/todo-kyverno +714 -0
- package/docs/todos.md +4 -0
- package/docs/user-stories.md +78 -0
- package/docs/web-console-spec.md +533 -0
- package/examples/minikube-demo.yaml +190 -0
- package/examples/oam-application.yaml +23 -0
- package/examples/policy-kyverno-pr-title.yaml +18 -0
- package/package.json +66 -0
- package/scripts/build.mjs +29 -0
- package/scripts/setup-minikube.mjs +65 -0
- package/scripts/smoke.mjs +37 -0
- package/scripts/validate-doc-coverage.mjs +152 -0
- package/scripts/validate-package.mjs +95 -0
- package/scripts/validate-ui.mjs +305 -0
- package/src/agent-adapter-controller.js +169 -0
- package/src/agent-approval-controller.js +170 -0
- package/src/agent-context-bundles.js +242 -0
- package/src/agent-dispatch-controller.js +549 -0
- package/src/agent-gateway-config-controller.js +147 -0
- package/src/agent-identity-migration.js +115 -0
- package/src/agent-memory-controller.js +357 -0
- package/src/agent-memory-import.js +327 -0
- package/src/agent-memory-query.js +292 -0
- package/src/agent-memory-repository-source-controller.js +255 -0
- package/src/agent-mux-client.js +589 -0
- package/src/agent-permission-review.js +250 -0
- package/src/agent-persona-controller.js +135 -0
- package/src/agent-project-controller.js +117 -0
- package/src/agent-prompt-composition.js +55 -0
- package/src/agent-provider-config-controller.js +151 -0
- package/src/agent-secret-config-grant-controller.js +282 -0
- package/src/agent-session-transcript-controller.js +189 -0
- package/src/agent-stack-controller.js +421 -0
- package/src/agent-subagent-controller.js +160 -0
- package/src/agent-transport-binding-controller.js +121 -0
- package/src/agent-trigger-controller.js +387 -0
- package/src/agent-workspace-controller.js +702 -0
- package/src/agent-writeback-controller.js +302 -0
- package/src/api-controller.js +621 -0
- package/src/argocd-gitops.js +43 -0
- package/src/artifact-registry-controller.js +542 -0
- package/src/assistant-runtime.js +284 -0
- package/src/async-controller.js +207 -0
- package/src/audit-controller.js +191 -0
- package/src/auth.js +310 -0
- package/src/component-catalog.js +41 -0
- package/src/control-plane.js +136 -0
- package/src/controller-client.js +112 -0
- package/src/controller-ui.js +620 -0
- package/src/data-plane.js +179 -0
- package/src/event-bus.js +397 -0
- package/src/external/conflict-controller.js +225 -0
- package/src/external/github/auth.js +96 -0
- package/src/external/github/cicd.js +180 -0
- package/src/external/github/git-forge.js +240 -0
- package/src/external/github/index.js +144 -0
- package/src/external/github/issue-tracking.js +163 -0
- package/src/external/provider-adapter.js +161 -0
- package/src/external/provider-resource-factory.js +221 -0
- package/src/external/sync-controller.js +235 -0
- package/src/external/webhook-controller.js +144 -0
- package/src/external/write-controller.js +283 -0
- package/src/gitea-backend.js +131 -0
- package/src/gitea-service.js +173 -0
- package/src/handoff.js +98 -0
- package/src/health-probes.js +134 -0
- package/src/hooks-events.js +63 -0
- package/src/hooks-lifecycle.js +117 -0
- package/src/http-server.js +409 -0
- package/src/identity-policy.js +86 -0
- package/src/index.js +71 -0
- package/src/jitsi-agent-bridge.js +141 -0
- package/src/jitsi-meeting-controller.js +291 -0
- package/src/jitsi-sync-controller.js +198 -0
- package/src/kradle-inference-service-controller.js +246 -0
- package/src/kubernetes-controller-async.js +531 -0
- package/src/kubernetes-controller.js +904 -0
- package/src/kubernetes-resource-gateway.js +48 -0
- package/src/model-route-controller.js +364 -0
- package/src/notification-controller.js +178 -0
- package/src/operations.js +112 -0
- package/src/org-scoping.js +5 -0
- package/src/resource-model.js +282 -0
- package/src/runner-controller.js +272 -0
- package/src/runners-ci.js +48 -0
- package/src/runtime.js +196 -0
- package/src/snapshot-cache.js +157 -0
- package/src/virtual-model-controller.js +538 -0
- package/src/virtual-model-hook-bridge.js +200 -0
- package/src/web-ui.js +40 -0
- package/tests/agent-adapter-controller.test.js +361 -0
- package/tests/agent-approval-controller.test.js +173 -0
- package/tests/agent-context-bundles.test.js +278 -0
- package/tests/agent-dispatch-controller.test.js +679 -0
- package/tests/agent-gateway-config-controller.test.js +386 -0
- package/tests/agent-identity-migration.test.js +87 -0
- package/tests/agent-memory-controller.test.js +461 -0
- package/tests/agent-memory-import-snapshot.test.js +477 -0
- package/tests/agent-memory-query.test.js +404 -0
- package/tests/agent-memory-repository-source.test.js +514 -0
- package/tests/agent-mux-client.test.js +389 -0
- package/tests/agent-mux-integration.test.js +971 -0
- package/tests/agent-permission-review-v2.test.js +317 -0
- package/tests/agent-permission-review.test.js +209 -0
- package/tests/agent-persona-controller.test.js +127 -0
- package/tests/agent-project-controller.test.js +302 -0
- package/tests/agent-prompt-composition.test.js +76 -0
- package/tests/agent-provider-config-controller.test.js +376 -0
- package/tests/agent-resources.test.js +303 -0
- package/tests/agent-secret-config-grant.test.js +231 -0
- package/tests/agent-session-transcript-controller.test.js +499 -0
- package/tests/agent-stack-controller.test.js +283 -0
- package/tests/agent-subagent-controller.test.js +201 -0
- package/tests/agent-transport-binding-controller.test.js +294 -0
- package/tests/agent-trigger-controller.test.js +271 -0
- package/tests/agent-trigger-routes.test.js +190 -0
- package/tests/agent-trigger-sources.test.js +245 -0
- package/tests/agent-workspace-controller.test.js +181 -0
- package/tests/agent-writeback.test.js +292 -0
- package/tests/approval-persistence.test.js +171 -0
- package/tests/artifact-registry.test.js +511 -0
- package/tests/assistant-runtime.test.js +506 -0
- package/tests/async-controller.test.js +252 -0
- package/tests/audit-controller.test.js +227 -0
- package/tests/codespace-controller.test.js +318 -0
- package/tests/controller-client.test.js +133 -0
- package/tests/deployment.test.js +527 -0
- package/tests/e2e/lifecycle.test.js +120 -0
- package/tests/event-bus-integration.test.js +355 -0
- package/tests/external-github-forge.test.js +560 -0
- package/tests/external-github-issues-cicd.test.js +520 -0
- package/tests/external-integration.test.js +470 -0
- package/tests/external-persistence.test.js +415 -0
- package/tests/external-provider-adapter.test.js +365 -0
- package/tests/external-resource-model.test.js +223 -0
- package/tests/external-webhook-sync.test.js +287 -0
- package/tests/external-write-conflict.test.js +353 -0
- package/tests/gitea-service.test.js +253 -0
- package/tests/health-check-real.test.js +165 -0
- package/tests/health-probes.test.js +90 -0
- package/tests/hooks-lifecycle.test.js +364 -0
- package/tests/integration/full-flow.test.js +266 -0
- package/tests/jitsi-agent-bridge.test.js +119 -0
- package/tests/jitsi-helm-integration.test.js +77 -0
- package/tests/jitsi-meeting-controller.test.js +170 -0
- package/tests/jitsi-resource-model.test.js +73 -0
- package/tests/jitsi-sync-controller.test.js +112 -0
- package/tests/kradle-inference-service.test.js +689 -0
- package/tests/kradle.test.js +779 -0
- package/tests/memory-search-wiring.test.js +270 -0
- package/tests/model-route-controller.test.js +733 -0
- package/tests/notification-controller.test.js +196 -0
- package/tests/notification-integration.test.js +179 -0
- package/tests/org-scoping.test.js +687 -0
- package/tests/runner-controller.test.js +327 -0
- package/tests/runner-integration.test.js +231 -0
- package/tests/session-cookie-hmac.test.js +151 -0
- package/tests/snapshot-performance.test.js +315 -0
- package/tests/sse-events.test.js +107 -0
- package/tests/virtual-model-controller.test.js +877 -0
- package/tests/virtual-model-hook-bridge.test.js +384 -0
- package/tests/webhook-trigger.test.js +198 -0
- package/tests/workspace-volumes.test.js +312 -0
- package/tests/writeback-persistence.test.js +207 -0
|
@@ -0,0 +1,1108 @@
|
|
|
1
|
+
# Kradle SDK API Reference
|
|
2
|
+
|
|
3
|
+
> Exhaustive API reference for `@a5c-ai/kradle-sdk`.
|
|
4
|
+
> Source: `packages/kradle/sdk/src/index.js` — 65+ re-exports from core.
|
|
5
|
+
> All functions are pure ESM exports with zero external dependencies.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Resource Model
|
|
10
|
+
|
|
11
|
+
Source: `packages/kradle/core/src/resource-model.js`
|
|
12
|
+
|
|
13
|
+
### CONFIG_KINDS
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
import { CONFIG_KINDS } from '@a5c-ai/kradle-sdk';
|
|
17
|
+
// Type: Set<string>
|
|
18
|
+
// Size: 44 kind names stored in etcd via Kubernetes CRDs
|
|
19
|
+
// Includes: Organization, User, Team, Repository, AgentStack, KradleWorkspace, etc.
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### AGGREGATED_KINDS
|
|
23
|
+
|
|
24
|
+
```javascript
|
|
25
|
+
import { AGGREGATED_KINDS } from '@a5c-ai/kradle-sdk';
|
|
26
|
+
// Type: Set<string>
|
|
27
|
+
// Size: 32 kind names stored in PostgreSQL
|
|
28
|
+
// Includes: PullRequest, Issue, AgentDispatchRun, AgentSession, etc.
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### createResource(kind, metadata, spec, status)
|
|
32
|
+
|
|
33
|
+
Creates a well-formed Kradle resource object with validation.
|
|
34
|
+
|
|
35
|
+
```javascript
|
|
36
|
+
import { createResource } from '@a5c-ai/kradle-sdk';
|
|
37
|
+
|
|
38
|
+
const repo = createResource('Repository',
|
|
39
|
+
{ name: 'my-repo', namespace: 'kradle-org-acme' },
|
|
40
|
+
{ organizationRef: 'acme', visibility: 'private' },
|
|
41
|
+
{ phase: 'Ready' }
|
|
42
|
+
);
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Parameters:**
|
|
46
|
+
| Parameter | Type | Required | Default | Constraints |
|
|
47
|
+
|-----------|------|----------|---------|-------------|
|
|
48
|
+
| `kind` | `string` | Yes | — | Must be a key in ALL_KINDS (76 valid values) |
|
|
49
|
+
| `metadata` | `object` | Yes | — | Must contain `name` (non-empty string) |
|
|
50
|
+
| `spec` | `object` | No | `{}` | Deep-cloned via JSON.parse(JSON.stringify) |
|
|
51
|
+
| `status` | `object` | No | `{}` | Deep-cloned |
|
|
52
|
+
|
|
53
|
+
**Returns:** `{ apiVersion: 'kradle.a5c.ai/v1alpha1', kind, metadata: { namespace, labels: {}, annotations: {}, ...metadata }, spec, status }`
|
|
54
|
+
|
|
55
|
+
**Throws:**
|
|
56
|
+
- `Error('Unknown Kradle resource kind: X')` if kind not in ALL_KINDS
|
|
57
|
+
- `Error('X requires metadata.name')` if metadata.name is falsy
|
|
58
|
+
|
|
59
|
+
**Side Effects:** None (pure function)
|
|
60
|
+
|
|
61
|
+
### clone(value)
|
|
62
|
+
|
|
63
|
+
Deep clone via `JSON.parse(JSON.stringify(value))`. Returns `undefined` for `undefined` input.
|
|
64
|
+
|
|
65
|
+
```javascript
|
|
66
|
+
import { clone } from '@a5c-ai/kradle-sdk';
|
|
67
|
+
const copy = clone(resource); // Independent deep copy
|
|
68
|
+
clone(undefined); // Returns undefined
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### resourceToYaml(resource)
|
|
72
|
+
|
|
73
|
+
Serialize a resource object to YAML string format. Custom implementation (no dependencies).
|
|
74
|
+
|
|
75
|
+
```javascript
|
|
76
|
+
import { resourceToYaml } from '@a5c-ai/kradle-sdk';
|
|
77
|
+
const yaml = resourceToYaml(repo);
|
|
78
|
+
// apiVersion: kradle.a5c.ai/v1alpha1
|
|
79
|
+
// kind: Repository
|
|
80
|
+
// metadata:
|
|
81
|
+
// name: my-repo
|
|
82
|
+
// namespace: kradle-org-acme
|
|
83
|
+
// spec:
|
|
84
|
+
// organizationRef: acme
|
|
85
|
+
// visibility: private
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**Behavior:**
|
|
89
|
+
- Scalars: direct value (quotes added for `: ` or `{`/`[` prefixed strings)
|
|
90
|
+
- Objects: nested with 2-space indent
|
|
91
|
+
- Arrays: `- item` format; first key of object items on same line as `-`
|
|
92
|
+
- Returns string with trailing newline
|
|
93
|
+
|
|
94
|
+
### findResourceDefinition(kind)
|
|
95
|
+
|
|
96
|
+
Look up the full resource definition from `KRADLE_RESOURCES` array.
|
|
97
|
+
|
|
98
|
+
```javascript
|
|
99
|
+
import { findResourceDefinition } from '@a5c-ai/kradle-sdk';
|
|
100
|
+
const def = findResourceDefinition('Repository');
|
|
101
|
+
// { kind: 'Repository', plural: 'repositories', namespaced: true, storage: 'etcd' }
|
|
102
|
+
findResourceDefinition('repositories'); // Also works (matches on plural)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Throws:** `Error('Unsupported Kradle resource X')` if not found.
|
|
106
|
+
|
|
107
|
+
**Note:** This function searches the 75+ KRADLE_RESOURCES array (which includes KubeVela, Kyverno, and core K8s resources beyond the 76 Kradle-native kinds).
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## 2. API Controller
|
|
112
|
+
|
|
113
|
+
Source: `packages/kradle/core/src/api-controller.js`
|
|
114
|
+
|
|
115
|
+
### createKradleApiController(options?)
|
|
116
|
+
|
|
117
|
+
Creates the main API controller facade for resource operations.
|
|
118
|
+
|
|
119
|
+
```javascript
|
|
120
|
+
import { createKradleApiController } from '@a5c-ai/kradle-sdk';
|
|
121
|
+
|
|
122
|
+
const controller = createKradleApiController({
|
|
123
|
+
namespace: 'kradle-org-acme',
|
|
124
|
+
resourceGateway: customGateway, // optional
|
|
125
|
+
onAuditEvent: (event) => {} // optional callback
|
|
126
|
+
});
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Options:**
|
|
130
|
+
| Option | Type | Default | Description |
|
|
131
|
+
|--------|------|---------|-------------|
|
|
132
|
+
| `namespace` | `string` | `process.env.KRADLE_NAMESPACE` or `'kradle-system'` | Target K8s namespace |
|
|
133
|
+
| `resourceGateway` | `object` | `createKubernetesResourceGateway(options)` | Custom gateway |
|
|
134
|
+
| `onAuditEvent` | `function` | `null` | Callback for audit events |
|
|
135
|
+
|
|
136
|
+
**Methods:**
|
|
137
|
+
|
|
138
|
+
| Method | Signature | Returns | Side Effects |
|
|
139
|
+
|--------|-----------|---------|--------------|
|
|
140
|
+
| `snapshot()` | `() → Promise<object>` | Full snapshot with architecture | kubectl calls |
|
|
141
|
+
| `listResource(kind)` | `(string) → Promise<{items}>` | Resource list | kubectl get |
|
|
142
|
+
| `listResourceForOrg(org, kind)` | `(string, string) → Promise<{items}>` | Org-filtered list | kubectl get + filter |
|
|
143
|
+
| `getResource(kind, name)` | `(string, string) → Promise<object>` | Single resource | kubectl get |
|
|
144
|
+
| `applyResource(resource)` | `(object) → Promise<{operation, resource}>` | Apply result | kubectl apply, cache clear, event emit |
|
|
145
|
+
| `applyResourceForOrg(org, resource)` | `(string, object) → Promise<object>` | Scoped apply | kubectl apply, cross-org validation |
|
|
146
|
+
| `deleteResource(kind, name)` | `(string, string) → Promise<object>` | Delete result | kubectl delete, cache clear, event emit |
|
|
147
|
+
| `deleteResourceForOrg(org, kind, name)` | `(string, string, string) → Promise<object>` | Scoped delete | Cross-org validation, kubectl delete |
|
|
148
|
+
| `getResourceForOrg(org, kind, name)` | `(string, string, string) → Promise<object>` | Scoped get | Cross-org validation |
|
|
149
|
+
| `createRepository(input)` | `(object) → Promise<{repository, resource}>` | Repository summary | kubectl apply |
|
|
150
|
+
| `createOrganization(input)` | `(object) → Promise<{organization, namespace, binding}>` | Org + namespace + binding | kubectl apply x3 |
|
|
151
|
+
| `watchResource(path, handlers)` | `(string, object) → {child, command}` | Watch handle | kubectl spawn |
|
|
152
|
+
| `reviewAgentPermissions(input)` | `(object) → Promise<review>` | Permission review | snapshot + review |
|
|
153
|
+
| `dispatchAgent(input)` | `(object) → Promise<dispatch result>` | Dispatch run | Full dispatch flow |
|
|
154
|
+
| `approveAgentAction(input)` | `(object) → Promise<result>` | Approval decision | Snapshot + approve |
|
|
155
|
+
| `denyAgentAction(input)` | `(object) → Promise<result>` | Deny decision | Snapshot + deny |
|
|
156
|
+
| `processWebhookEvent(input)` | `(object) → Promise<{processed, dispatched}>` | Trigger results | Snapshot + trigger eval |
|
|
157
|
+
| `provisionAgentWorkspace(input)` | `(object) → Promise<workspace>` | Workspace | Workspace creation |
|
|
158
|
+
| `archiveAgentWorkspace(input)` | `(object) → Promise<result>` | Archived workspace | Snapshot + archive |
|
|
159
|
+
| `linkWorkItem(input)` | `(object) → Promise<link>` | Link resource | Link creation |
|
|
160
|
+
| `queryAgentMemory(input)` | `(object) → Promise<results>` | Query results | Memory query |
|
|
161
|
+
| `syncExternalBinding(name, opts)` | `(string, object) → Promise<{resource, bindingName}>` | Sync result | Upsert + watermark |
|
|
162
|
+
| `resolveExternalConflict(opts)` | `(object) → Promise<result>` | Resolution | Conflict resolve |
|
|
163
|
+
| `approveExternalWriteIntent(opts)` | `(object) → Promise<result>` | Approval | Intent approve |
|
|
164
|
+
| `cancelExternalWriteIntent(opts)` | `(object) → Promise<result>` | Cancellation | Intent reject |
|
|
165
|
+
| `processExternalWebhook(params)` | `(object) → Promise<result>` | Delivery result | HMAC verify + process |
|
|
166
|
+
|
|
167
|
+
**Cross-org admission (in `applyResource`):**
|
|
168
|
+
```javascript
|
|
169
|
+
// If resource.spec.organizationRef is set and metadata.namespace doesn't match
|
|
170
|
+
// orgNamespaceName(organizationRef), throws:
|
|
171
|
+
// Error('Cross-org namespace mismatch: resource organizationRef "X" expects namespace "Y" but got "Z"')
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 3. UI Model
|
|
177
|
+
|
|
178
|
+
Source: `packages/kradle/core/src/controller-ui.js`
|
|
179
|
+
|
|
180
|
+
### createControllerUiModel(snapshot, options?)
|
|
181
|
+
|
|
182
|
+
Transforms a raw snapshot into the structured UI model consumed by all web pages.
|
|
183
|
+
|
|
184
|
+
```javascript
|
|
185
|
+
import { createControllerUiModel } from '@a5c-ai/kradle-sdk';
|
|
186
|
+
const uiModel = createControllerUiModel(snapshot, { organization: 'acme' });
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Parameters:**
|
|
190
|
+
| Parameter | Type | Description |
|
|
191
|
+
|-----------|------|-------------|
|
|
192
|
+
| `snapshot` | `object` | Raw snapshot from `controller.snapshot()` or runtime |
|
|
193
|
+
| `options.organization` | `string` | Org slug to filter by (optional) |
|
|
194
|
+
|
|
195
|
+
**Returns:** Full UI model object (see web-console-spec.md Section 3.2 for full shape)
|
|
196
|
+
|
|
197
|
+
### issueProjectRefs(issue)
|
|
198
|
+
|
|
199
|
+
Extract all project references from an issue resource (checks spec, labels, annotations, status).
|
|
200
|
+
|
|
201
|
+
```javascript
|
|
202
|
+
import { issueProjectRefs } from '@a5c-ai/kradle-sdk';
|
|
203
|
+
const refs = issueProjectRefs(issue); // ['project-alpha', 'project-beta']
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### issueRepositoryRefs(issue)
|
|
207
|
+
|
|
208
|
+
Extract all repository references from an issue resource.
|
|
209
|
+
|
|
210
|
+
```javascript
|
|
211
|
+
import { issueRepositoryRefs } from '@a5c-ai/kradle-sdk';
|
|
212
|
+
const refs = issueRepositoryRefs(issue); // ['my-repo', 'other-repo']
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 4. Authentication
|
|
218
|
+
|
|
219
|
+
Source: `packages/kradle/core/src/auth.js`
|
|
220
|
+
|
|
221
|
+
### createAuthProviderConfig(env?)
|
|
222
|
+
|
|
223
|
+
```javascript
|
|
224
|
+
import { createAuthProviderConfig } from '@a5c-ai/kradle-sdk';
|
|
225
|
+
const config = createAuthProviderConfig(process.env);
|
|
226
|
+
// Returns: { session: { cookieName }, delegatedIdentity: {...}, providers: { github: {...}, sso: {...} } }
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### listEnabledAuthProviders(config?)
|
|
230
|
+
|
|
231
|
+
```javascript
|
|
232
|
+
import { listEnabledAuthProviders } from '@a5c-ai/kradle-sdk';
|
|
233
|
+
const providers = listEnabledAuthProviders(config);
|
|
234
|
+
// Returns: Array of providers where enabled=true, clientId set, authorizationUrl set
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### buildAuthorizationRedirect({ provider, requestUrl, state? })
|
|
238
|
+
|
|
239
|
+
```javascript
|
|
240
|
+
import { buildAuthorizationRedirect } from '@a5c-ai/kradle-sdk';
|
|
241
|
+
const { url, state, redirectUri } = buildAuthorizationRedirect({
|
|
242
|
+
provider: config.providers.github,
|
|
243
|
+
requestUrl: 'https://kradle.example.com/login'
|
|
244
|
+
});
|
|
245
|
+
// url: 'https://github.com/login/oauth/authorize?response_type=code&client_id=...&redirect_uri=...&scope=...&state=...'
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**Throws:** Error if provider disabled, clientId missing, or authorizationUrl missing.
|
|
249
|
+
|
|
250
|
+
### exchangeOAuthCodeForProfile({ provider, code, requestUrl, fetchImpl? })
|
|
251
|
+
|
|
252
|
+
```javascript
|
|
253
|
+
import { exchangeOAuthCodeForProfile } from '@a5c-ai/kradle-sdk';
|
|
254
|
+
const profile = await exchangeOAuthCodeForProfile({
|
|
255
|
+
provider: config.providers.github,
|
|
256
|
+
code: 'abc123',
|
|
257
|
+
requestUrl: 'https://kradle.example.com/login'
|
|
258
|
+
});
|
|
259
|
+
// Returns: { provider, subject, email, displayName, username, groups, teams, admin }
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**Side Effects:** Two HTTP requests (token exchange + profile fetch)
|
|
263
|
+
|
|
264
|
+
### createSessionCookie(config, profile, options?)
|
|
265
|
+
|
|
266
|
+
```javascript
|
|
267
|
+
import { createSessionCookie } from '@a5c-ai/kradle-sdk';
|
|
268
|
+
const cookie = createSessionCookie(config, profile, { secret: 'my-secret' });
|
|
269
|
+
// "kradle_session=eyJ...base64url.hmac_signature; Path=/; HttpOnly; SameSite=Lax"
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### parseSessionCookie(config, cookieValue, options?)
|
|
273
|
+
|
|
274
|
+
```javascript
|
|
275
|
+
import { parseSessionCookie } from '@a5c-ai/kradle-sdk';
|
|
276
|
+
const session = parseSessionCookie(config, cookieValue, { secret: 'my-secret' });
|
|
277
|
+
// Returns: { cookieName, provider, subject, user } or null
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### profileFromDelegatedHeaders(headers, config?, options?)
|
|
281
|
+
|
|
282
|
+
```javascript
|
|
283
|
+
import { profileFromDelegatedHeaders } from '@a5c-ai/kradle-sdk';
|
|
284
|
+
const profile = profileFromDelegatedHeaders(request.headers, config, { requestUrl });
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### registerLoginProfile({ controller, namespace, profile })
|
|
288
|
+
|
|
289
|
+
Applies User + IdentityMapping resources via `controller.applyResource()`.
|
|
290
|
+
|
|
291
|
+
### mapLoginProfileToKradleIdentity(profile)
|
|
292
|
+
|
|
293
|
+
Pure function: maps OAuth profile to User + IdentityMapping resources.
|
|
294
|
+
|
|
295
|
+
### createInviteResource(spec) / createTeamResource(spec)
|
|
296
|
+
|
|
297
|
+
Factory functions for Invite and Team resources.
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## 5. Org Scoping
|
|
302
|
+
|
|
303
|
+
Source: `packages/kradle/core/src/org-scoping.js`
|
|
304
|
+
|
|
305
|
+
### orgNamespaceName(org)
|
|
306
|
+
|
|
307
|
+
```javascript
|
|
308
|
+
import { orgNamespaceName } from '@a5c-ai/kradle-sdk';
|
|
309
|
+
orgNamespaceName('acme'); // 'kradle-org-acme'
|
|
310
|
+
orgNamespaceName('Acme Inc'); // 'kradle-org-acme-inc'
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
**Throws:** `Error('organization is required')` if empty after normalization.
|
|
314
|
+
|
|
315
|
+
### normalizeOrgSlug(value)
|
|
316
|
+
|
|
317
|
+
```javascript
|
|
318
|
+
import { normalizeOrgSlug } from '@a5c-ai/kradle-sdk';
|
|
319
|
+
normalizeOrgSlug('Acme Inc'); // 'acme-inc'
|
|
320
|
+
normalizeOrgSlug(' HELLO '); // 'hello'
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## 6. Agent Controllers
|
|
326
|
+
|
|
327
|
+
### resolveStack(agentStack, resources)
|
|
328
|
+
|
|
329
|
+
Translates an `AgentStack` CRD into a flat execution config consumed by `createAgentJob()`.
|
|
330
|
+
|
|
331
|
+
```javascript
|
|
332
|
+
import { resolveStack } from '@a5c-ai/kradle-sdk';
|
|
333
|
+
|
|
334
|
+
const executionConfig = resolveStack(agentStack, resources);
|
|
335
|
+
// Returns: {
|
|
336
|
+
// agentImage: string,
|
|
337
|
+
// command: string[],
|
|
338
|
+
// model: string,
|
|
339
|
+
// prompt: string,
|
|
340
|
+
// systemPrompt: string,
|
|
341
|
+
// serviceAccountName: string,
|
|
342
|
+
// resourceRequests: { cpu, memory },
|
|
343
|
+
// resourceLimits: { cpu, memory },
|
|
344
|
+
// adapterRef: string,
|
|
345
|
+
// runnerPoolRef: string | null
|
|
346
|
+
// }
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
**Throws:** `Error('AgentStack not found: X')` if stack is not in resources.
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
### createAgentJob(run, executionConfig)
|
|
354
|
+
|
|
355
|
+
Generates a `batch/v1` Job manifest for an agent dispatch run. Does not submit
|
|
356
|
+
to Kubernetes — call `submitAgentJob()` to apply.
|
|
357
|
+
|
|
358
|
+
```javascript
|
|
359
|
+
import { createAgentJob } from '@a5c-ai/kradle-sdk';
|
|
360
|
+
|
|
361
|
+
const jobManifest = createAgentJob(run, executionConfig, {
|
|
362
|
+
workspacePvcName: 'kradle-ws-my-workspace',
|
|
363
|
+
callbackUrl: 'https://kradle.example.com/api/orgs/acme/agents/runs/run-abc/callback',
|
|
364
|
+
resolvedTransport: { transport: 'websocket', codec: 'json' },
|
|
365
|
+
budgetDeadlineSeconds: 3600
|
|
366
|
+
});
|
|
367
|
+
// Returns: batch/v1 Job object ready for kubectl apply
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
**Parameters:**
|
|
371
|
+
| Parameter | Type | Description |
|
|
372
|
+
|-----------|------|-------------|
|
|
373
|
+
| `run` | `object` | AgentDispatchRun resource |
|
|
374
|
+
| `executionConfig` | `object` | Output of `resolveStack()` |
|
|
375
|
+
| `options.workspacePvcName` | `string` | PVC name to mount at `/workspace` |
|
|
376
|
+
| `options.callbackUrl` | `string` | Callback endpoint for result reporting |
|
|
377
|
+
| `options.resolvedTransport` | `object` | Output of `resolveTransport()` |
|
|
378
|
+
| `options.budgetDeadlineSeconds` | `number` | `activeDeadlineSeconds` for budget enforcement |
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
### submitAgentJob(jobManifest)
|
|
383
|
+
|
|
384
|
+
Submits a Job manifest to Kubernetes via `kubectl apply -f -`. Returns the applied
|
|
385
|
+
Job resource.
|
|
386
|
+
|
|
387
|
+
```javascript
|
|
388
|
+
import { submitAgentJob } from '@a5c-ai/kradle-sdk';
|
|
389
|
+
|
|
390
|
+
const appliedJob = await submitAgentJob(jobManifest);
|
|
391
|
+
// Returns: { job: K8s Job resource, jobName: string }
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
---
|
|
395
|
+
|
|
396
|
+
### getJobStatus(jobName, namespace)
|
|
397
|
+
|
|
398
|
+
Retrieves the current status of a Kubernetes Job.
|
|
399
|
+
|
|
400
|
+
```javascript
|
|
401
|
+
import { getJobStatus } from '@a5c-ai/kradle-sdk';
|
|
402
|
+
|
|
403
|
+
const status = await getJobStatus('agent-run-abc', 'kradle-org-acme');
|
|
404
|
+
// Returns: { phase: 'Pending'|'Active'|'Succeeded'|'Failed', startTime, completionTime, conditions }
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
### getJobLogs(jobName, namespace, options?)
|
|
410
|
+
|
|
411
|
+
Retrieves logs from the agent pod associated with a Job.
|
|
412
|
+
|
|
413
|
+
```javascript
|
|
414
|
+
import { getJobLogs } from '@a5c-ai/kradle-sdk';
|
|
415
|
+
|
|
416
|
+
const logs = await getJobLogs('agent-run-abc', 'kradle-org-acme', { tail: 100 });
|
|
417
|
+
// Returns: string (raw log output)
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
### deleteJob(jobName, namespace)
|
|
423
|
+
|
|
424
|
+
Deletes a completed or failed Job and its associated pods.
|
|
425
|
+
|
|
426
|
+
```javascript
|
|
427
|
+
import { deleteJob } from '@a5c-ai/kradle-sdk';
|
|
428
|
+
|
|
429
|
+
await deleteJob('agent-run-abc', 'kradle-org-acme');
|
|
430
|
+
// Returns: { deleted: true, jobName }
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
---
|
|
434
|
+
|
|
435
|
+
### persistSessionEvent(runId, result)
|
|
436
|
+
|
|
437
|
+
Applies a callback result payload to the `AgentDispatchRun` and `AgentSession`
|
|
438
|
+
resources, updating their phases and status fields.
|
|
439
|
+
|
|
440
|
+
```javascript
|
|
441
|
+
import { persistSessionEvent } from '@a5c-ai/kradle-sdk';
|
|
442
|
+
|
|
443
|
+
await persistSessionEvent('run-abc', {
|
|
444
|
+
phase: 'Succeeded',
|
|
445
|
+
exitCode: 0,
|
|
446
|
+
artifacts: [{ kind: 'pr', digest: 'sha256:abc' }],
|
|
447
|
+
costUsd: 0.042
|
|
448
|
+
});
|
|
449
|
+
// Updates: AgentDispatchRun.status.phase, AgentSession.status.phase, costUsd, artifacts
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
---
|
|
453
|
+
|
|
454
|
+
### createHooksLifecycleEmitter(bus?)
|
|
455
|
+
|
|
456
|
+
Creates a lifecycle event emitter that wraps an event bus and emits 9 structured
|
|
457
|
+
agent lifecycle events to registered `WebhookSubscription` endpoints.
|
|
458
|
+
|
|
459
|
+
```javascript
|
|
460
|
+
import { createHooksLifecycleEmitter, globalEventBus } from '@a5c-ai/kradle-sdk';
|
|
461
|
+
|
|
462
|
+
const emitter = createHooksLifecycleEmitter(globalEventBus);
|
|
463
|
+
|
|
464
|
+
emitter.emit('RUN_CREATED', { runId: 'run-abc', org: 'acme', stackRef: 'my-stack' });
|
|
465
|
+
emitter.emit('RUN_STARTED', { runId: 'run-abc', k8sJobName: 'agent-run-abc' });
|
|
466
|
+
emitter.emit('RUN_COMPLETED', { runId: 'run-abc', costUsd: 0.042, artifacts: [] });
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
**Event types:** `RUN_CREATED`, `RUN_QUEUED`, `RUN_STARTED`, `STEP_STARTED`,
|
|
470
|
+
`STEP_COMPLETED`, `APPROVAL_REQUESTED`, `APPROVAL_GRANTED`, `APPROVAL_DENIED`,
|
|
471
|
+
`RUN_COMPLETED`, `RUN_FAILED`
|
|
472
|
+
|
|
473
|
+
---
|
|
474
|
+
|
|
475
|
+
### checkBudget({ org, model, estimatedTokens, resources })
|
|
476
|
+
|
|
477
|
+
Checks whether a dispatch run is within the organization's budget ceiling and
|
|
478
|
+
computes the `activeDeadlineSeconds` value for the Job spec.
|
|
479
|
+
|
|
480
|
+
```javascript
|
|
481
|
+
import { checkBudget } from '@a5c-ai/kradle-sdk';
|
|
482
|
+
|
|
483
|
+
const result = checkBudget({
|
|
484
|
+
org: 'acme',
|
|
485
|
+
model: 'claude-sonnet-4',
|
|
486
|
+
estimatedTokens: 100000,
|
|
487
|
+
resources: snapshot.resources
|
|
488
|
+
});
|
|
489
|
+
// Returns: {
|
|
490
|
+
// allowed: boolean,
|
|
491
|
+
// reason: string | null, // 'budget-exceeded' if not allowed
|
|
492
|
+
// estimatedCostUsd: number,
|
|
493
|
+
// activeDeadlineSeconds: number
|
|
494
|
+
// }
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
---
|
|
498
|
+
|
|
499
|
+
### estimateCost(model, inputTokens, outputTokens?)
|
|
500
|
+
|
|
501
|
+
Pure function that computes estimated cost from model rate tables.
|
|
502
|
+
|
|
503
|
+
```javascript
|
|
504
|
+
import { estimateCost } from '@a5c-ai/kradle-sdk';
|
|
505
|
+
|
|
506
|
+
const cost = estimateCost('claude-sonnet-4', 80000, 20000);
|
|
507
|
+
// Returns: number (USD)
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
Rate tables are sourced from `AgentProviderConfig.spec.modelRates`. Falls back
|
|
511
|
+
to built-in defaults when no provider config is available.
|
|
512
|
+
|
|
513
|
+
---
|
|
514
|
+
|
|
515
|
+
### resolveTransport(stack, resources)
|
|
516
|
+
|
|
517
|
+
Resolves the transport protocol and codec for an agent Job by reading the
|
|
518
|
+
`AgentTransportBinding` referenced by the stack's adapter.
|
|
519
|
+
|
|
520
|
+
```javascript
|
|
521
|
+
import { resolveTransport } from '@a5c-ai/kradle-sdk';
|
|
522
|
+
|
|
523
|
+
const transport = resolveTransport(agentStack, resources);
|
|
524
|
+
// Returns: {
|
|
525
|
+
// transport: 'websocket' | 'http' | 'stdio' | 'unix',
|
|
526
|
+
// codec: 'json' | 'msgpack',
|
|
527
|
+
// envVars: {
|
|
528
|
+
// AGENT_MUX_TRANSPORT: string,
|
|
529
|
+
// TRANSPORT_MUX_CODEC: string
|
|
530
|
+
// }
|
|
531
|
+
// }
|
|
532
|
+
```
|
|
533
|
+
|
|
534
|
+
Falls back to `{ transport: 'http', codec: 'json' }` when no binding is found.
|
|
535
|
+
|
|
536
|
+
---
|
|
537
|
+
|
|
538
|
+
### createAgentStackController(options?)
|
|
539
|
+
|
|
540
|
+
```javascript
|
|
541
|
+
import { createAgentStackController } from '@a5c-ai/kradle-sdk';
|
|
542
|
+
const ctrl = createAgentStackController({ fetch: customFetch });
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
**Methods:**
|
|
546
|
+
- `reconcileStack(stack, resources)` — Returns `{ conditions, capabilities, validation, permissionDecision }`
|
|
547
|
+
- `listStackCapabilities(stack, resources)` — Returns array of `{ kind, name, status, ref }`
|
|
548
|
+
- `checkMcpHealth(mcpServer)` — Returns `{ serverName, status, latencyMs, error? }`
|
|
549
|
+
|
|
550
|
+
### createAgentDispatchController(options?)
|
|
551
|
+
|
|
552
|
+
```javascript
|
|
553
|
+
import { createAgentDispatchController } from '@a5c-ai/kradle-sdk';
|
|
554
|
+
const ctrl = createAgentDispatchController({ permissionReviewer, stackController, ... });
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
**Methods:**
|
|
558
|
+
- `createManualDispatch({ repository, ref, agentStack, taskKind, actor, namespace, organizationRef, resources })` — Full dispatch orchestration
|
|
559
|
+
|
|
560
|
+
### createAgentWorkspaceController()
|
|
561
|
+
|
|
562
|
+
```javascript
|
|
563
|
+
import { createAgentWorkspaceController } from '@a5c-ai/kradle-sdk';
|
|
564
|
+
const ctrl = createAgentWorkspaceController();
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
**Methods (25):**
|
|
568
|
+
- `createWorkspace(opts)` — Returns `{ workspace, pvcManifest }`
|
|
569
|
+
- `deleteWorkspace(opts)` — Returns `{ workspace, pvcDeleteManifest }`
|
|
570
|
+
- `getWorkspaceStatus(opts)` — Returns status object
|
|
571
|
+
- `initializeWorkspace(opts)` — Returns git clone commandSpec
|
|
572
|
+
- `checkoutBranch(opts)` — Returns git checkout commandSpec
|
|
573
|
+
- `syncWorkspace(opts)` — Returns fetch+reset commandSpecs
|
|
574
|
+
- `getMountSpec(opts)` — Returns `{ volume, volumeMount }`
|
|
575
|
+
- `findReusableWorkspace(opts)` — Returns matching workspace or null
|
|
576
|
+
- `claimWorkspace(opts)` — Marks workspace InUse
|
|
577
|
+
- `releaseWorkspace(opts)` — Returns workspace to Ready
|
|
578
|
+
- `provisionWorkspace(opts)` — Legacy: create + mark InUse + runtime
|
|
579
|
+
- `archiveWorkspace(opts)` — Sets phase=Archived
|
|
580
|
+
- `recoverWorkspace(opts)` — Recovers from Archived
|
|
581
|
+
- `bindSession(opts)` — Adds session to boundSessions[]
|
|
582
|
+
- `linkWorkItem(opts)` — Creates WorkItemWorkspaceLink
|
|
583
|
+
- `linkWorkItemToSession(opts)` — Creates WorkItemSessionLink
|
|
584
|
+
- `listWorkspacesForRepo(opts)` — Filter by repository
|
|
585
|
+
- `listWorkspacesForRun(opts)` — Filter by runRef
|
|
586
|
+
- `launchCodespace(workspace, opts)` — Returns podSpec, serviceSpec, codespaceUrl
|
|
587
|
+
- `stopCodespace(workspace)` — Returns delete manifests
|
|
588
|
+
- `getCodespaceStatus(workspace, podStatus)` — Returns running/url/uptime
|
|
589
|
+
- `addAssociation(workspace, ref)` — Adds to spec.associations[]
|
|
590
|
+
- `removeAssociation(workspace, ref)` — Removes from spec.associations[]
|
|
591
|
+
- `listAssociations(workspace)` — Returns associations array
|
|
592
|
+
- `getWorkspaceRuns(workspace, allRuns)` — Returns `{ active, history }`
|
|
593
|
+
|
|
594
|
+
### createAgentTriggerController(options?)
|
|
595
|
+
|
|
596
|
+
```javascript
|
|
597
|
+
import { createAgentTriggerController, validateTriggerRule } from '@a5c-ai/kradle-sdk';
|
|
598
|
+
```
|
|
599
|
+
|
|
600
|
+
**Methods:**
|
|
601
|
+
- `matchRule(rule, event)` — Returns `{ matches, reason }`
|
|
602
|
+
- `evaluateEvent({ event, resources })` — Returns array of `{ rule, matches, reason, isDuplicate }`
|
|
603
|
+
- `createTriggerExecution({ rule, event, decision, reason, namespace, organizationRef })` — Creates resource
|
|
604
|
+
- `evaluateWebhookEvent(event, rules)` — Returns `{ matchingRules, dispatchIntents }`
|
|
605
|
+
- `processEvent({ event, resources, namespace, organizationRef })` — Full evaluation + dispatch
|
|
606
|
+
|
|
607
|
+
**Utility exports:**
|
|
608
|
+
- `validateCronExpression(expr)` → `{ valid, error? }`
|
|
609
|
+
- `calculateNextRun(cronExpr, fromDate?)` → `Date | null`
|
|
610
|
+
- `validateWebhookTrigger(config)` → `{ valid, error? }`
|
|
611
|
+
- `validateCommentTrigger(config)` → `{ valid, error? }`
|
|
612
|
+
- `validateLabelTrigger(config)` → `{ valid, error? }`
|
|
613
|
+
- `getTriggerSourceType(rule)` → `'cron'|'webhook'|'comment'|'label'|'event'|'unknown'`
|
|
614
|
+
- `validateTriggerRule(rule)` → `{ valid, errors[] }`
|
|
615
|
+
|
|
616
|
+
### createAgentApprovalController()
|
|
617
|
+
|
|
618
|
+
**Methods:**
|
|
619
|
+
- `createApprovalRequest({ dispatchRun, action, requestedBy, context, namespace, organizationRef, resources })` — Creates AgentApproval (dedup check)
|
|
620
|
+
- `recordDecision({ approvalName, decision, decidedBy, reason, namespace, organizationRef, resources })` — Approve or deny
|
|
621
|
+
- `isActionApproved({ dispatchRun, action, resources })` — Check approval status
|
|
622
|
+
- `listPendingApprovals({ organizationRef, resources })` — Filter pending
|
|
623
|
+
- `listApprovalsForRun({ dispatchRun, resources })` — Filter by run
|
|
624
|
+
- `persistApproval({ approval, applyResource })` — Persist to K8s
|
|
625
|
+
- `enforceApproval({ dispatchRun, action, resources })` — Gate check
|
|
626
|
+
|
|
627
|
+
### createPermissionReviewer()
|
|
628
|
+
|
|
629
|
+
```javascript
|
|
630
|
+
import { createPermissionReviewer } from '@a5c-ai/kradle-sdk';
|
|
631
|
+
const reviewer = createPermissionReviewer();
|
|
632
|
+
const result = reviewer.reviewPermissions({
|
|
633
|
+
repository, ref, actor, agentStack, triggerSource, taskKind,
|
|
634
|
+
runnerPool, toolRefs, skillRefs, mcpServerRefs, contextLabelRefs,
|
|
635
|
+
workspacePolicyRef, isFork, resources
|
|
636
|
+
});
|
|
637
|
+
// Returns: { decision: 'allowed'|'requires-approval'|'denied', reasons[], grants[], capabilities, ... }
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
---
|
|
641
|
+
|
|
642
|
+
## 7. Memory System
|
|
643
|
+
|
|
644
|
+
### queryGraph({ records, edges, query, kinds?, depth? })
|
|
645
|
+
|
|
646
|
+
```javascript
|
|
647
|
+
import { queryGraph } from '@a5c-ai/kradle-sdk';
|
|
648
|
+
const result = queryGraph({
|
|
649
|
+
records: [{ id: 'n1', nodeKind: 'concept', attributes: { title: 'Design' }, edges: [] }],
|
|
650
|
+
edges: [{ source: 'n1', target: 'n2', kind: 'related-to' }],
|
|
651
|
+
query: 'design',
|
|
652
|
+
kinds: ['concept'],
|
|
653
|
+
depth: 2
|
|
654
|
+
});
|
|
655
|
+
// Returns: { matches: [{ record, score, edges }], totalMatches: number }
|
|
656
|
+
```
|
|
657
|
+
|
|
658
|
+
**Scoring:** id match = 2, attribute match = 1, no match = 0
|
|
659
|
+
**Throws:** Error if query is null, undefined, or empty string
|
|
660
|
+
|
|
661
|
+
### queryGrep({ documents, query, paths?, context?, maxMatches? })
|
|
662
|
+
|
|
663
|
+
```javascript
|
|
664
|
+
import { queryGrep } from '@a5c-ai/kradle-sdk';
|
|
665
|
+
const result = queryGrep({
|
|
666
|
+
documents: [{ path: 'docs/arch.md', content: '...' }],
|
|
667
|
+
query: 'controller',
|
|
668
|
+
paths: ['docs/*'],
|
|
669
|
+
context: 2,
|
|
670
|
+
maxMatches: 25
|
|
671
|
+
});
|
|
672
|
+
// Returns: { excerpts: [{ path, lineNumber, line, highlighted, context, contextStart, contextEnd }], totalMatches }
|
|
673
|
+
```
|
|
674
|
+
|
|
675
|
+
### queryMemory({ query, mode, records, documents, edges, graphOptions, grepOptions })
|
|
676
|
+
|
|
677
|
+
Combined query supporting three modes: `'graph-only'`, `'grep-only'`, `'graph-and-grep'`.
|
|
678
|
+
|
|
679
|
+
```javascript
|
|
680
|
+
import { queryMemory } from '@a5c-ai/kradle-sdk';
|
|
681
|
+
const result = queryMemory({
|
|
682
|
+
query: 'agent design',
|
|
683
|
+
mode: 'graph-and-grep',
|
|
684
|
+
records, documents, edges,
|
|
685
|
+
graphOptions: { kinds: ['concept'], depth: 2 },
|
|
686
|
+
grepOptions: { paths: ['docs/*'], context: 3, maxMatches: 25 }
|
|
687
|
+
});
|
|
688
|
+
// Returns: { graph: { matches, totalMatches }, grep: { excerpts, totalMatches }, stats: { mode, totalMatches, graphCount, grepCount } }
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
### Memory Import Utilities
|
|
692
|
+
|
|
693
|
+
```javascript
|
|
694
|
+
import {
|
|
695
|
+
parseJournalForImport, // Parse babysitter run journal → importable data
|
|
696
|
+
createMemorySnapshot, // Create AgentMemorySnapshot resource
|
|
697
|
+
validateMemoryImport, // Validate AgentRunMemoryImport structure
|
|
698
|
+
validateMemorySnapshot, // Validate AgentMemorySnapshot structure
|
|
699
|
+
validateOntology, // Validate AgentMemoryOntology structure
|
|
700
|
+
getOntologyNodeKinds, // Extract valid node kinds
|
|
701
|
+
getOntologyEdgeKinds // Extract valid edge kinds
|
|
702
|
+
} from '@a5c-ai/kradle-sdk';
|
|
703
|
+
```
|
|
704
|
+
|
|
705
|
+
---
|
|
706
|
+
|
|
707
|
+
## 8. External Backend Controllers
|
|
708
|
+
|
|
709
|
+
### createWebhookController(options?)
|
|
710
|
+
|
|
711
|
+
```javascript
|
|
712
|
+
import { createWebhookController } from '@a5c-ai/kradle-sdk';
|
|
713
|
+
const ctrl = createWebhookController({ secret: 'webhook-signing-secret' });
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
- `verifyHmacSignature(body, signature)` → `{ valid, reason }`
|
|
717
|
+
- `createDeliveryRecord({ deliveryId, eventType, payload, rawBody })` → record
|
|
718
|
+
- `recordDelivery(record)` — Store in dedup Map
|
|
719
|
+
- `isDuplicate(deliveryId)` → boolean
|
|
720
|
+
- `onEvent(handler)` — Subscribe to events
|
|
721
|
+
- `processDelivery(params)` → `{ queued, duplicate, deliveryId }`
|
|
722
|
+
|
|
723
|
+
### createSyncController(opts?)
|
|
724
|
+
|
|
725
|
+
```javascript
|
|
726
|
+
import { createSyncController } from '@a5c-ai/kradle-sdk';
|
|
727
|
+
const ctrl = createSyncController({ persistFn: async (resource) => {} });
|
|
728
|
+
```
|
|
729
|
+
|
|
730
|
+
- `normalizeEvent(rawEvent)` → canonical event
|
|
731
|
+
- `upsertResource({ kind, localName, namespace, spec, externalEnvelope })` → resource
|
|
732
|
+
- `updateWatermark(bindingRef, timestamp)` — Advance watermark
|
|
733
|
+
- `getWatermark(bindingRef)` → string | null
|
|
734
|
+
- `applyOwnershipMode({ ownershipMode, operation, origin })` → `{ allowed, reason }`
|
|
735
|
+
- `createTombstone(params)` → tombstone record
|
|
736
|
+
- `getTombstone(nativeId)` → record | null
|
|
737
|
+
|
|
738
|
+
### createConflictController(opts?)
|
|
739
|
+
|
|
740
|
+
```javascript
|
|
741
|
+
import { createConflictController } from '@a5c-ai/kradle-sdk';
|
|
742
|
+
const ctrl = createConflictController({ persistFn });
|
|
743
|
+
```
|
|
744
|
+
|
|
745
|
+
- `detectConflict({ resourceRef, fieldPath, localValue, externalValue, namespace?, organizationRef? })` → `{ conflict: resource | null }`
|
|
746
|
+
- `resolveConflict({ conflictName, strategy, resolvedValue?, resources? })` → resolved conflict
|
|
747
|
+
- `listOpenConflicts(options)` → conflict array
|
|
748
|
+
- `supersede(conflictName, resources)` → superseded conflict
|
|
749
|
+
|
|
750
|
+
### createWriteController(opts?)
|
|
751
|
+
|
|
752
|
+
```javascript
|
|
753
|
+
import { createWriteController } from '@a5c-ai/kradle-sdk';
|
|
754
|
+
const ctrl = createWriteController({ persistFn });
|
|
755
|
+
```
|
|
756
|
+
|
|
757
|
+
- `createWriteIntent({ interfaceKey, operation, payload?, resourceRef, requiresApproval?, maxRetries?, namespace?, organizationRef? })` → intent
|
|
758
|
+
- `approveWriteIntent({ intentName, approvedBy, resources? })` → approved intent
|
|
759
|
+
- `rejectWriteIntent({ intentName, rejectedBy, reason?, resources? })` → rejected intent
|
|
760
|
+
- `markSending(intentName, resources)` → sending intent
|
|
761
|
+
- `confirmSuccess(intentName, response, resources)` → succeeded intent
|
|
762
|
+
- `confirmFailure(intentName, error, resources)` → failed/retrying intent
|
|
763
|
+
- `listIntents(options)` → intent array
|
|
764
|
+
|
|
765
|
+
---
|
|
766
|
+
|
|
767
|
+
## 9. Event System
|
|
768
|
+
|
|
769
|
+
### globalEventBus
|
|
770
|
+
|
|
771
|
+
Singleton event bus shared across the process.
|
|
772
|
+
|
|
773
|
+
```javascript
|
|
774
|
+
import { globalEventBus } from '@a5c-ai/kradle-sdk';
|
|
775
|
+
globalEventBus.subscribe((event) => console.log(event));
|
|
776
|
+
globalEventBus.emit({ type: 'custom', data: {} });
|
|
777
|
+
globalEventBus.emitResourceChange('Repository', 'my-repo', 'apply');
|
|
778
|
+
```
|
|
779
|
+
|
|
780
|
+
### createEventBus()
|
|
781
|
+
|
|
782
|
+
Create an isolated event bus instance.
|
|
783
|
+
|
|
784
|
+
```javascript
|
|
785
|
+
import { createEventBus } from '@a5c-ai/kradle-sdk';
|
|
786
|
+
const bus = createEventBus();
|
|
787
|
+
bus.subscribe(fn);
|
|
788
|
+
bus.unsubscribe(fn);
|
|
789
|
+
bus.emit(event);
|
|
790
|
+
bus.emitResourceChange(kind, name, operation);
|
|
791
|
+
```
|
|
792
|
+
|
|
793
|
+
---
|
|
794
|
+
|
|
795
|
+
## 10. Async Utilities
|
|
796
|
+
|
|
797
|
+
### createEventBatcher(handler, options?)
|
|
798
|
+
|
|
799
|
+
```javascript
|
|
800
|
+
import { createEventBatcher } from '@a5c-ai/kradle-sdk';
|
|
801
|
+
const batcher = createEventBatcher(async (events) => { await saveAll(events); }, { maxBatchSize: 50, flushIntervalMs: 1000 });
|
|
802
|
+
batcher.push(event); // Add event to batch
|
|
803
|
+
await batcher.flush(); // Force immediate flush
|
|
804
|
+
batcher.stop(); // Clear timer and buffer
|
|
805
|
+
```
|
|
806
|
+
|
|
807
|
+
### createRetryPolicy(options?)
|
|
808
|
+
|
|
809
|
+
```javascript
|
|
810
|
+
import { createRetryPolicy } from '@a5c-ai/kradle-sdk';
|
|
811
|
+
const policy = createRetryPolicy({ maxRetries: 3, baseDelayMs: 1000, maxDelayMs: 30000, jitter: true });
|
|
812
|
+
policy.shouldRetry(attempt, error); // boolean
|
|
813
|
+
policy.getDelay(attempt); // milliseconds
|
|
814
|
+
```
|
|
815
|
+
|
|
816
|
+
### createDeliveryQueue(processor, options?)
|
|
817
|
+
|
|
818
|
+
```javascript
|
|
819
|
+
import { createDeliveryQueue } from '@a5c-ai/kradle-sdk';
|
|
820
|
+
const queue = createDeliveryQueue(async (item) => { await deliver(item); }, { concurrency: 5, retryPolicy });
|
|
821
|
+
queue.enqueue(item); // Add to queue
|
|
822
|
+
await queue.drain(); // Wait for empty
|
|
823
|
+
queue.size(); // Current queue + active
|
|
824
|
+
queue.stop(); // Clear and resolve waiters
|
|
825
|
+
```
|
|
826
|
+
|
|
827
|
+
### createCheckpointer(storage?)
|
|
828
|
+
|
|
829
|
+
```javascript
|
|
830
|
+
import { createCheckpointer } from '@a5c-ai/kradle-sdk';
|
|
831
|
+
const cp = createCheckpointer(new Map());
|
|
832
|
+
cp.save('progress', { page: 5 });
|
|
833
|
+
cp.load('progress'); // { page: 5 }
|
|
834
|
+
cp.clear('progress');
|
|
835
|
+
cp.listKeys(); // []
|
|
836
|
+
```
|
|
837
|
+
|
|
838
|
+
---
|
|
839
|
+
|
|
840
|
+
## 11. Audit
|
|
841
|
+
|
|
842
|
+
### createAuditController()
|
|
843
|
+
|
|
844
|
+
```javascript
|
|
845
|
+
import { createAuditController } from '@a5c-ai/kradle-sdk';
|
|
846
|
+
const audit = createAuditController();
|
|
847
|
+
audit.log({ org: 'acme', actor: 'user1', action: 'apply', resource: { kind: 'Repository', name: 'x' } });
|
|
848
|
+
const { events, total } = audit.query({ org: 'acme', action: 'apply', limit: 10, offset: 0 });
|
|
849
|
+
```
|
|
850
|
+
|
|
851
|
+
### createEventPoller(options)
|
|
852
|
+
|
|
853
|
+
Polling mechanism for audit event consumption with exponential backoff.
|
|
854
|
+
|
|
855
|
+
---
|
|
856
|
+
|
|
857
|
+
## 12. Other Utilities
|
|
858
|
+
|
|
859
|
+
### createRunnerController()
|
|
860
|
+
|
|
861
|
+
```javascript
|
|
862
|
+
import { createRunnerController } from '@a5c-ai/kradle-sdk';
|
|
863
|
+
const runners = createRunnerController();
|
|
864
|
+
runners.validateRunnerPool(resource); // { valid, reason?, name?, ... }
|
|
865
|
+
runners.getPoolStatus(pool); // { idle, active, total, phase, scaling }
|
|
866
|
+
runners.getCapacity(pool); // { maxReplicas, used, available, utilizationPct }
|
|
867
|
+
runners.createRunner(pool, runRef); // Runner record
|
|
868
|
+
runners.assignJob(runnerId, jobRef); // Assignment
|
|
869
|
+
runners.releaseRunner(runnerId); // Release
|
|
870
|
+
```
|
|
871
|
+
|
|
872
|
+
### createNotificationController()
|
|
873
|
+
|
|
874
|
+
```javascript
|
|
875
|
+
import { createNotificationController } from '@a5c-ai/kradle-sdk';
|
|
876
|
+
const notif = createNotificationController();
|
|
877
|
+
notif.createNotification(event); // Create from event
|
|
878
|
+
notif.listNotifications(org, { unreadOnly, limit, since });
|
|
879
|
+
notif.markAsRead(id); // Mark single
|
|
880
|
+
notif.markAllAsRead(org); // Mark all for org
|
|
881
|
+
notif.getUnreadCount(org); // Count
|
|
882
|
+
notif.getPreferences(userId); // Get prefs
|
|
883
|
+
notif.updatePreferences(userId, { sound: true }); // Update
|
|
884
|
+
```
|
|
885
|
+
|
|
886
|
+
### createGiteaService(options)
|
|
887
|
+
|
|
888
|
+
```javascript
|
|
889
|
+
import { createGiteaService } from '@a5c-ai/kradle-sdk';
|
|
890
|
+
const gitea = createGiteaService({ baseUrl: 'http://gitea:3000', token: 'admin-token' });
|
|
891
|
+
```
|
|
892
|
+
|
|
893
|
+
### fetchControllerUiModel({ baseUrl, org })
|
|
894
|
+
|
|
895
|
+
```javascript
|
|
896
|
+
import { fetchControllerUiModel } from '@a5c-ai/kradle-sdk';
|
|
897
|
+
const uiModel = await fetchControllerUiModel({ baseUrl: 'http://localhost:3080', org: 'acme' });
|
|
898
|
+
```
|
|
899
|
+
|
|
900
|
+
### clearSnapshotCache()
|
|
901
|
+
|
|
902
|
+
```javascript
|
|
903
|
+
import { clearSnapshotCache } from '@a5c-ai/kradle-sdk';
|
|
904
|
+
clearSnapshotCache(); // Invalidates all per-org cache entries + legacy cache
|
|
905
|
+
```
|
|
906
|
+
|
|
907
|
+
### mapOidcIdentity(profile)
|
|
908
|
+
|
|
909
|
+
```javascript
|
|
910
|
+
import { mapOidcIdentity } from '@a5c-ai/kradle-sdk';
|
|
911
|
+
const identity = mapOidcIdentity({ subject, email, groups });
|
|
912
|
+
```
|
|
913
|
+
|
|
914
|
+
---
|
|
915
|
+
|
|
916
|
+
## 13. Atlas Graph Client
|
|
917
|
+
|
|
918
|
+
Source: `packages/kradle/sdk/src/atlas-graph-client.js`
|
|
919
|
+
|
|
920
|
+
### STACK_LAYERS
|
|
921
|
+
|
|
922
|
+
Array of 11 stack layer definitions for the agent stack builder. Each has:
|
|
923
|
+
```javascript
|
|
924
|
+
{ key: 'layer:N-name', label: string, kind: 'stack-layer', position: number, atlasKinds: string[] }
|
|
925
|
+
```
|
|
926
|
+
|
|
927
|
+
Layers: Model, Provider, Transport, Agent Core, Agent Runtime, Agent Platform, Workspace, Execution, Sandbox, Interaction, Presentation.
|
|
928
|
+
|
|
929
|
+
### COMPOSITION_FACETS
|
|
930
|
+
|
|
931
|
+
Array of 4 composition facet definitions:
|
|
932
|
+
- Roles and Teams
|
|
933
|
+
- Skills and Capabilities
|
|
934
|
+
- Evaluation and Governance
|
|
935
|
+
- Environment and Data
|
|
936
|
+
|
|
937
|
+
### ALL_LAYER_DEFS
|
|
938
|
+
|
|
939
|
+
Combined `[...STACK_LAYERS, ...COMPOSITION_FACETS]` — 15 definitions.
|
|
940
|
+
|
|
941
|
+
### fetchAtlasRecordsByKinds(atlasBaseUrl, kinds, options?)
|
|
942
|
+
|
|
943
|
+
```javascript
|
|
944
|
+
import { fetchAtlasRecordsByKinds } from '@a5c-ai/kradle-sdk';
|
|
945
|
+
const records = await fetchAtlasRecordsByKinds('https://atlas.example.com', ['ModelFamily', 'ModelVersion'], { limit: 100 });
|
|
946
|
+
// Returns: Array<{ id, nodeKind, displayName, description, cluster }>
|
|
947
|
+
```
|
|
948
|
+
|
|
949
|
+
### searchAtlasGraph(atlasBaseUrl, query, options?)
|
|
950
|
+
|
|
951
|
+
```javascript
|
|
952
|
+
import { searchAtlasGraph } from '@a5c-ai/kradle-sdk';
|
|
953
|
+
const result = await searchAtlasGraph('https://atlas.example.com', 'claude', { kinds: ['ModelFamily'], limit: 25 });
|
|
954
|
+
// Returns: { total, hits: Array<{ id, nodeKind, displayName, cluster, score, snippet }> }
|
|
955
|
+
```
|
|
956
|
+
|
|
957
|
+
---
|
|
958
|
+
|
|
959
|
+
## 14. Boundary Constants
|
|
960
|
+
|
|
961
|
+
All boundary declarations are also exported for runtime introspection:
|
|
962
|
+
|
|
963
|
+
```javascript
|
|
964
|
+
import {
|
|
965
|
+
KRADLE_API_CONTROLLER_BOUNDARY,
|
|
966
|
+
AGENT_STACK_CONTROLLER_BOUNDARY,
|
|
967
|
+
AGENT_DISPATCH_CONTROLLER_BOUNDARY,
|
|
968
|
+
AGENT_WORKSPACE_CONTROLLER_BOUNDARY,
|
|
969
|
+
AGENT_TRIGGER_CONTROLLER_BOUNDARY,
|
|
970
|
+
AGENT_APPROVAL_CONTROLLER_BOUNDARY,
|
|
971
|
+
AGENT_MEMORY_QUERY_BOUNDARY,
|
|
972
|
+
AGENT_PERMISSION_REVIEW_BOUNDARY,
|
|
973
|
+
AGENT_SECRET_GRANT_CONTROLLER_BOUNDARY,
|
|
974
|
+
AGENT_CONFIG_GRANT_CONTROLLER_BOUNDARY,
|
|
975
|
+
AGENT_ADAPTER_CONTROLLER_BOUNDARY,
|
|
976
|
+
AGENT_TRANSPORT_BINDING_CONTROLLER_BOUNDARY,
|
|
977
|
+
AGENT_PROVIDER_CONFIG_CONTROLLER_BOUNDARY,
|
|
978
|
+
AGENT_PROJECT_CONTROLLER_BOUNDARY,
|
|
979
|
+
AGENT_GATEWAY_CONFIG_CONTROLLER_BOUNDARY,
|
|
980
|
+
AGENT_SESSION_TRANSCRIPT_CONTROLLER_BOUNDARY,
|
|
981
|
+
AGENT_SUBAGENT_CONTROLLER_BOUNDARY,
|
|
982
|
+
AGENT_WRITEBACK_CONTROLLER_BOUNDARY,
|
|
983
|
+
AUDIT_CONTROLLER_BOUNDARY,
|
|
984
|
+
RUNNER_CONTROLLER_BOUNDARY,
|
|
985
|
+
NOTIFICATION_CONTROLLER_BOUNDARY,
|
|
986
|
+
AGENT_MEMORY_CONTROLLER_BOUNDARY
|
|
987
|
+
} from '@a5c-ai/kradle-sdk';
|
|
988
|
+
```
|
|
989
|
+
|
|
990
|
+
Each exports `{ role, scope, owns, delegatesTo, mustNotOwn }`.
|
|
991
|
+
|
|
992
|
+
|
|
993
|
+
---
|
|
994
|
+
|
|
995
|
+
## Inference Service Controller
|
|
996
|
+
|
|
997
|
+
### `createInferenceServiceController(config)`
|
|
998
|
+
|
|
999
|
+
**Import:** `import { createInferenceServiceController } from '@a5c-ai/kradle';`
|
|
1000
|
+
|
|
1001
|
+
Returns an inference service controller with methods:
|
|
1002
|
+
|
|
1003
|
+
| Method | Signature | Description |
|
|
1004
|
+
|--------|-----------|-------------|
|
|
1005
|
+
| `createService` | `(spec) => Promise<resource>` | Create KradleInferenceService and apply KServe manifest |
|
|
1006
|
+
| `getService` | `(name) => Promise<resource>` | Get service with resolved endpoint URL |
|
|
1007
|
+
| `listServices` | `() => Promise<resource[]>` | List all KradleInferenceServices |
|
|
1008
|
+
| `deleteService` | `(name) => Promise<void>` | Delete service and underlying KServe resource |
|
|
1009
|
+
| `runInference` | `(name, payload) => Promise<result>` | Proxy inference request to the resolved endpoint |
|
|
1010
|
+
| `toProviderConfig` | `(name) => Promise<AgentProviderConfig>` | Bridge service to AgentProviderConfig |
|
|
1011
|
+
|
|
1012
|
+
**Constants exported:**
|
|
1013
|
+
- `KRADLE_INFERENCE_SERVICE_CONTROLLER_BOUNDARY` -- boundary identifier string
|
|
1014
|
+
- `SUPPORTED_MODEL_FORMATS` -- array of supported format names: `['sklearn', 'xgboost', 'lightgbm', 'tensorflow', 'pytorch', 'onnx', 'triton', 'huggingface', 'custom']`
|
|
1015
|
+
- `INFERENCE_PROTOCOLS` -- `{ V1: 'v1', V2: 'v2' }`
|
|
1016
|
+
|
|
1017
|
+
---
|
|
1018
|
+
|
|
1019
|
+
## Artifact Registry Controller
|
|
1020
|
+
|
|
1021
|
+
### `createArtifactRegistryController(config)`
|
|
1022
|
+
|
|
1023
|
+
**Import:** `import { createArtifactRegistryController } from '@a5c-ai/kradle';`
|
|
1024
|
+
|
|
1025
|
+
Returns an artifact registry controller with methods:
|
|
1026
|
+
|
|
1027
|
+
| Method | Signature | Description |
|
|
1028
|
+
|--------|-----------|-------------|
|
|
1029
|
+
| `createRegistry` | `(spec) => Promise<resource>` | Create ArtifactRegistry |
|
|
1030
|
+
| `listRegistries` | `() => Promise<resource[]>` | List registries |
|
|
1031
|
+
| `createFeed` | `(registryRef, spec) => Promise<resource>` | Create ArtifactFeed |
|
|
1032
|
+
| `listFeeds` | `(registryRef?) => Promise<resource[]>` | List feeds, optionally filtered by registry |
|
|
1033
|
+
| `publishVersion` | `(feedRef, spec) => Promise<resource>` | Publish ArtifactVersion |
|
|
1034
|
+
| `listVersions` | `(feedRef) => Promise<resource[]>` | List versions for a feed |
|
|
1035
|
+
| `trackDownload` | `(versionRef, context) => Promise<resource>` | Record ArtifactDownload |
|
|
1036
|
+
| `setAccessPolicy` | `(feedRef, subject, permission) => Promise<resource>` | Create or update ArtifactAccessPolicy |
|
|
1037
|
+
| `getInstallCommand` | `(feedRef) => Promise<string>` | Generate protocol-specific install command |
|
|
1038
|
+
|
|
1039
|
+
**Constants exported:**
|
|
1040
|
+
- `ARTIFACT_REGISTRY_CONTROLLER_BOUNDARY` -- boundary identifier string
|
|
1041
|
+
|
|
1042
|
+
---
|
|
1043
|
+
|
|
1044
|
+
## Assistant Runtime
|
|
1045
|
+
|
|
1046
|
+
### `createAssistantRuntime(config)`
|
|
1047
|
+
|
|
1048
|
+
**Import:** `import { createAssistantRuntime } from '@a5c-ai/kradle';`
|
|
1049
|
+
|
|
1050
|
+
Returns an assistant runtime object with methods:
|
|
1051
|
+
|
|
1052
|
+
| Method | Signature | Description |
|
|
1053
|
+
|--------|-----------|-------------|
|
|
1054
|
+
| `chat` | `(opts) => AsyncIterable<chunk>` | SSE stream of assistant response chunks. `opts`: `{ org, sessionId, messages, system?, tools?, model? }` |
|
|
1055
|
+
| `generate` | `(opts) => Promise<object>` | Structured generation. `opts`: `{ org, prompt, schema?, system?, tools?, model? }` |
|
|
1056
|
+
| `listSessions` | `(org) => Array<session>` | List active sessions for org |
|
|
1057
|
+
| `clearSession` | `(org, sessionId) => void` | Remove session from in-process store |
|
|
1058
|
+
|
|
1059
|
+
**Constants exported:**
|
|
1060
|
+
- `ASSISTANT_RUNTIME_BOUNDARY` -- boundary identifier string
|
|
1061
|
+
- `defaultAssistantConfig` -- default model and system prompt config object
|
|
1062
|
+
- `defaultSystemPrompt` -- default system prompt string
|
|
1063
|
+
- `callModel` -- low-level Anthropic API call function: `callModel(messages, opts) => AsyncIterable<chunk>`
|
|
1064
|
+
|
|
1065
|
+
**Session store:** `globalThis.__kradleSessions` keyed by `org:sessionId`. Not persisted across process restarts.
|
|
1066
|
+
|
|
1067
|
+
---
|
|
1068
|
+
|
|
1069
|
+
## New Model Types
|
|
1070
|
+
|
|
1071
|
+
```javascript
|
|
1072
|
+
// KradleInferenceService spec
|
|
1073
|
+
{
|
|
1074
|
+
predictor: {
|
|
1075
|
+
model: {
|
|
1076
|
+
modelFormat: { name: 'pytorch' },
|
|
1077
|
+
storageUri: 's3://bucket/model',
|
|
1078
|
+
runtime: 'optional-runtime-name',
|
|
1079
|
+
protocolVersion: 'v2'
|
|
1080
|
+
},
|
|
1081
|
+
resources: { limits: { cpu: '2', memory: '4Gi' } }
|
|
1082
|
+
},
|
|
1083
|
+
features: {}
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
// ArtifactRegistry spec
|
|
1087
|
+
{
|
|
1088
|
+
organizationRef: 'my-org',
|
|
1089
|
+
displayName: 'My Registry',
|
|
1090
|
+
type: 'npm',
|
|
1091
|
+
storageBackend: 's3',
|
|
1092
|
+
storageConfig: { bucket: 'artifacts', prefix: 'npm/' }
|
|
1093
|
+
}
|
|
1094
|
+
|
|
1095
|
+
// ArtifactVersion spec
|
|
1096
|
+
{
|
|
1097
|
+
organizationRef: 'my-org',
|
|
1098
|
+
feedRef: 'my-feed',
|
|
1099
|
+
name: 'my-package',
|
|
1100
|
+
version: '1.2.3',
|
|
1101
|
+
packageType: 'npm',
|
|
1102
|
+
size: 12345,
|
|
1103
|
+
checksums: { sha256: 'abc...', md5: 'def...' },
|
|
1104
|
+
metadata: { dependencies: {}, tags: [], description: '' },
|
|
1105
|
+
publishedBy: 'username',
|
|
1106
|
+
publishedAt: '2026-05-20T00:00:00Z'
|
|
1107
|
+
}
|
|
1108
|
+
```
|