@dsh-enhanced/plugin-control-plane 0.1.31 → 0.1.34

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 (199) hide show
  1. package/README.md +352 -4
  2. package/bin/dsh-local-release-adapter.js +80 -16
  3. package/bin/dsh-npm-registry-adapter.js +613 -0
  4. package/bin/dsh-source-adoption-authority.js +12 -0
  5. package/bin/dsh-source-approval-authority.js +16 -0
  6. package/bin/dsh-source-release-authority.js +12 -0
  7. package/bin/dsh-systemd-host-attestor.js +707 -0
  8. package/bin/dsh-task-observation-authority.js +15 -0
  9. package/lib/adapter-process.d.ts +23 -0
  10. package/lib/adapter-process.d.ts.map +1 -0
  11. package/lib/adapter-process.js +305 -0
  12. package/lib/adapter-process.js.map +1 -0
  13. package/lib/adoption-coordinator.d.ts +63 -0
  14. package/lib/adoption-coordinator.d.ts.map +1 -0
  15. package/lib/adoption-coordinator.js +241 -0
  16. package/lib/adoption-coordinator.js.map +1 -0
  17. package/lib/adoption-handoff.d.ts +16 -0
  18. package/lib/adoption-handoff.d.ts.map +1 -0
  19. package/lib/adoption-handoff.js +11 -0
  20. package/lib/adoption-handoff.js.map +1 -0
  21. package/lib/attestation.d.ts.map +1 -1
  22. package/lib/attestation.js +49 -1
  23. package/lib/attestation.js.map +1 -1
  24. package/lib/catalog.d.ts.map +1 -1
  25. package/lib/catalog.js +29 -2
  26. package/lib/catalog.js.map +1 -1
  27. package/lib/cli.d.ts +33 -9
  28. package/lib/cli.d.ts.map +1 -1
  29. package/lib/cli.js +624 -178
  30. package/lib/cli.js.map +1 -1
  31. package/lib/deployment-readiness.d.ts +38 -0
  32. package/lib/deployment-readiness.d.ts.map +1 -0
  33. package/lib/deployment-readiness.js +154 -0
  34. package/lib/deployment-readiness.js.map +1 -0
  35. package/lib/effect-blocked-replay.d.ts +81 -0
  36. package/lib/effect-blocked-replay.d.ts.map +1 -0
  37. package/lib/effect-blocked-replay.js +259 -0
  38. package/lib/effect-blocked-replay.js.map +1 -0
  39. package/lib/errors.d.ts +6 -0
  40. package/lib/errors.d.ts.map +1 -0
  41. package/lib/errors.js +9 -0
  42. package/lib/errors.js.map +1 -0
  43. package/lib/foreground-deployment-runtime.d.ts +20 -0
  44. package/lib/foreground-deployment-runtime.d.ts.map +1 -0
  45. package/lib/foreground-deployment-runtime.js +79 -0
  46. package/lib/foreground-deployment-runtime.js.map +1 -0
  47. package/lib/foreground-deployment.d.ts +17 -0
  48. package/lib/foreground-deployment.d.ts.map +1 -0
  49. package/lib/foreground-deployment.js +43 -0
  50. package/lib/foreground-deployment.js.map +1 -0
  51. package/lib/host-attestor.d.ts +1 -1
  52. package/lib/host-attestor.d.ts.map +1 -1
  53. package/lib/host-attestor.js +51 -57
  54. package/lib/host-attestor.js.map +1 -1
  55. package/lib/index.d.ts +25 -2
  56. package/lib/index.d.ts.map +1 -1
  57. package/lib/index.js +11 -2
  58. package/lib/index.js.map +1 -1
  59. package/lib/npm-publish.d.ts +25 -0
  60. package/lib/npm-publish.d.ts.map +1 -0
  61. package/lib/npm-publish.js +280 -0
  62. package/lib/npm-publish.js.map +1 -0
  63. package/lib/owner-task-gap-types.d.ts +21 -0
  64. package/lib/owner-task-gap-types.d.ts.map +1 -0
  65. package/lib/owner-task-gap-types.js +2 -0
  66. package/lib/owner-task-gap-types.js.map +1 -0
  67. package/lib/owner-task-gaps.d.ts +24 -0
  68. package/lib/owner-task-gaps.d.ts.map +1 -0
  69. package/lib/owner-task-gaps.js +74 -0
  70. package/lib/owner-task-gaps.js.map +1 -0
  71. package/lib/post-activation.d.ts +33 -0
  72. package/lib/post-activation.d.ts.map +1 -0
  73. package/lib/post-activation.js +219 -0
  74. package/lib/post-activation.js.map +1 -0
  75. package/lib/registry-fetch.d.ts +50 -0
  76. package/lib/registry-fetch.d.ts.map +1 -0
  77. package/lib/registry-fetch.js +267 -0
  78. package/lib/registry-fetch.js.map +1 -0
  79. package/lib/release.d.ts +4 -4
  80. package/lib/release.d.ts.map +1 -1
  81. package/lib/release.js +142 -56
  82. package/lib/release.js.map +1 -1
  83. package/lib/replay-endpoint-protocol.d.ts +65 -0
  84. package/lib/replay-endpoint-protocol.d.ts.map +1 -0
  85. package/lib/replay-endpoint-protocol.js +183 -0
  86. package/lib/replay-endpoint-protocol.js.map +1 -0
  87. package/lib/replay-endpoint.d.ts +7 -0
  88. package/lib/replay-endpoint.d.ts.map +1 -0
  89. package/lib/replay-endpoint.js +193 -0
  90. package/lib/replay-endpoint.js.map +1 -0
  91. package/lib/replay-grant.d.ts +62 -0
  92. package/lib/replay-grant.d.ts.map +1 -0
  93. package/lib/replay-grant.js +208 -0
  94. package/lib/replay-grant.js.map +1 -0
  95. package/lib/replay-journal.d.ts +25 -0
  96. package/lib/replay-journal.d.ts.map +1 -0
  97. package/lib/replay-journal.js +275 -0
  98. package/lib/replay-journal.js.map +1 -0
  99. package/lib/runtime-observer-protocol.d.ts +63 -0
  100. package/lib/runtime-observer-protocol.d.ts.map +1 -0
  101. package/lib/runtime-observer-protocol.js +280 -0
  102. package/lib/runtime-observer-protocol.js.map +1 -0
  103. package/lib/runtime-observer.d.ts +8 -0
  104. package/lib/runtime-observer.d.ts.map +1 -0
  105. package/lib/runtime-observer.js +182 -0
  106. package/lib/runtime-observer.js.map +1 -0
  107. package/lib/service.d.ts +145 -1
  108. package/lib/service.d.ts.map +1 -1
  109. package/lib/service.js +734 -6
  110. package/lib/service.js.map +1 -1
  111. package/lib/source-adoption-authority.d.ts +65 -0
  112. package/lib/source-adoption-authority.d.ts.map +1 -0
  113. package/lib/source-adoption-authority.js +271 -0
  114. package/lib/source-adoption-authority.js.map +1 -0
  115. package/lib/source-adoption-runner.d.ts +28 -0
  116. package/lib/source-adoption-runner.d.ts.map +1 -0
  117. package/lib/source-adoption-runner.js +197 -0
  118. package/lib/source-adoption-runner.js.map +1 -0
  119. package/lib/source-approval-authority.d.ts +50 -0
  120. package/lib/source-approval-authority.d.ts.map +1 -0
  121. package/lib/source-approval-authority.js +412 -0
  122. package/lib/source-approval-authority.js.map +1 -0
  123. package/lib/source-approval-client.d.ts +32 -0
  124. package/lib/source-approval-client.d.ts.map +1 -0
  125. package/lib/source-approval-client.js +175 -0
  126. package/lib/source-approval-client.js.map +1 -0
  127. package/lib/source-build.d.ts +60 -0
  128. package/lib/source-build.d.ts.map +1 -0
  129. package/lib/source-build.js +311 -0
  130. package/lib/source-build.js.map +1 -0
  131. package/lib/source-context.d.ts +24 -0
  132. package/lib/source-context.d.ts.map +1 -0
  133. package/lib/source-context.js +99 -0
  134. package/lib/source-context.js.map +1 -0
  135. package/lib/source-job-types.d.ts +87 -0
  136. package/lib/source-job-types.d.ts.map +1 -0
  137. package/lib/source-job-types.js +2 -0
  138. package/lib/source-job-types.js.map +1 -0
  139. package/lib/source-jobs.d.ts +113 -0
  140. package/lib/source-jobs.d.ts.map +1 -0
  141. package/lib/source-jobs.js +535 -0
  142. package/lib/source-jobs.js.map +1 -0
  143. package/lib/source-release-authority.d.ts +35 -0
  144. package/lib/source-release-authority.d.ts.map +1 -0
  145. package/lib/source-release-authority.js +271 -0
  146. package/lib/source-release-authority.js.map +1 -0
  147. package/lib/source-release-client.d.ts +10 -0
  148. package/lib/source-release-client.d.ts.map +1 -0
  149. package/lib/source-release-client.js +24 -0
  150. package/lib/source-release-client.js.map +1 -0
  151. package/lib/source-release-runner.d.ts +31 -0
  152. package/lib/source-release-runner.d.ts.map +1 -0
  153. package/lib/source-release-runner.js +125 -0
  154. package/lib/source-release-runner.js.map +1 -0
  155. package/lib/source-versioning.d.ts +24 -0
  156. package/lib/source-versioning.d.ts.map +1 -0
  157. package/lib/source-versioning.js +213 -0
  158. package/lib/source-versioning.js.map +1 -0
  159. package/lib/source-workspace.d.ts +117 -0
  160. package/lib/source-workspace.d.ts.map +1 -0
  161. package/lib/source-workspace.js +458 -0
  162. package/lib/source-workspace.js.map +1 -0
  163. package/lib/sqlite.d.ts +1 -1
  164. package/lib/sqlite.d.ts.map +1 -1
  165. package/lib/sqlite.js +509 -7
  166. package/lib/sqlite.js.map +1 -1
  167. package/lib/store.d.ts +229 -6
  168. package/lib/store.d.ts.map +1 -1
  169. package/lib/store.js +2431 -383
  170. package/lib/store.js.map +1 -1
  171. package/lib/task-observation-authority.d.ts +29 -0
  172. package/lib/task-observation-authority.d.ts.map +1 -0
  173. package/lib/task-observation-authority.js +370 -0
  174. package/lib/task-observation-authority.js.map +1 -0
  175. package/lib/task-observation-client.d.ts +4 -0
  176. package/lib/task-observation-client.d.ts.map +1 -0
  177. package/lib/task-observation-client.js +20 -0
  178. package/lib/task-observation-client.js.map +1 -0
  179. package/lib/task-observation-runtime.d.ts +59 -0
  180. package/lib/task-observation-runtime.d.ts.map +1 -0
  181. package/lib/task-observation-runtime.js +331 -0
  182. package/lib/task-observation-runtime.js.map +1 -0
  183. package/lib/task-observation-store.d.ts +17 -0
  184. package/lib/task-observation-store.d.ts.map +1 -0
  185. package/lib/task-observation-store.js +115 -0
  186. package/lib/task-observation-store.js.map +1 -0
  187. package/lib/task-observation-types.d.ts +67 -0
  188. package/lib/task-observation-types.d.ts.map +1 -0
  189. package/lib/task-observation-types.js +2 -0
  190. package/lib/task-observation-types.js.map +1 -0
  191. package/lib/trust.d.ts +3 -0
  192. package/lib/trust.d.ts.map +1 -1
  193. package/lib/trust.js +0 -0
  194. package/lib/trust.js.map +1 -1
  195. package/lib/types.d.ts +275 -8
  196. package/lib/types.d.ts.map +1 -1
  197. package/lib/version.d.ts +1 -1
  198. package/lib/version.js +1 -1
  199. package/package.json +40 -5
@@ -0,0 +1,331 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { isAbsolute, resolve } from 'node:path';
3
+ import { controlPlaneDigest } from './store.js';
4
+ import { taskObservationDigest, taskObservationId } from './task-observation-store.js';
5
+ import { validateSourceApprovalClientConfig } from './source-approval-client.js';
6
+ import { requestTaskObservation } from './task-observation-client.js';
7
+ import { Ed25519PostActivationObservationAuthority } from './post-activation.js';
8
+ import { resolveTrustKey } from './trust.js';
9
+ const OWNER = 'plugin-control-plane-task-observations';
10
+ const EXECUTOR = 'plugin-control-plane-task-observations-v1';
11
+ const CATALOG = controlPlaneDigest({ executor: EXECUTOR, version: 1 });
12
+ const same = (a, b) => controlPlaneDigest(a) === controlPlaneDigest(b);
13
+ export function taskObservationOwner(owner) {
14
+ const { authorityId, authorityHash, principalId, principalRecordId, principalVersion, workspace, agentPreset } = owner;
15
+ return { authorityId, authorityHash, principalId, principalRecordId, principalVersion, workspace, agentPreset };
16
+ }
17
+ export function validateTaskObservationConfig(config) {
18
+ const exact = (value, keys) => !!value && typeof value === 'object' && !Array.isArray(value)
19
+ && Object.keys(value).sort().join(',') === keys;
20
+ const integer = (value, min, max) => Number.isSafeInteger(value) && value >= min && value <= max;
21
+ const text = (value) => typeof value === 'string' && value.length > 0 && value.length <= 4096
22
+ && value.normalize('NFC').trim() === value && !/[\p{Cc}]/u.test(value);
23
+ if (!exact(config, 'authority,budgetAmount,budgetId,policy,profilePath,scope,timeoutMs')
24
+ || !exact(config.policy, 'expiresAt,id,lookbackMs,maximumChecks,maximumObservations,minimumChecks')
25
+ || !exact(config.scope, 'ownerRouteId,preset,principalId,workspace')
26
+ || !/^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/u.test(config.policy.id)
27
+ || !integer(config.policy.expiresAt, 1, 8_640_000_000_000_000)
28
+ || !integer(config.policy.maximumObservations, 1, 1000)
29
+ || !integer(config.policy.minimumChecks, 1, 32) || !integer(config.policy.maximumChecks, config.policy.minimumChecks, 32)
30
+ || !integer(config.policy.lookbackMs, 1000, 30 * 86_400_000) || !integer(config.timeoutMs, 1000, 300_000)
31
+ || !text(config.budgetId) || config.budgetId.length > 128 || !integer(config.budgetAmount, 1, 10_000_000)
32
+ || !Object.values(config.scope).every(text) || !text(config.profilePath)
33
+ || ![config.profilePath, config.scope.workspace].every(path => isAbsolute(path) && resolve(path) === path))
34
+ throw new Error('invalid taskObservations configuration');
35
+ validateSourceApprovalClientConfig(config.authority);
36
+ }
37
+ /** Trusted real-task cohorts; no model calls and no private scheduler. */
38
+ export class TaskObservationRuntime {
39
+ options;
40
+ lane;
41
+ configDigest;
42
+ trustDigest;
43
+ scanId;
44
+ generation = randomUUID();
45
+ activationNonce;
46
+ abort = new AbortController();
47
+ flights = new Set();
48
+ unregister;
49
+ unsubscribe;
50
+ closing;
51
+ active = false;
52
+ scanning = false;
53
+ lastError = null;
54
+ constructor(options) {
55
+ this.options = options;
56
+ validateTaskObservationConfig(options.config);
57
+ this.lane = controlPlaneDigest({ scope: options.config.scope, profilePath: options.config.profilePath });
58
+ this.configDigest = controlPlaneDigest(options.config);
59
+ this.trustDigest = controlPlaneDigest(options.trust);
60
+ this.scanId = `task-observation-scan-${this.lane}`;
61
+ this.activationNonce = controlPlaneDigest({ config: this.configDigest, generation: this.generation });
62
+ }
63
+ start() {
64
+ this.unregister = this.options.automations.registerHostExecutor({
65
+ descriptor: { executorId: EXECUTOR, contractVersion: 1, catalogDigest: CATALOG },
66
+ accepts: spec => spec.executorId === EXECUTOR && spec.executorContractVersion === 1 && spec.catalogDigest === CATALOG
67
+ && spec.runbookId === 'observe' && spec.runbookVersion === 1,
68
+ execute: input => {
69
+ const flight = this.execute(input);
70
+ this.flights.add(flight);
71
+ void flight.finally(() => this.flights.delete(flight)).catch(() => { });
72
+ return flight;
73
+ },
74
+ });
75
+ this.active = true;
76
+ this.unsubscribe = this.options.evaluation.onTrustedTaskChange(() => this.scan());
77
+ this.options.automations.reconcileSystem({ owner: OWNER, automationId: this.scanId,
78
+ idempotencyKey: `${this.scanId}:${this.generation}`, desiredStatus: 'active', definition: this.definition() });
79
+ this.scan();
80
+ }
81
+ close() {
82
+ return this.closing ??= (async () => {
83
+ this.active = false;
84
+ try {
85
+ const current = this.options.automations.inspectSystemOwnedActivation({ owner: OWNER, automationId: this.scanId });
86
+ if (current?.activationNonce === this.activationNonce)
87
+ this.options.automations.reconcileSystem({ owner: OWNER,
88
+ automationId: this.scanId, idempotencyKey: `${this.scanId}:${this.generation}:pause`, desiredStatus: 'paused', definition: this.definition() });
89
+ }
90
+ finally {
91
+ this.abort.abort();
92
+ try {
93
+ this.unsubscribe?.();
94
+ }
95
+ finally {
96
+ try {
97
+ this.unregister?.();
98
+ }
99
+ finally {
100
+ await Promise.allSettled(this.flights);
101
+ this.options.store.close();
102
+ }
103
+ }
104
+ }
105
+ })();
106
+ }
107
+ health = () => ({ connected: this.active, lastError: this.lastError });
108
+ current() {
109
+ this.abort.signal.throwIfAborted();
110
+ if (!this.active)
111
+ throw new Error('task observation runtime unavailable');
112
+ this.options.assertCurrent();
113
+ }
114
+ owner() {
115
+ this.current();
116
+ const scope = this.options.config.scope;
117
+ return taskObservationOwner(this.options.delivery.validateOwnerRoute({ authorityId: scope.ownerRouteId,
118
+ principalId: scope.principalId, workspace: scope.workspace, agentPreset: scope.preset }));
119
+ }
120
+ source(inboxId) {
121
+ const owner = this.owner();
122
+ const scope = this.options.evaluation.canonicalHostScope({ workspace: owner.workspace, preset: owner.agentPreset });
123
+ const canonical = this.options.evaluation.getTrustedForegroundLearningProjection({ scope, inboxId });
124
+ if (!canonical)
125
+ return undefined;
126
+ const source = this.options.delivery.inspectOwnerForegroundLearningTask({ authorityId: owner.authorityId,
127
+ principalId: owner.principalId, workspace: owner.workspace, agentPreset: owner.agentPreset, outcomeId: canonical.triggerOutcomeId });
128
+ if (!source || !same(taskObservationOwner(source.owner), owner) || !same(source.canonical.projection, canonical.projection)
129
+ || source.source.inboxId !== inboxId)
130
+ return undefined;
131
+ return source;
132
+ }
133
+ vote(deployment, source) {
134
+ const now = Date.now(), status = source?.canonical.objective?.status;
135
+ if (!source || !['owner-feedback', 'independent-verifier'].includes(source.judgement)
136
+ || (status !== 'achieved' && status !== 'not-achieved') || source.ownerRevision?.action === 'withdraw'
137
+ || source.canonical.projection.subjectKind !== 'foreground-turn' || source.canonical.projection.disposition !== 'upsert'
138
+ || source.canonical.projection.subjectRef !== deployment.task.inboxId || !source.source.quiescent || source.source.truncated
139
+ || source.source.sessionId !== deployment.task.sessionId || deployment.state !== 'observed' || !deployment.execution
140
+ || source.owner.principalRecordId !== deployment.task.owner.principalRecordId
141
+ || source.owner.principalVersion !== deployment.task.owner.principalVersion
142
+ || source.owner.workspace !== deployment.task.scope.workspace || source.owner.agentPreset !== deployment.task.scope.preset
143
+ || deployment.execution.completedAt > now || now - deployment.execution.completedAt > this.options.config.policy.lookbackMs
144
+ || (source.canonical.objective?.occurredAt ?? now + 1) > now)
145
+ return undefined;
146
+ return { inboxId: deployment.task.inboxId, outcomeId: source.canonical.triggerOutcomeId, projection: { ...source.canonical.projection },
147
+ sourceDigest: controlPlaneDigest({ protocol: source.protocol, source: source.source, judgement: source.judgement, ownerRevision: source.ownerRevision }),
148
+ deploymentDigest: controlPlaneDigest(deployment), status, completedAt: deployment.execution.completedAt };
149
+ }
150
+ read(batch) {
151
+ this.current();
152
+ if (batch.configDigest !== this.configDigest || batch.trustDigest !== this.trustDigest || batch.expiresAt <= Date.now()
153
+ || !same(batch.owner, this.owner()))
154
+ throw new Error('task observation authority changed or expired');
155
+ return batch.votes.map(expected => {
156
+ const deployment = this.options.store.getForegroundDeployment(expected.inboxId), source = this.source(expected.inboxId);
157
+ if (!deployment || !source || !same(this.vote(deployment, source), expected))
158
+ throw new Error('task observation source changed');
159
+ return source;
160
+ });
161
+ }
162
+ fence(batch, callback) {
163
+ const sources = this.read(batch);
164
+ if (this.options.store.getTaskObservation(batch.id))
165
+ this.options.store.assertCurrentTaskObservation(batch.id);
166
+ const scope = this.options.evaluation.canonicalHostScope({ workspace: batch.owner.workspace, preset: batch.owner.agentPreset });
167
+ const result = this.options.evaluation.withTrustedCanonicalTaskWriterFence({ scope,
168
+ scopeWatermark: Math.max(...sources.map(source => source.canonical.scopeWatermark)), evidence: batch.votes.map(vote => vote.projection) }, () => {
169
+ this.read(batch);
170
+ return callback();
171
+ });
172
+ if (!result.matched)
173
+ throw new Error('task observation canonical writer fence changed');
174
+ return result.value;
175
+ }
176
+ /** Bounded synchronous nudge; the persisted native cron owns asynchronous work. */
177
+ scan = () => {
178
+ if (!this.active || this.scanning)
179
+ return;
180
+ this.scanning = true;
181
+ try {
182
+ this.current();
183
+ this.lastError = null;
184
+ const store = this.options.store, now = Date.now(), config = this.options.config;
185
+ const prior = store.listTaskObservations(this.lane, 1000);
186
+ for (const record of prior.filter(record => record.state === 'pending' || record.state === 'signed')) {
187
+ try {
188
+ this.fence(record.batch, () => { });
189
+ return;
190
+ }
191
+ catch {
192
+ store.staleTaskObservation(record.batch.id);
193
+ }
194
+ }
195
+ if (now >= config.policy.expiresAt)
196
+ return;
197
+ const owner = this.owner();
198
+ const groups = new Map();
199
+ for (const deployment of store.listObservedForegroundDeployments(config.profilePath, 1000)) {
200
+ const vote = this.vote(deployment, this.source(deployment.task.inboxId));
201
+ if (!vote || store.hasAppliedTaskObservationVote(this.lane, vote.inboxId, vote.projection.digest))
202
+ continue;
203
+ let group = groups.get(deployment.readiness.planId);
204
+ if (!group)
205
+ groups.set(deployment.readiness.planId, group = { deployment, votes: [] });
206
+ if (group.votes.length < config.policy.maximumChecks)
207
+ group.votes.push(vote);
208
+ }
209
+ for (const { deployment, votes } of groups.values()) {
210
+ if (votes.length < config.policy.minimumChecks)
211
+ continue;
212
+ votes.sort((a, b) => a.inboxId.localeCompare(b.inboxId));
213
+ const readiness = deployment.readiness;
214
+ const core = { lane: this.lane, configDigest: this.configDigest, trustDigest: this.trustDigest,
215
+ planId: readiness.planId, planDigest: readiness.planDigest, installationId: readiness.installationId,
216
+ profilePath: config.profilePath, owner, policy: config.policy, hostGeneration: readiness.hostGeneration, votes };
217
+ const id = taskObservationId(core);
218
+ if (store.getTaskObservation(id))
219
+ continue;
220
+ const unsigned = { schemaVersion: 1, kind: 'dsh-task-observation', id, ...core, createdAt: now,
221
+ expiresAt: Math.min(config.policy.expiresAt, ...votes.map(vote => vote.completedAt + config.policy.lookbackMs)) };
222
+ const batch = { ...unsigned, digest: taskObservationDigest(unsigned) };
223
+ try {
224
+ this.fence(batch, () => store.putTaskObservation(batch));
225
+ break;
226
+ }
227
+ catch { /* Historical deployments and racing current feedback are ineligible. */ }
228
+ }
229
+ this.lastError = null;
230
+ }
231
+ catch (error) {
232
+ this.lastError = error instanceof Error ? error.message.slice(0, 200) : 'task observation scan failed';
233
+ }
234
+ finally {
235
+ this.scanning = false;
236
+ }
237
+ };
238
+ definition() {
239
+ const { scope, timeoutMs, budgetId, budgetAmount } = this.options.config;
240
+ return { name: 'Observe deployed plugin task feedback', schedule: { kind: 'cron', expression: '* * * * *', timezone: 'UTC' },
241
+ workspace: scope.workspace, agentPreset: scope.preset, timeoutMs, misfire: { kind: 'latest' }, overlap: 'skip',
242
+ retrySafety: 'never', maxRetries: 0, principal: scope.principalId, budgetId, budgetAmount,
243
+ execution: { kind: 'host', executorId: EXECUTOR, executorContractVersion: 1, runbookId: 'observe', runbookVersion: 1,
244
+ catalogDigest: CATALOG, targetScope: { workspace: scope.workspace, preset: scope.preset },
245
+ scopeDigest: controlPlaneDigest([scope.workspace, scope.preset]), ownerRouteId: scope.ownerRouteId, activationNonce: this.activationNonce } };
246
+ }
247
+ async execute(input) {
248
+ let began = false;
249
+ try {
250
+ const owner = this.owner();
251
+ const registration = this.options.automations.inspectSystemOwnedActivation({ owner: OWNER, automationId: this.scanId });
252
+ if (input.executionMode !== 'production' || input.automationId !== this.scanId || input.activationNonce !== this.activationNonce
253
+ || input.definitionHash !== registration?.definitionHash || input.catalogDigest !== CATALOG
254
+ || registration.activationNonce !== this.activationNonce || input.ownerRouteId !== owner.authorityId
255
+ || input.principal !== owner.principalId || input.targetScope.workspace !== owner.workspace
256
+ || input.targetScope.preset !== owner.agentPreset)
257
+ throw new Error('task observation dispatch changed');
258
+ const signal = AbortSignal.any([this.abort.signal, input.signal, AbortSignal.timeout(this.options.config.timeoutMs)]);
259
+ signal.throwIfAborted();
260
+ began = true;
261
+ this.scan();
262
+ for (const record of this.options.store.listTaskObservations(this.lane, 1000)) {
263
+ signal.throwIfAborted();
264
+ this.current();
265
+ if (record.state === 'applied' && record.receipt?.disposition === 'regressed') {
266
+ // A committed rollback obligation survives feedback changes and grant expiry.
267
+ if (record.batch.profilePath !== this.options.config.profilePath || record.batch.trustDigest !== this.trustDigest)
268
+ continue;
269
+ if (this.options.store.getPlan(record.batch.planId).status !== 'rolled-back')
270
+ await this.options.rollback(record.batch.planId, signal);
271
+ continue;
272
+ }
273
+ if (record.state !== 'pending' && record.state !== 'signed')
274
+ continue;
275
+ try {
276
+ this.fence(record.batch, () => { });
277
+ }
278
+ catch {
279
+ this.options.store.staleTaskObservation(record.batch.id);
280
+ continue;
281
+ }
282
+ const receipt = record.receipt ?? await (this.options.request?.(record.batch, signal)
283
+ ?? requestTaskObservation(this.options.config.authority, { protocol: 'dsh-task-observation/v1',
284
+ observationId: record.batch.id, observationDigest: record.batch.digest }, signal));
285
+ signal.throwIfAborted();
286
+ this.current();
287
+ if (receipt.expiresAt <= Date.now()) {
288
+ this.options.store.staleTaskObservation(record.batch.id);
289
+ continue;
290
+ }
291
+ try {
292
+ this.fence(record.batch, () => { });
293
+ }
294
+ catch {
295
+ this.options.store.staleTaskObservation(record.batch.id);
296
+ continue;
297
+ }
298
+ const key = resolveTrustKey(this.options.trust, 'host-attestation', receipt.authority, receipt.keyId);
299
+ const authority = new Ed25519PostActivationObservationAuthority(key.publicKeyPem, key.authority, key.keyId, { receiptTtlMs: 300_000 });
300
+ try {
301
+ await authority.verify(receipt, this.options.store.getPlan(record.batch.planId), this.options.store.getActivationWatch(record.batch.planId).exact);
302
+ signal.throwIfAborted();
303
+ this.fence(record.batch, () => this.options.store.signTaskObservation(record.batch.id, receipt));
304
+ }
305
+ catch (error) {
306
+ this.options.store.staleTaskObservation(record.batch.id);
307
+ throw error;
308
+ }
309
+ await this.options.store.recordPostActivationObservation({ receipt, taskObservationId: record.batch.id,
310
+ idempotencyKey: `post-activation-observation:${receipt.observationId}`,
311
+ withSourceFence: callback => { signal.throwIfAborted(); return this.fence(record.batch, callback); },
312
+ resolveAuthority: value => {
313
+ this.current();
314
+ const key = resolveTrustKey(this.options.trust, 'host-attestation', value.authority, value.keyId);
315
+ return new Ed25519PostActivationObservationAuthority(key.publicKeyPem, key.authority, key.keyId, { receiptTtlMs: 300_000 });
316
+ } });
317
+ if (receipt.disposition === 'regressed')
318
+ await this.options.rollback(record.batch.planId, signal);
319
+ }
320
+ if (this.lastError)
321
+ throw new Error(this.lastError);
322
+ return { outcome: 'succeeded', failureClass: 'none', failurePhase: 'none', failureCode: 'none', sideEffectState: 'possible', retryability: 'unsafe' };
323
+ }
324
+ catch (error) {
325
+ this.lastError = error instanceof Error ? error.message.slice(0, 200) : 'task observation failed';
326
+ return { outcome: began ? 'unknown' : 'failed', failureClass: began ? 'unknown' : 'configuration', failurePhase: 'host-execution',
327
+ failureCode: 'task-observation-rejected', sideEffectState: began ? 'unknown' : 'none', retryability: began ? 'unsafe' : 'after-intervention' };
328
+ }
329
+ }
330
+ }
331
+ //# sourceMappingURL=task-observation-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-observation-runtime.js","sourceRoot":"","sources":["../src/task-observation-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { DatabaseSync } from 'node:sqlite';
2
+ import { type ForegroundDeploymentRecord } from './foreground-deployment.js';
3
+ import { readOwnerSourceAdoptionPlan } from './store.js';
4
+ import type { PluginActivationPlan } from './types.js';
5
+ import type { TaskObservationBatch, TaskObservationRecord } from './task-observation-types.js';
6
+ export declare function taskObservationId(batch: Omit<TaskObservationBatch, 'schemaVersion' | 'kind' | 'id' | 'digest' | 'createdAt' | 'expiresAt'>): string;
7
+ export declare function taskObservationDigest(batch: Omit<TaskObservationBatch, 'digest'>): string;
8
+ export declare function assertTaskObservationBatch(value: unknown): asserts value is TaskObservationBatch;
9
+ export declare function getTaskObservationRecord(db: DatabaseSync, id: string): TaskObservationRecord | undefined;
10
+ /** Read-only durable cohort validation; canonical quality is fenced by the Host. */
11
+ export declare function readTaskObservationContext(db: DatabaseSync, id: string): {
12
+ record: TaskObservationRecord;
13
+ plan: PluginActivationPlan;
14
+ source: ReturnType<typeof readOwnerSourceAdoptionPlan>['source'];
15
+ deployments: readonly ForegroundDeploymentRecord[];
16
+ };
17
+ //# sourceMappingURL=task-observation-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-observation-store.d.ts","sourceRoot":"","sources":["../src/task-observation-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,OAAO,EAA8B,KAAK,0BAA0B,EAAE,MAAM,4BAA4B,CAAA;AAExG,OAAO,EAA8C,2BAA2B,EAAE,MAAM,YAAY,CAAA;AAEpG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AACtD,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AAW9F,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC,GAAG,MAAM,CAInJ;AACD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,GAAG,MAAM,CAGzF;AACD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,oBAAoB,CAyBhG;AAED,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAaxG;AAED,oFAAoF;AACpF,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,GAAG;IACxE,MAAM,EAAE,qBAAqB,CAAC;IAAC,IAAI,EAAE,oBAAoB,CAAA;IACzD,MAAM,EAAE,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAC,QAAQ,CAAC,CAAC;IAAC,WAAW,EAAE,SAAS,0BAA0B,EAAE,CAAA;CACrH,CAwCA"}
@@ -0,0 +1,115 @@
1
+ import { isAbsolute, resolve } from 'node:path';
2
+ import { assertForegroundDeployment } from './foreground-deployment.js';
3
+ import { controlPlaneSchemaVersion } from './sqlite.js';
4
+ import { controlPlaneDigest, ControlPlaneStoreError, readOwnerSourceAdoptionPlan } from './store.js';
5
+ import { parsePostActivationObservation } from './post-activation.js';
6
+ const ID = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/u;
7
+ const DIGEST = /^[a-f0-9]{64}$/u;
8
+ const fail = (message) => { throw new ControlPlaneStoreError('invalid-state', message); };
9
+ const same = (a, b) => controlPlaneDigest(a) === controlPlaneDigest(b);
10
+ const integer = (value, min, max = Number.MAX_SAFE_INTEGER) => Number.isSafeInteger(value) && value >= min && value <= max;
11
+ const text = (value) => typeof value === 'string' && value.length > 0 && value.length <= 4096
12
+ && value.normalize('NFC').trim() === value && !/[\p{Cc}]/u.test(value);
13
+ const path = (value) => text(value) && isAbsolute(value) && resolve(value) === value;
14
+ export function taskObservationId(batch) {
15
+ return `task-observation-${controlPlaneDigest({ lane: batch.lane, configDigest: batch.configDigest, trustDigest: batch.trustDigest,
16
+ planId: batch.planId, planDigest: batch.planDigest, installationId: batch.installationId, profilePath: batch.profilePath,
17
+ owner: batch.owner, policy: batch.policy, hostGeneration: batch.hostGeneration, votes: batch.votes })}`;
18
+ }
19
+ export function taskObservationDigest(batch) {
20
+ const { digest: _digest, ...unsigned } = batch;
21
+ return controlPlaneDigest(unsigned);
22
+ }
23
+ export function assertTaskObservationBatch(value) {
24
+ const batch = value;
25
+ if (!batch || typeof batch !== 'object' || batch.schemaVersion !== 1 || batch.kind !== 'dsh-task-observation'
26
+ || !ID.test(batch.id) || !DIGEST.test(batch.digest) || !DIGEST.test(batch.lane) || !DIGEST.test(batch.configDigest)
27
+ || !DIGEST.test(batch.trustDigest) || !ID.test(batch.planId) || !DIGEST.test(batch.planDigest) || !Array.isArray(batch.votes)
28
+ || !path(batch.profilePath) || !text(batch.installationId) || !integer(batch.hostGeneration, 1)
29
+ || !integer(batch.createdAt, 1) || !integer(batch.expiresAt, batch.createdAt + 1)
30
+ || !batch.policy || !ID.test(batch.policy.id) || !integer(batch.policy.expiresAt, batch.expiresAt)
31
+ || !integer(batch.policy.maximumObservations, 1, 1000) || !integer(batch.policy.minimumChecks, 1, 32)
32
+ || !integer(batch.policy.maximumChecks, batch.policy.minimumChecks, 32) || !integer(batch.policy.lookbackMs, 1000, 30 * 86_400_000)
33
+ || batch.votes.length < batch.policy.minimumChecks || batch.votes.length > batch.policy.maximumChecks
34
+ || !batch.owner || ![batch.owner.authorityId, batch.owner.principalId, batch.owner.principalRecordId, batch.owner.agentPreset].every(text)
35
+ || !DIGEST.test(batch.owner.authorityHash) || !path(batch.owner.workspace) || !integer(batch.owner.principalVersion, 1)
36
+ || Buffer.byteLength(JSON.stringify(batch)) > 262_144)
37
+ fail('task observation batch is invalid');
38
+ const seen = new Set();
39
+ for (const vote of batch.votes) {
40
+ if (!vote || !text(vote.inboxId) || !text(vote.outcomeId) || !DIGEST.test(vote.sourceDigest) || !DIGEST.test(vote.deploymentDigest)
41
+ || !['achieved', 'not-achieved'].includes(vote.status) || !integer(vote.completedAt, 1, batch.createdAt)
42
+ || batch.expiresAt > vote.completedAt + batch.policy.lookbackMs || !vote.projection
43
+ || vote.projection.subjectKind !== 'foreground-turn' || vote.projection.subjectRef !== vote.inboxId
44
+ || vote.projection.disposition !== 'upsert' || !integer(vote.projection.version, 1) || !DIGEST.test(vote.projection.digest)
45
+ || seen.has(vote.inboxId))
46
+ fail('task observation vote is invalid');
47
+ seen.add(vote.inboxId);
48
+ }
49
+ if (batch.id !== taskObservationId(batch) || batch.digest !== taskObservationDigest(batch))
50
+ fail('task observation digest differs');
51
+ }
52
+ export function getTaskObservationRecord(db, id) {
53
+ const row = db.prepare('SELECT id,lane,plan_id,batch_json,batch_digest,state,receipt_json,receipt_digest FROM task_observation_batches WHERE id=?').get(id);
54
+ if (!row)
55
+ return undefined;
56
+ if (Buffer.byteLength(row.batch_json) > 262_144)
57
+ fail('stored task observation exceeds bound');
58
+ const batch = JSON.parse(row.batch_json);
59
+ assertTaskObservationBatch(batch);
60
+ if (controlPlaneDigest(batch) !== row.batch_digest || batch.id !== row.id || batch.lane !== row.lane || batch.planId !== row.plan_id
61
+ || !['pending', 'signed', 'applied', 'stale'].includes(row.state))
62
+ fail('stored task observation changed');
63
+ const receipt = row.receipt_json === null ? undefined : parsePostActivationObservation(JSON.parse(row.receipt_json));
64
+ if (receipt && (controlPlaneDigest(receipt) !== row.receipt_digest || receipt.observationId !== id || receipt.evidence.probeDigest !== batch.digest))
65
+ fail('stored task observation receipt changed');
66
+ if ((row.state === 'signed' || row.state === 'applied') && !receipt)
67
+ fail('stored task observation receipt missing');
68
+ return Object.freeze({ batch, state: row.state, ...(receipt === undefined ? {} : { receipt }) });
69
+ }
70
+ /** Read-only durable cohort validation; canonical quality is fenced by the Host. */
71
+ export function readTaskObservationContext(db, id) {
72
+ if (Number(db.prepare('PRAGMA user_version').get()?.user_version) !== controlPlaneSchemaVersion)
73
+ fail('task observation database version is invalid');
74
+ const record = getTaskObservationRecord(db, id);
75
+ if (!record)
76
+ return fail('task observation absent');
77
+ const { batch } = record;
78
+ const adopted = readOwnerSourceAdoptionPlan(db, batch.planId), plan = adopted.plan;
79
+ if (batch.planDigest !== plan.digest || batch.installationId !== plan.installationId || batch.profilePath !== plan.target.profilePath)
80
+ fail('task observation plan changed');
81
+ for (const key of ['authorityId', 'authorityHash', 'principalId', 'principalRecordId', 'principalVersion', 'workspace', 'agentPreset']) {
82
+ if (batch.owner[key] !== adopted.source.owner[key])
83
+ fail('task observation source owner changed');
84
+ }
85
+ const unsettled = db.prepare(`SELECT 1 FROM activation_plans WHERE target_path=? AND status IN (
86
+ 'staging','awaiting-reload','awaiting-readiness','awaiting-effect-blocked-replay','awaiting-shadow',
87
+ 'awaiting-canary','awaiting-soak','awaiting-health','commit-pending','rollback-pending') LIMIT 1`).get(plan.target.profilePath);
88
+ const latest = db.prepare(`SELECT checkpoint.plan_id,checkpoint.exposure_order,checkpoint.successful_order
89
+ FROM activation_deployment_checkpoints checkpoint JOIN activation_plans candidate ON candidate.id=checkpoint.plan_id
90
+ WHERE candidate.target_path=? ORDER BY checkpoint.exposure_order DESC LIMIT 1`).get(plan.target.profilePath);
91
+ const watch = db.prepare('SELECT state,activation_id,fence,started_at,last_host_generation FROM activation_watch WHERE plan_id=?').get(plan.id);
92
+ if (unsettled || latest?.plan_id !== plan.id || latest.exposure_order !== latest.successful_order || plan.status !== 'activated'
93
+ || !plan.activation || !watch || watch.state !== 'watching' || watch.activation_id !== plan.activation.id
94
+ || watch.fence !== plan.activation.fence || watch.last_host_generation !== batch.hostGeneration)
95
+ return fail('task observation deployment is no longer current');
96
+ const deployments = batch.votes.map(vote => {
97
+ const row = db.prepare('SELECT record_json,record_digest,plan_id FROM foreground_deployments WHERE inbox_id=?').get(vote.inboxId);
98
+ if (!row || row.plan_id !== plan.id || Buffer.byteLength(row.record_json) > 262_144)
99
+ return fail('task observation deployment absent');
100
+ const item = JSON.parse(row.record_json);
101
+ assertForegroundDeployment(item);
102
+ if (controlPlaneDigest(item) !== row.record_digest || row.record_digest !== vote.deploymentDigest
103
+ || item.state !== 'observed' || !item.execution || item.execution.completedAt !== vote.completedAt || item.task.inboxId !== vote.inboxId
104
+ || item.task.owner.principalRecordId !== batch.owner.principalRecordId || item.task.owner.principalVersion !== batch.owner.principalVersion
105
+ || item.task.scope.workspace !== batch.owner.workspace || item.task.scope.preset !== batch.owner.agentPreset
106
+ || item.task.dispatchedAt < watch.started_at || item.readiness.planId !== plan.id || item.readiness.planDigest !== plan.digest
107
+ || item.readiness.hostGeneration !== batch.hostGeneration || item.readiness.installationId !== batch.installationId
108
+ || item.readiness.profilePath !== batch.profilePath || item.readiness.activationId !== plan.activation.id
109
+ || item.readiness.fence !== plan.activation.fence || !same(item.readiness.exact, { package: plan.candidate.package, version: plan.candidate.version, integrity: plan.candidate.integrity }))
110
+ fail('task observation deployment witness changed');
111
+ return item;
112
+ });
113
+ return { record, plan, source: adopted.source, deployments };
114
+ }
115
+ //# sourceMappingURL=task-observation-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-observation-store.js","sourceRoot":"","sources":["../src/task-observation-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import type { EvaluationCanonicalLearningEvidenceTuple } from '@dsh-enhanced/assistant-evaluation';
2
+ import type { SourceJobOwnerReceipt } from './source-job-types.js';
3
+ import type { SourceApprovalClientConfig } from './source-approval-client.js';
4
+ import type { PostActivationObservationReceipt } from './types.js';
5
+ export type TaskObservationOwner = Pick<SourceJobOwnerReceipt, 'authorityId' | 'authorityHash' | 'principalId' | 'principalRecordId' | 'principalVersion' | 'workspace' | 'agentPreset'>;
6
+ export interface TaskObservationPolicy {
7
+ id: string;
8
+ expiresAt: number;
9
+ maximumObservations: number;
10
+ minimumChecks: number;
11
+ maximumChecks: number;
12
+ lookbackMs: number;
13
+ }
14
+ export interface TaskObservationConfig {
15
+ policy: TaskObservationPolicy;
16
+ scope: {
17
+ ownerRouteId: string;
18
+ principalId: string;
19
+ workspace: string;
20
+ preset: string;
21
+ };
22
+ profilePath: string;
23
+ timeoutMs: number;
24
+ budgetId: string;
25
+ budgetAmount: number;
26
+ authority: SourceApprovalClientConfig;
27
+ }
28
+ /** Facts reread from trusted Delivery/Evaluation, never an Agent's rating. */
29
+ export interface TaskObservationVote {
30
+ inboxId: string;
31
+ outcomeId: string;
32
+ projection: EvaluationCanonicalLearningEvidenceTuple;
33
+ sourceDigest: string;
34
+ deploymentDigest: string;
35
+ status: 'achieved' | 'not-achieved';
36
+ completedAt: number;
37
+ }
38
+ export interface TaskObservationBatch {
39
+ schemaVersion: 1;
40
+ kind: 'dsh-task-observation';
41
+ id: string;
42
+ digest: string;
43
+ lane: string;
44
+ configDigest: string;
45
+ trustDigest: string;
46
+ planId: string;
47
+ planDigest: string;
48
+ installationId: string;
49
+ profilePath: string;
50
+ owner: TaskObservationOwner;
51
+ policy: TaskObservationPolicy;
52
+ hostGeneration: number;
53
+ votes: readonly TaskObservationVote[];
54
+ createdAt: number;
55
+ expiresAt: number;
56
+ }
57
+ export interface TaskObservationRecord {
58
+ batch: TaskObservationBatch;
59
+ state: 'pending' | 'signed' | 'applied' | 'stale';
60
+ receipt?: PostActivationObservationReceipt;
61
+ }
62
+ export interface TaskObservationRequest {
63
+ protocol: 'dsh-task-observation/v1';
64
+ observationId: string;
65
+ observationDigest: string;
66
+ }
67
+ //# sourceMappingURL=task-observation-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-observation-types.d.ts","sourceRoot":"","sources":["../src/task-observation-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wCAAwC,EAAE,MAAM,oCAAoC,CAAA;AAClG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAC7E,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,YAAY,CAAA;AAElE,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,qBAAqB,EAAE,aAAa,GAAG,eAAe,GAAG,aAAa,GAC1G,mBAAmB,GAAG,kBAAkB,GAAG,WAAW,GAAG,aAAa,CAAC,CAAA;AAE3E,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,qBAAqB,CAAA;IAC7B,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACvF,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,0BAA0B,CAAA;CACtC;AAED,8EAA8E;AAC9E,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,wCAAwC,CAAA;IACpD,YAAY,EAAE,MAAM,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;IACxB,MAAM,EAAE,UAAU,GAAG,cAAc,CAAA;IACnC,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,CAAC,CAAA;IAChB,IAAI,EAAE,sBAAsB,CAAA;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,oBAAoB,CAAA;IAC3B,MAAM,EAAE,qBAAqB,CAAA;IAC7B,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,SAAS,mBAAmB,EAAE,CAAA;IACrC,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,oBAAoB,CAAA;IAC3B,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAA;IACjD,OAAO,CAAC,EAAE,gCAAgC,CAAA;CAC3C;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,yBAAyB,CAAA;IACnC,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;CAC1B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=task-observation-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-observation-types.js","sourceRoot":"","sources":["../src/task-observation-types.ts"],"names":[],"mappings":""}
package/lib/trust.d.ts CHANGED
@@ -42,6 +42,9 @@ export interface PluginControlTrustConfig {
42
42
  releaseRegistry?: {
43
43
  id: string;
44
44
  locator: string;
45
+ protocol?: 'dsh' | 'npm';
46
+ caPins: readonly string[];
47
+ tokenEnvironment: string | null;
45
48
  };
46
49
  releaseReceiptTtlMs: number;
47
50
  releaseAdapters?: Partial<Record<SourceReleasePhase, SourceReleaseAdapterIdentity & {