@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.
Files changed (295) hide show
  1. package/Dockerfile +31 -0
  2. package/README.md +187 -0
  3. package/bin/kradle-demo.mjs +23 -0
  4. package/bin/kradle-server.mjs +14 -0
  5. package/dist/kradle-controller-ui.json +3482 -0
  6. package/dist/kradle-lifecycle.json +201 -0
  7. package/dist/kradle-runtime-snapshot.json +3125 -0
  8. package/dist/kradle-summary.json +724 -0
  9. package/docs/README.md +61 -0
  10. package/docs/agents/README.md +83 -0
  11. package/docs/agents/acceptance-test-matrix.md +193 -0
  12. package/docs/agents/agent-mux-adapter-contract.md +167 -0
  13. package/docs/agents/agent-mux-source-map.md +310 -0
  14. package/docs/agents/agent-run-memory-import-spec.md +256 -0
  15. package/docs/agents/agent-stack-management-spec.md +421 -0
  16. package/docs/agents/api-contract-spec.md +309 -0
  17. package/docs/agents/artifacts-writeback-spec.md +145 -0
  18. package/docs/agents/chart-packaging-spec.md +128 -0
  19. package/docs/agents/ci-orchestration-spec.md +140 -0
  20. package/docs/agents/context-assembly-spec.md +219 -0
  21. package/docs/agents/controller-reconciliation-spec.md +255 -0
  22. package/docs/agents/crd-schema-spec.md +315 -0
  23. package/docs/agents/decision-log-open-questions.md +169 -0
  24. package/docs/agents/developer-implementation-checklist.md +329 -0
  25. package/docs/agents/dispatching-design.md +262 -0
  26. package/docs/agents/gaps-agent-mux-to-kradle-crds.md +298 -0
  27. package/docs/agents/glossary.md +66 -0
  28. package/docs/agents/implementation-blueprint.md +324 -0
  29. package/docs/agents/implementation-rollout-slices.md +251 -0
  30. package/docs/agents/memory-context-integration-spec.md +194 -0
  31. package/docs/agents/memory-ontology-schema-spec.md +253 -0
  32. package/docs/agents/memory-operations-runbook.md +121 -0
  33. package/docs/agents/mvp-vertical-slice-spec.md +146 -0
  34. package/docs/agents/observability-audit-spec.md +265 -0
  35. package/docs/agents/operator-runbook.md +174 -0
  36. package/docs/agents/org-memory-api-payload-examples.md +333 -0
  37. package/docs/agents/org-memory-controller-sequence-spec.md +181 -0
  38. package/docs/agents/org-memory-e2e-fixture-plan.md +161 -0
  39. package/docs/agents/org-memory-ui-implementation-map.md +114 -0
  40. package/docs/agents/org-memory-vertical-slice-spec.md +168 -0
  41. package/docs/agents/org-resource-model-delta-spec.md +111 -0
  42. package/docs/agents/org-route-resource-model-spec.md +183 -0
  43. package/docs/agents/org-scoping-namespace-spec.md +114 -0
  44. package/docs/agents/rbac-secrets-management-spec.md +406 -0
  45. package/docs/agents/repository-page-integration-spec.md +255 -0
  46. package/docs/agents/resource-contract-examples.md +808 -0
  47. package/docs/agents/resource-relationship-map.md +190 -0
  48. package/docs/agents/security-threat-model.md +188 -0
  49. package/docs/agents/shared-memory-company-brain-spec.md +358 -0
  50. package/docs/agents/storage-migration-spec.md +168 -0
  51. package/docs/agents/subagent-orchestration-spec.md +152 -0
  52. package/docs/agents/system-overview.md +88 -0
  53. package/docs/agents/tools-mcp-skills-spec.md +189 -0
  54. package/docs/agents/traceability-matrix.md +79 -0
  55. package/docs/agents/ui-flow-spec.md +211 -0
  56. package/docs/agents/ui-ux-system-spec.md +426 -0
  57. package/docs/agents/workspace-lifecycle-spec.md +166 -0
  58. package/docs/architecture-spec.md +78 -0
  59. package/docs/architecture-v2.md +2759 -0
  60. package/docs/components/control-plane.md +78 -0
  61. package/docs/components/data-plane.md +69 -0
  62. package/docs/components/hooks-events.md +67 -0
  63. package/docs/components/identity-rbac-policy.md +73 -0
  64. package/docs/components/kubevela-oam.md +70 -0
  65. package/docs/components/operations-publishing.md +81 -0
  66. package/docs/components/runners-ci.md +66 -0
  67. package/docs/components/web-ui.md +94 -0
  68. package/docs/crd-behaviors-and-relationships.md +3926 -0
  69. package/docs/external/README.md +47 -0
  70. package/docs/external/bidirectional-sync-design.md +134 -0
  71. package/docs/external/cicd-interface.md +64 -0
  72. package/docs/external/external-backend-controllers.md +170 -0
  73. package/docs/external/external-backend-crds.md +234 -0
  74. package/docs/external/external-backend-ui-spec.md +151 -0
  75. package/docs/external/external-backend-ux-flows.md +115 -0
  76. package/docs/external/external-object-mapping.md +125 -0
  77. package/docs/external/git-forge-interface.md +68 -0
  78. package/docs/external/github-integration-design.md +151 -0
  79. package/docs/external/issue-tracking-interface.md +66 -0
  80. package/docs/external/provider-capability-manifests.md +204 -0
  81. package/docs/external/provider-catalog.md +139 -0
  82. package/docs/external/provider-rollout-testing.md +78 -0
  83. package/docs/external/research-results.md +48 -0
  84. package/docs/external/security-auth-permissions.md +81 -0
  85. package/docs/external/sync-state-machines.md +108 -0
  86. package/docs/external/unified-external-backend-model.md +107 -0
  87. package/docs/external/user-facing-changes.md +67 -0
  88. package/docs/gaps.md +161 -0
  89. package/docs/install.md +94 -0
  90. package/docs/integration-and-design-decisions.md +1530 -0
  91. package/docs/kradle-design.md +334 -0
  92. package/docs/local-minikube.md +55 -0
  93. package/docs/ontology/README.md +32 -0
  94. package/docs/ontology/bounded-contexts.md +29 -0
  95. package/docs/ontology/events-and-hooks.md +32 -0
  96. package/docs/ontology/oam-kubevela.md +32 -0
  97. package/docs/ontology/operations-and-release.md +25 -0
  98. package/docs/ontology/personas-and-actors.md +32 -0
  99. package/docs/ontology/policies-and-invariants.md +33 -0
  100. package/docs/ontology/problem-space.md +30 -0
  101. package/docs/ontology/resource-contracts.md +40 -0
  102. package/docs/ontology/resource-taxonomy.md +42 -0
  103. package/docs/ontology/runners-and-ci.md +29 -0
  104. package/docs/ontology/solution-space.md +24 -0
  105. package/docs/ontology/storage-and-data-boundaries.md +29 -0
  106. package/docs/ontology/validation-matrix.md +24 -0
  107. package/docs/ontology/web-ui-excellent-flows.md +32 -0
  108. package/docs/ontology/workflows.md +39 -0
  109. package/docs/ontology/world.md +35 -0
  110. package/docs/openapi.yaml +1291 -0
  111. package/docs/product-requirements.md +62 -0
  112. package/docs/requirements-v2.md +235 -0
  113. package/docs/roadmap-mvp.md +87 -0
  114. package/docs/sdk-api-reference.md +1108 -0
  115. package/docs/system-requirements.md +90 -0
  116. package/docs/system-spec-v2.md +1230 -0
  117. package/docs/tests/README.md +53 -0
  118. package/docs/tests/agent-qa-plan.md +63 -0
  119. package/docs/tests/browser-ui-tests.md +62 -0
  120. package/docs/tests/ci-quality-gates.md +48 -0
  121. package/docs/tests/coverage-model.md +64 -0
  122. package/docs/tests/e2e-scenario-tests.md +53 -0
  123. package/docs/tests/fixtures-test-data.md +63 -0
  124. package/docs/tests/observability-reliability-tests.md +54 -0
  125. package/docs/tests/product-test-matrix.md +145 -0
  126. package/docs/tests/qa-adoption-roadmap.md +130 -0
  127. package/docs/tests/qa-automation-plan.md +101 -0
  128. package/docs/tests/security-compliance-tests.md +57 -0
  129. package/docs/tests/test-framework-tools.md +88 -0
  130. package/docs/tests/test-suite-layout.md +121 -0
  131. package/docs/tests/unit-integration-tests.md +48 -0
  132. package/docs/todo-kyverno +714 -0
  133. package/docs/todos.md +4 -0
  134. package/docs/user-stories.md +78 -0
  135. package/docs/web-console-spec.md +533 -0
  136. package/examples/minikube-demo.yaml +190 -0
  137. package/examples/oam-application.yaml +23 -0
  138. package/examples/policy-kyverno-pr-title.yaml +18 -0
  139. package/package.json +66 -0
  140. package/scripts/build.mjs +29 -0
  141. package/scripts/setup-minikube.mjs +65 -0
  142. package/scripts/smoke.mjs +37 -0
  143. package/scripts/validate-doc-coverage.mjs +152 -0
  144. package/scripts/validate-package.mjs +95 -0
  145. package/scripts/validate-ui.mjs +305 -0
  146. package/src/agent-adapter-controller.js +169 -0
  147. package/src/agent-approval-controller.js +170 -0
  148. package/src/agent-context-bundles.js +242 -0
  149. package/src/agent-dispatch-controller.js +549 -0
  150. package/src/agent-gateway-config-controller.js +147 -0
  151. package/src/agent-identity-migration.js +115 -0
  152. package/src/agent-memory-controller.js +357 -0
  153. package/src/agent-memory-import.js +327 -0
  154. package/src/agent-memory-query.js +292 -0
  155. package/src/agent-memory-repository-source-controller.js +255 -0
  156. package/src/agent-mux-client.js +589 -0
  157. package/src/agent-permission-review.js +250 -0
  158. package/src/agent-persona-controller.js +135 -0
  159. package/src/agent-project-controller.js +117 -0
  160. package/src/agent-prompt-composition.js +55 -0
  161. package/src/agent-provider-config-controller.js +151 -0
  162. package/src/agent-secret-config-grant-controller.js +282 -0
  163. package/src/agent-session-transcript-controller.js +189 -0
  164. package/src/agent-stack-controller.js +421 -0
  165. package/src/agent-subagent-controller.js +160 -0
  166. package/src/agent-transport-binding-controller.js +121 -0
  167. package/src/agent-trigger-controller.js +387 -0
  168. package/src/agent-workspace-controller.js +702 -0
  169. package/src/agent-writeback-controller.js +302 -0
  170. package/src/api-controller.js +621 -0
  171. package/src/argocd-gitops.js +43 -0
  172. package/src/artifact-registry-controller.js +542 -0
  173. package/src/assistant-runtime.js +284 -0
  174. package/src/async-controller.js +207 -0
  175. package/src/audit-controller.js +191 -0
  176. package/src/auth.js +310 -0
  177. package/src/component-catalog.js +41 -0
  178. package/src/control-plane.js +136 -0
  179. package/src/controller-client.js +112 -0
  180. package/src/controller-ui.js +620 -0
  181. package/src/data-plane.js +179 -0
  182. package/src/event-bus.js +397 -0
  183. package/src/external/conflict-controller.js +225 -0
  184. package/src/external/github/auth.js +96 -0
  185. package/src/external/github/cicd.js +180 -0
  186. package/src/external/github/git-forge.js +240 -0
  187. package/src/external/github/index.js +144 -0
  188. package/src/external/github/issue-tracking.js +163 -0
  189. package/src/external/provider-adapter.js +161 -0
  190. package/src/external/provider-resource-factory.js +221 -0
  191. package/src/external/sync-controller.js +235 -0
  192. package/src/external/webhook-controller.js +144 -0
  193. package/src/external/write-controller.js +283 -0
  194. package/src/gitea-backend.js +131 -0
  195. package/src/gitea-service.js +173 -0
  196. package/src/handoff.js +98 -0
  197. package/src/health-probes.js +134 -0
  198. package/src/hooks-events.js +63 -0
  199. package/src/hooks-lifecycle.js +117 -0
  200. package/src/http-server.js +409 -0
  201. package/src/identity-policy.js +86 -0
  202. package/src/index.js +71 -0
  203. package/src/jitsi-agent-bridge.js +141 -0
  204. package/src/jitsi-meeting-controller.js +291 -0
  205. package/src/jitsi-sync-controller.js +198 -0
  206. package/src/kradle-inference-service-controller.js +246 -0
  207. package/src/kubernetes-controller-async.js +531 -0
  208. package/src/kubernetes-controller.js +904 -0
  209. package/src/kubernetes-resource-gateway.js +48 -0
  210. package/src/model-route-controller.js +364 -0
  211. package/src/notification-controller.js +178 -0
  212. package/src/operations.js +112 -0
  213. package/src/org-scoping.js +5 -0
  214. package/src/resource-model.js +282 -0
  215. package/src/runner-controller.js +272 -0
  216. package/src/runners-ci.js +48 -0
  217. package/src/runtime.js +196 -0
  218. package/src/snapshot-cache.js +157 -0
  219. package/src/virtual-model-controller.js +538 -0
  220. package/src/virtual-model-hook-bridge.js +200 -0
  221. package/src/web-ui.js +40 -0
  222. package/tests/agent-adapter-controller.test.js +361 -0
  223. package/tests/agent-approval-controller.test.js +173 -0
  224. package/tests/agent-context-bundles.test.js +278 -0
  225. package/tests/agent-dispatch-controller.test.js +679 -0
  226. package/tests/agent-gateway-config-controller.test.js +386 -0
  227. package/tests/agent-identity-migration.test.js +87 -0
  228. package/tests/agent-memory-controller.test.js +461 -0
  229. package/tests/agent-memory-import-snapshot.test.js +477 -0
  230. package/tests/agent-memory-query.test.js +404 -0
  231. package/tests/agent-memory-repository-source.test.js +514 -0
  232. package/tests/agent-mux-client.test.js +389 -0
  233. package/tests/agent-mux-integration.test.js +971 -0
  234. package/tests/agent-permission-review-v2.test.js +317 -0
  235. package/tests/agent-permission-review.test.js +209 -0
  236. package/tests/agent-persona-controller.test.js +127 -0
  237. package/tests/agent-project-controller.test.js +302 -0
  238. package/tests/agent-prompt-composition.test.js +76 -0
  239. package/tests/agent-provider-config-controller.test.js +376 -0
  240. package/tests/agent-resources.test.js +303 -0
  241. package/tests/agent-secret-config-grant.test.js +231 -0
  242. package/tests/agent-session-transcript-controller.test.js +499 -0
  243. package/tests/agent-stack-controller.test.js +283 -0
  244. package/tests/agent-subagent-controller.test.js +201 -0
  245. package/tests/agent-transport-binding-controller.test.js +294 -0
  246. package/tests/agent-trigger-controller.test.js +271 -0
  247. package/tests/agent-trigger-routes.test.js +190 -0
  248. package/tests/agent-trigger-sources.test.js +245 -0
  249. package/tests/agent-workspace-controller.test.js +181 -0
  250. package/tests/agent-writeback.test.js +292 -0
  251. package/tests/approval-persistence.test.js +171 -0
  252. package/tests/artifact-registry.test.js +511 -0
  253. package/tests/assistant-runtime.test.js +506 -0
  254. package/tests/async-controller.test.js +252 -0
  255. package/tests/audit-controller.test.js +227 -0
  256. package/tests/codespace-controller.test.js +318 -0
  257. package/tests/controller-client.test.js +133 -0
  258. package/tests/deployment.test.js +527 -0
  259. package/tests/e2e/lifecycle.test.js +120 -0
  260. package/tests/event-bus-integration.test.js +355 -0
  261. package/tests/external-github-forge.test.js +560 -0
  262. package/tests/external-github-issues-cicd.test.js +520 -0
  263. package/tests/external-integration.test.js +470 -0
  264. package/tests/external-persistence.test.js +415 -0
  265. package/tests/external-provider-adapter.test.js +365 -0
  266. package/tests/external-resource-model.test.js +223 -0
  267. package/tests/external-webhook-sync.test.js +287 -0
  268. package/tests/external-write-conflict.test.js +353 -0
  269. package/tests/gitea-service.test.js +253 -0
  270. package/tests/health-check-real.test.js +165 -0
  271. package/tests/health-probes.test.js +90 -0
  272. package/tests/hooks-lifecycle.test.js +364 -0
  273. package/tests/integration/full-flow.test.js +266 -0
  274. package/tests/jitsi-agent-bridge.test.js +119 -0
  275. package/tests/jitsi-helm-integration.test.js +77 -0
  276. package/tests/jitsi-meeting-controller.test.js +170 -0
  277. package/tests/jitsi-resource-model.test.js +73 -0
  278. package/tests/jitsi-sync-controller.test.js +112 -0
  279. package/tests/kradle-inference-service.test.js +689 -0
  280. package/tests/kradle.test.js +779 -0
  281. package/tests/memory-search-wiring.test.js +270 -0
  282. package/tests/model-route-controller.test.js +733 -0
  283. package/tests/notification-controller.test.js +196 -0
  284. package/tests/notification-integration.test.js +179 -0
  285. package/tests/org-scoping.test.js +687 -0
  286. package/tests/runner-controller.test.js +327 -0
  287. package/tests/runner-integration.test.js +231 -0
  288. package/tests/session-cookie-hmac.test.js +151 -0
  289. package/tests/snapshot-performance.test.js +315 -0
  290. package/tests/sse-events.test.js +107 -0
  291. package/tests/virtual-model-controller.test.js +877 -0
  292. package/tests/virtual-model-hook-bridge.test.js +384 -0
  293. package/tests/webhook-trigger.test.js +198 -0
  294. package/tests/workspace-volumes.test.js +312 -0
  295. 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
+ ```