@deepseek-ai/dsh-webhook 0.1.6-alpha.2 → 0.1.7-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.js CHANGED
@@ -6,6 +6,64 @@ import { isAbsolute } from "node:path";
6
6
  import { brandString } from "@deepseek-ai/dsh-brand";
7
7
  //#region lib/types/session.js
8
8
  /** Workspace-backed Session creation for one settled webhook rule result. */
9
+ var __addDisposableResource = function(env, value, async) {
10
+ if (value !== null && value !== void 0) {
11
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
12
+ var dispose, inner;
13
+ if (async) {
14
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
15
+ dispose = value[Symbol.asyncDispose];
16
+ }
17
+ if (dispose === void 0) {
18
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
19
+ dispose = value[Symbol.dispose];
20
+ if (async) inner = dispose;
21
+ }
22
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
23
+ if (inner) dispose = function() {
24
+ try {
25
+ inner.call(this);
26
+ } catch (e) {
27
+ return Promise.reject(e);
28
+ }
29
+ };
30
+ env.stack.push({
31
+ value,
32
+ dispose,
33
+ async
34
+ });
35
+ } else if (async) env.stack.push({ async: true });
36
+ return value;
37
+ };
38
+ var __disposeResources = (function(SuppressedError) {
39
+ return function(env) {
40
+ function fail(e) {
41
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
42
+ env.hasError = true;
43
+ }
44
+ var r, s = 0;
45
+ function next() {
46
+ while (r = env.stack.pop()) try {
47
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
48
+ if (r.dispose) {
49
+ var result = r.dispose.call(r.value);
50
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) {
51
+ fail(e);
52
+ return next();
53
+ });
54
+ } else s |= 1;
55
+ } catch (e) {
56
+ fail(e);
57
+ }
58
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
59
+ if (env.hasError) throw env.error;
60
+ }
61
+ return next();
62
+ };
63
+ })(typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
64
+ var e = new Error(message);
65
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
66
+ });
9
67
  /** Require one non-empty string field from an untyped rule result. */
10
68
  function requiredString(record, field) {
11
69
  const value = record[field];
@@ -88,62 +146,75 @@ function installInitialModelSelection(agentCtx, selection) {
88
146
  * @param signal - registration lifetime cancellation through publication.
89
147
  */
90
148
  async function createWebhookSession(ctx, delivery, ruleId, request, signal) {
91
- const resolved = resolveRequest(ctx, request);
92
- ctx.permissionPresets.resolve(resolved.permissionPreset);
93
- const preset = await ctx.agentPresets.resolve(resolved.agentPreset);
94
- await ctx.agentPresets.standingKeyFor(preset.id);
95
- signal.throwIfAborted();
96
- const workspace = await ctx.workspaceRegistry.create(resolved.workspacePath);
97
- signal.throwIfAborted();
98
- const sessionId = brandString(`webhook-${randomUUID()}`);
99
- const handle = await ctx.agents.create({
100
- sessionId,
101
- signal,
102
- meta: {
103
- cwd: workspace.path,
104
- agentPreset: preset.id
105
- },
106
- agentOptions: resolved.agentOptions,
107
- setup: async (agentCtx) => {
108
- await ctx.agentPresets.mount(agentCtx, preset.id);
109
- installInitialModelSelection(agentCtx, resolved.modelSelection);
110
- }
111
- });
112
- let attached = false;
149
+ const env_1 = {
150
+ stack: [],
151
+ error: void 0,
152
+ hasError: false
153
+ };
113
154
  try {
155
+ const resolved = resolveRequest(ctx, request);
156
+ ctx.permissionPresets.resolve(resolved.permissionPreset);
157
+ const preset = await ctx.agentPresets.resolve(resolved.agentPreset);
158
+ __addDisposableResource(env_1, await ctx.agentPresets.acquireScope(preset.id), true);
114
159
  signal.throwIfAborted();
115
- await workspace.attachSession(sessionId);
116
- attached = true;
160
+ const workspace = await ctx.workspaceRegistry.create(resolved.workspacePath);
117
161
  signal.throwIfAborted();
118
- ctx.permissionPresets.set(handle.agent.session, resolved.permissionPreset);
119
- ctx.sessionTitle.rename(handle.agent.session, resolved.title);
120
- handle.agent.followup(createUserMessage({
121
- content: [{
122
- type: "text",
123
- text: resolved.prompt
124
- }],
125
- source: {
126
- kind: "webhook",
127
- provider: delivery.kind,
128
- source: delivery.source,
129
- deliveryId: delivery.deliveryId,
130
- ruleId,
131
- form: "notice",
132
- summary: boundContextSummary(`${delivery.kind} webhook handled by ${ruleId}`)
162
+ const sessionId = brandString(`webhook-${randomUUID()}`);
163
+ const handle = await ctx.agents.create({
164
+ sessionId,
165
+ signal,
166
+ meta: {
167
+ cwd: workspace.path,
168
+ agentPreset: preset.id
169
+ },
170
+ agentOptions: resolved.agentOptions,
171
+ setup: async (agentCtx) => {
172
+ await ctx.agentPresets.mount(agentCtx, preset.id);
173
+ installInitialModelSelection(agentCtx, resolved.modelSelection);
133
174
  }
134
- }));
135
- } catch (error) {
136
- if (attached) try {
137
- await workspace.detachSession(sessionId);
138
- } catch (rollbackError) {
139
- reportRollbackFailure(ctx, `Workspace detach for Session "${sessionId}"`, rollbackError);
140
- }
175
+ });
176
+ let attached = false;
141
177
  try {
142
- await handle.dispose();
143
- } catch (rollbackError) {
144
- reportRollbackFailure(ctx, `Agent disposal for Session "${sessionId}"`, rollbackError);
178
+ signal.throwIfAborted();
179
+ await workspace.attachSession(sessionId);
180
+ attached = true;
181
+ signal.throwIfAborted();
182
+ ctx.permissionPresets.set(handle.agent.session, resolved.permissionPreset);
183
+ ctx.sessionTitle.rename(handle.agent.session, resolved.title);
184
+ handle.agent.followup(createUserMessage({
185
+ content: [{
186
+ type: "text",
187
+ text: resolved.prompt
188
+ }],
189
+ source: {
190
+ kind: "webhook",
191
+ provider: delivery.kind,
192
+ source: delivery.source,
193
+ deliveryId: delivery.deliveryId,
194
+ ruleId,
195
+ form: "notice",
196
+ summary: boundContextSummary(`${delivery.kind} webhook handled by ${ruleId}`)
197
+ }
198
+ }));
199
+ } catch (error) {
200
+ if (attached) try {
201
+ await workspace.detachSession(sessionId);
202
+ } catch (rollbackError) {
203
+ reportRollbackFailure(ctx, `Workspace detach for Session "${sessionId}"`, rollbackError);
204
+ }
205
+ try {
206
+ await handle.dispose();
207
+ } catch (rollbackError) {
208
+ reportRollbackFailure(ctx, `Agent disposal for Session "${sessionId}"`, rollbackError);
209
+ }
210
+ throw error;
145
211
  }
146
- throw error;
212
+ } catch (e_1) {
213
+ env_1.error = e_1;
214
+ env_1.hasError = true;
215
+ } finally {
216
+ const result_1 = __disposeResources(env_1);
217
+ if (result_1) await result_1;
147
218
  }
148
219
  }
149
220
  //#endregion
@@ -1,4 +1,56 @@
1
1
  /** Workspace-backed Session creation for one settled webhook rule result. */
2
+ var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
3
+ if (value !== null && value !== void 0) {
4
+ if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
5
+ var dispose, inner;
6
+ if (async) {
7
+ if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
8
+ dispose = value[Symbol.asyncDispose];
9
+ }
10
+ if (dispose === void 0) {
11
+ if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
12
+ dispose = value[Symbol.dispose];
13
+ if (async) inner = dispose;
14
+ }
15
+ if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
16
+ if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
17
+ env.stack.push({ value: value, dispose: dispose, async: async });
18
+ }
19
+ else if (async) {
20
+ env.stack.push({ async: true });
21
+ }
22
+ return value;
23
+ };
24
+ var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
25
+ return function (env) {
26
+ function fail(e) {
27
+ env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
28
+ env.hasError = true;
29
+ }
30
+ var r, s = 0;
31
+ function next() {
32
+ while (r = env.stack.pop()) {
33
+ try {
34
+ if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
35
+ if (r.dispose) {
36
+ var result = r.dispose.call(r.value);
37
+ if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
38
+ }
39
+ else s |= 1;
40
+ }
41
+ catch (e) {
42
+ fail(e);
43
+ }
44
+ }
45
+ if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
46
+ if (env.hasError) throw env.error;
47
+ }
48
+ return next();
49
+ };
50
+ })(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
51
+ var e = new Error(message);
52
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
53
+ });
2
54
  import { randomUUID } from 'node:crypto';
3
55
  import { isAbsolute } from 'node:path';
4
56
  import { brandString } from '@deepseek-ai/dsh-brand';
@@ -86,61 +138,74 @@ function installInitialModelSelection(agentCtx, selection) {
86
138
  * @param signal - registration lifetime cancellation through publication.
87
139
  */
88
140
  export async function createWebhookSession(ctx, delivery, ruleId, request, signal) {
89
- const resolved = resolveRequest(ctx, request);
90
- ctx.permissionPresets.resolve(resolved.permissionPreset);
91
- const preset = await ctx.agentPresets.resolve(resolved.agentPreset);
92
- await ctx.agentPresets.standingKeyFor(preset.id);
93
- signal.throwIfAborted();
94
- const workspace = await ctx.workspaceRegistry.create(resolved.workspacePath);
95
- signal.throwIfAborted();
96
- const sessionId = brandString(`webhook-${randomUUID()}`);
97
- const handle = await ctx.agents.create({
98
- sessionId,
99
- signal,
100
- meta: { cwd: workspace.path, agentPreset: preset.id },
101
- agentOptions: resolved.agentOptions,
102
- setup: async (agentCtx) => {
103
- await ctx.agentPresets.mount(agentCtx, preset.id);
104
- installInitialModelSelection(agentCtx, resolved.modelSelection);
105
- },
106
- });
107
- let attached = false;
141
+ const env_1 = { stack: [], error: void 0, hasError: false };
108
142
  try {
143
+ const resolved = resolveRequest(ctx, request);
144
+ ctx.permissionPresets.resolve(resolved.permissionPreset);
145
+ const preset = await ctx.agentPresets.resolve(resolved.agentPreset);
146
+ const presetScope = __addDisposableResource(env_1, await ctx.agentPresets.acquireScope(preset.id), true);
147
+ void presetScope;
109
148
  signal.throwIfAborted();
110
- await workspace.attachSession(sessionId);
111
- attached = true;
149
+ const workspace = await ctx.workspaceRegistry.create(resolved.workspacePath);
112
150
  signal.throwIfAborted();
113
- ctx.permissionPresets.set(handle.agent.session, resolved.permissionPreset);
114
- ctx.sessionTitle.rename(handle.agent.session, resolved.title);
115
- handle.agent.followup(createUserMessage({
116
- content: [{ type: 'text', text: resolved.prompt }],
117
- source: {
118
- kind: 'webhook',
119
- provider: delivery.kind,
120
- source: delivery.source,
121
- deliveryId: delivery.deliveryId,
122
- ruleId,
123
- form: 'notice',
124
- summary: boundContextSummary(`${delivery.kind} webhook handled by ${ruleId}`),
151
+ const sessionId = brandString(`webhook-${randomUUID()}`);
152
+ const handle = await ctx.agents.create({
153
+ sessionId,
154
+ signal,
155
+ meta: { cwd: workspace.path, agentPreset: preset.id },
156
+ agentOptions: resolved.agentOptions,
157
+ setup: async (agentCtx) => {
158
+ await ctx.agentPresets.mount(agentCtx, preset.id);
159
+ installInitialModelSelection(agentCtx, resolved.modelSelection);
125
160
  },
126
- }));
127
- }
128
- catch (error) {
129
- if (attached) {
161
+ });
162
+ let attached = false;
163
+ try {
164
+ signal.throwIfAborted();
165
+ await workspace.attachSession(sessionId);
166
+ attached = true;
167
+ signal.throwIfAborted();
168
+ ctx.permissionPresets.set(handle.agent.session, resolved.permissionPreset);
169
+ ctx.sessionTitle.rename(handle.agent.session, resolved.title);
170
+ handle.agent.followup(createUserMessage({
171
+ content: [{ type: 'text', text: resolved.prompt }],
172
+ source: {
173
+ kind: 'webhook',
174
+ provider: delivery.kind,
175
+ source: delivery.source,
176
+ deliveryId: delivery.deliveryId,
177
+ ruleId,
178
+ form: 'notice',
179
+ summary: boundContextSummary(`${delivery.kind} webhook handled by ${ruleId}`),
180
+ },
181
+ }));
182
+ }
183
+ catch (error) {
184
+ if (attached) {
185
+ try {
186
+ await workspace.detachSession(sessionId);
187
+ }
188
+ catch (rollbackError) {
189
+ reportRollbackFailure(ctx, `Workspace detach for Session "${sessionId}"`, rollbackError);
190
+ }
191
+ }
130
192
  try {
131
- await workspace.detachSession(sessionId);
193
+ await handle.dispose();
132
194
  }
133
195
  catch (rollbackError) {
134
- reportRollbackFailure(ctx, `Workspace detach for Session "${sessionId}"`, rollbackError);
196
+ reportRollbackFailure(ctx, `Agent disposal for Session "${sessionId}"`, rollbackError);
135
197
  }
198
+ throw error;
136
199
  }
137
- try {
138
- await handle.dispose();
139
- }
140
- catch (rollbackError) {
141
- reportRollbackFailure(ctx, `Agent disposal for Session "${sessionId}"`, rollbackError);
142
- }
143
- throw error;
200
+ }
201
+ catch (e_1) {
202
+ env_1.error = e_1;
203
+ env_1.hasError = true;
204
+ }
205
+ finally {
206
+ const result_1 = __disposeResources(env_1);
207
+ if (result_1)
208
+ await result_1;
144
209
  }
145
210
  }
146
211
  //# sourceMappingURL=session.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@deepseek-ai/dsh-webhook",
3
3
  "description": "Fire-and-forget webhook rule runtime that creates Workspace-backed DeepSeek Harness Sessions",
4
- "version": "0.1.6-alpha.2",
4
+ "version": "0.1.7-alpha.2",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -37,33 +37,33 @@
37
37
  ],
38
38
  "license": "MIT",
39
39
  "peerDependencies": {
40
- "@deepseek-ai/cordis": "^4.0.2",
41
- "@deepseek-ai/dsh-agent": "^0.1.6-alpha.2",
42
- "@deepseek-ai/dsh-agent-default-model": "^0.1.6-alpha.2",
43
- "@deepseek-ai/dsh-agent-presets": "^0.1.6-alpha.2",
44
- "@deepseek-ai/dsh-invariants": "^0.1.6-alpha.2",
45
- "@deepseek-ai/dsh-llm": "^0.1.6-alpha.2",
46
- "@deepseek-ai/dsh-permission-presets": "^0.1.6-alpha.2",
47
- "@deepseek-ai/dsh-session": "^0.1.6-alpha.2",
48
- "@deepseek-ai/dsh-session-title": "^0.1.6-alpha.2",
49
- "@deepseek-ai/dsh-workspace": "^0.1.6-alpha.2"
40
+ "@deepseek-ai/cordis": "~4.0.4",
41
+ "@deepseek-ai/dsh-agent": "0.1.7-alpha.2",
42
+ "@deepseek-ai/dsh-agent-default-model": "0.1.7-alpha.2",
43
+ "@deepseek-ai/dsh-invariants": "0.1.7-alpha.2",
44
+ "@deepseek-ai/dsh-agent-preset-registry": "0.1.7-alpha.2",
45
+ "@deepseek-ai/dsh-llm": "0.1.7-alpha.2",
46
+ "@deepseek-ai/dsh-permission-presets": "0.1.7-alpha.2",
47
+ "@deepseek-ai/dsh-session": "0.1.7-alpha.2",
48
+ "@deepseek-ai/dsh-workspace": "0.1.7-alpha.2",
49
+ "@deepseek-ai/dsh-session-title": "0.1.7-alpha.2"
50
50
  },
51
51
  "devDependencies": {
52
- "@deepseek-ai/cordis": "^4.0.2",
53
- "@deepseek-ai/cordis-plugin-include": "^1.0.7",
54
- "@deepseek-ai/cordis-plugin-loader": "^1.0.3",
55
- "@deepseek-ai/dsh-agent": "^0.1.6-alpha.2",
56
- "@deepseek-ai/dsh-agent-default-model": "^0.1.6-alpha.2",
57
- "@deepseek-ai/dsh-agent-presets": "^0.1.6-alpha.2",
58
- "@deepseek-ai/dsh-invariants": "^0.1.6-alpha.2",
59
- "@deepseek-ai/dsh-llm": "^0.1.6-alpha.2",
60
- "@deepseek-ai/dsh-permission-presets": "^0.1.6-alpha.2",
61
- "@deepseek-ai/dsh-session": "^0.1.6-alpha.2",
62
- "@deepseek-ai/dsh-session-title": "^0.1.6-alpha.2",
63
- "@deepseek-ai/dsh-workspace": "^0.1.6-alpha.2"
52
+ "@deepseek-ai/cordis": "~4.0.4",
53
+ "@deepseek-ai/cordis-plugin-include": "~1.0.9",
54
+ "@deepseek-ai/cordis-plugin-loader": "~1.0.5",
55
+ "@deepseek-ai/dsh-agent": "0.1.7-alpha.2",
56
+ "@deepseek-ai/dsh-agent-preset-registry": "0.1.7-alpha.2",
57
+ "@deepseek-ai/dsh-llm": "0.1.7-alpha.2",
58
+ "@deepseek-ai/dsh-agent-default-model": "0.1.7-alpha.2",
59
+ "@deepseek-ai/dsh-permission-presets": "0.1.7-alpha.2",
60
+ "@deepseek-ai/dsh-session": "0.1.7-alpha.2",
61
+ "@deepseek-ai/dsh-session-title": "0.1.7-alpha.2",
62
+ "@deepseek-ai/dsh-workspace": "0.1.7-alpha.2",
63
+ "@deepseek-ai/dsh-invariants": "0.1.7-alpha.2"
64
64
  },
65
65
  "dependencies": {
66
- "@deepseek-ai/dsh-util-values": "^0.1.6-alpha.2",
67
- "@deepseek-ai/dsh-brand": "^0.1.6-alpha.2"
66
+ "@deepseek-ai/dsh-util-values": "0.1.7-alpha.2",
67
+ "@deepseek-ai/dsh-brand": "0.1.7-alpha.2"
68
68
  }
69
69
  }