crewly 1.20.250 → 1.20.252

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 (176) hide show
  1. package/config/skills/agent/core/app-comments/SKILL.md +11 -1
  2. package/config/skills/agent/core/app-data/SKILL.md +65 -3
  3. package/config/skills/agent/core/app-data/execute.sh +51 -3
  4. package/config/skills/agent/core/app-data/execute.test.sh +42 -0
  5. package/config/skills/agent/core/complete-task/SKILL.md +5 -1
  6. package/config/skills/agent/core/complete-task/execute.sh +30 -15
  7. package/config/skills/agent/core/complete-task/execute.test.sh +45 -1
  8. package/config/skills/agent/core/publish-app/SKILL.md +5 -1
  9. package/config/skills/agent/core/publish-app/execute.sh +26 -3
  10. package/config/skills/agent/core/publish-app/execute.test.sh +18 -0
  11. package/dist/backend/backend/src/constants.d.ts +66 -0
  12. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  13. package/dist/backend/backend/src/constants.js +66 -0
  14. package/dist/backend/backend/src/constants.js.map +1 -1
  15. package/dist/backend/backend/src/controllers/apps/apps.controller.d.ts +17 -0
  16. package/dist/backend/backend/src/controllers/apps/apps.controller.d.ts.map +1 -1
  17. package/dist/backend/backend/src/controllers/apps/apps.controller.js +31 -0
  18. package/dist/backend/backend/src/controllers/apps/apps.controller.js.map +1 -1
  19. package/dist/backend/backend/src/controllers/apps/apps.routes.d.ts +7 -0
  20. package/dist/backend/backend/src/controllers/apps/apps.routes.d.ts.map +1 -1
  21. package/dist/backend/backend/src/controllers/apps/apps.routes.js +29 -2
  22. package/dist/backend/backend/src/controllers/apps/apps.routes.js.map +1 -1
  23. package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
  24. package/dist/backend/backend/src/controllers/team/team.controller.js +43 -4
  25. package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
  26. package/dist/backend/backend/src/index.d.ts.map +1 -1
  27. package/dist/backend/backend/src/index.js +13 -0
  28. package/dist/backend/backend/src/index.js.map +1 -1
  29. package/dist/backend/backend/src/services/agent/agent-registration.service.js +2 -2
  30. package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
  31. package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts +13 -0
  32. package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
  33. package/dist/backend/backend/src/services/agent/resource-mode.service.js +36 -0
  34. package/dist/backend/backend/src/services/agent/resource-mode.service.js.map +1 -1
  35. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -1
  36. package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  37. package/dist/backend/backend/src/services/apps/app-collaborators.service.d.ts +103 -0
  38. package/dist/backend/backend/src/services/apps/app-collaborators.service.d.ts.map +1 -0
  39. package/dist/backend/backend/src/services/apps/app-collaborators.service.js +161 -0
  40. package/dist/backend/backend/src/services/apps/app-collaborators.service.js.map +1 -0
  41. package/dist/backend/backend/src/services/apps/app-comment-room.service.d.ts +149 -0
  42. package/dist/backend/backend/src/services/apps/app-comment-room.service.d.ts.map +1 -0
  43. package/dist/backend/backend/src/services/apps/app-comment-room.service.js +316 -0
  44. package/dist/backend/backend/src/services/apps/app-comment-room.service.js.map +1 -0
  45. package/dist/backend/backend/src/services/apps/app-comments-slack.service.d.ts +38 -1
  46. package/dist/backend/backend/src/services/apps/app-comments-slack.service.d.ts.map +1 -1
  47. package/dist/backend/backend/src/services/apps/app-comments-slack.service.js +58 -3
  48. package/dist/backend/backend/src/services/apps/app-comments-slack.service.js.map +1 -1
  49. package/dist/backend/backend/src/services/apps/app-roster.service.d.ts +37 -1
  50. package/dist/backend/backend/src/services/apps/app-roster.service.d.ts.map +1 -1
  51. package/dist/backend/backend/src/services/apps/app-roster.service.js +62 -7
  52. package/dist/backend/backend/src/services/apps/app-roster.service.js.map +1 -1
  53. package/dist/backend/backend/src/services/apps/app-wake-message.d.ts +6 -0
  54. package/dist/backend/backend/src/services/apps/app-wake-message.d.ts.map +1 -1
  55. package/dist/backend/backend/src/services/apps/app-wake-message.js +12 -10
  56. package/dist/backend/backend/src/services/apps/app-wake-message.js.map +1 -1
  57. package/dist/backend/backend/src/services/apps/app-wake.service.d.ts +30 -0
  58. package/dist/backend/backend/src/services/apps/app-wake.service.d.ts.map +1 -1
  59. package/dist/backend/backend/src/services/apps/app-wake.service.js +90 -16
  60. package/dist/backend/backend/src/services/apps/app-wake.service.js.map +1 -1
  61. package/dist/backend/backend/src/services/apps/apps-cloud.client.d.ts +6 -0
  62. package/dist/backend/backend/src/services/apps/apps-cloud.client.d.ts.map +1 -1
  63. package/dist/backend/backend/src/services/apps/apps-cloud.client.js +5 -4
  64. package/dist/backend/backend/src/services/apps/apps-cloud.client.js.map +1 -1
  65. package/dist/backend/backend/src/services/apps/apps.service.d.ts +115 -2
  66. package/dist/backend/backend/src/services/apps/apps.service.d.ts.map +1 -1
  67. package/dist/backend/backend/src/services/apps/apps.service.js +181 -9
  68. package/dist/backend/backend/src/services/apps/apps.service.js.map +1 -1
  69. package/dist/backend/backend/src/services/apps/apps.wiring.d.ts +57 -1
  70. package/dist/backend/backend/src/services/apps/apps.wiring.d.ts.map +1 -1
  71. package/dist/backend/backend/src/services/apps/apps.wiring.js +233 -4
  72. package/dist/backend/backend/src/services/apps/apps.wiring.js.map +1 -1
  73. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +1 -1
  74. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  75. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +3 -0
  76. package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  77. package/dist/backend/backend/src/services/decisions/decision.service.d.ts +2 -0
  78. package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  79. package/dist/backend/backend/src/services/decisions/decision.service.js +1 -0
  80. package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
  81. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +24 -1
  82. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  83. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js +44 -1
  84. package/dist/backend/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  85. package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.d.ts +48 -0
  86. package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.d.ts.map +1 -1
  87. package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.js +46 -0
  88. package/dist/backend/backend/src/services/orchestrator/commitment-approval-guard.js.map +1 -1
  89. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts +43 -1
  90. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.d.ts.map +1 -1
  91. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js +34 -0
  92. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-decision.js.map +1 -1
  93. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.d.ts.map +1 -1
  94. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.js +1 -0
  95. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot-stats.js.map +1 -1
  96. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.d.ts.map +1 -1
  97. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js +23 -7
  98. package/dist/backend/backend/src/services/project-tickets/ticket-autopilot.service.js.map +1 -1
  99. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts +5 -0
  100. package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
  101. package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
  102. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +18 -2
  103. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  104. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +67 -8
  105. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  106. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts +117 -3
  107. package/dist/backend/backend/src/services/reconciler/reconciler.service.d.ts.map +1 -1
  108. package/dist/backend/backend/src/services/reconciler/reconciler.service.js +304 -19
  109. package/dist/backend/backend/src/services/reconciler/reconciler.service.js.map +1 -1
  110. package/dist/backend/backend/src/services/reconciler/stalled-agent-recovery.d.ts +66 -0
  111. package/dist/backend/backend/src/services/reconciler/stalled-agent-recovery.d.ts.map +1 -0
  112. package/dist/backend/backend/src/services/reconciler/stalled-agent-recovery.js +107 -0
  113. package/dist/backend/backend/src/services/reconciler/stalled-agent-recovery.js.map +1 -0
  114. package/dist/backend/backend/src/services/trace/trace-metrics.d.ts.map +1 -1
  115. package/dist/backend/backend/src/services/trace/trace-metrics.js +2 -1
  116. package/dist/backend/backend/src/services/trace/trace-metrics.js.map +1 -1
  117. package/dist/backend/backend/src/services/trace/trace.types.d.ts +1 -1
  118. package/dist/backend/backend/src/services/trace/trace.types.d.ts.map +1 -1
  119. package/dist/backend/backend/src/services/trace/trace.types.js +2 -0
  120. package/dist/backend/backend/src/services/trace/trace.types.js.map +1 -1
  121. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +15 -0
  122. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
  123. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +47 -0
  124. package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
  125. package/dist/backend/backend/src/types/decision.types.d.ts +27 -2
  126. package/dist/backend/backend/src/types/decision.types.d.ts.map +1 -1
  127. package/dist/backend/backend/src/types/v2/index.d.ts +1 -1
  128. package/dist/backend/backend/src/types/v2/index.d.ts.map +1 -1
  129. package/dist/backend/backend/src/types/v2/index.js.map +1 -1
  130. package/dist/backend/backend/src/types/v2/reconcile.types.d.ts +20 -0
  131. package/dist/backend/backend/src/types/v2/reconcile.types.d.ts.map +1 -1
  132. package/dist/backend/backend/src/types/v2/reconcile.types.js.map +1 -1
  133. package/dist/backend/build-info.json +2 -2
  134. package/dist/cli/backend/src/constants.d.ts +66 -0
  135. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  136. package/dist/cli/backend/src/constants.js +66 -0
  137. package/dist/cli/backend/src/constants.js.map +1 -1
  138. package/dist/cli/backend/src/services/agent/agent-registration.service.js +2 -2
  139. package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
  140. package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts +13 -0
  141. package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
  142. package/dist/cli/backend/src/services/agent/resource-mode.service.js +36 -0
  143. package/dist/cli/backend/src/services/agent/resource-mode.service.js.map +1 -1
  144. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +1 -1
  145. package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
  146. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +1 -1
  147. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
  148. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +3 -0
  149. package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
  150. package/dist/cli/backend/src/services/decisions/decision.service.d.ts +2 -0
  151. package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
  152. package/dist/cli/backend/src/services/decisions/decision.service.js +1 -0
  153. package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
  154. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts +24 -1
  155. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.d.ts.map +1 -1
  156. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js +44 -1
  157. package/dist/cli/backend/src/services/messaging/sub-agent-message-queue.service.js.map +1 -1
  158. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.d.ts +48 -0
  159. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.d.ts.map +1 -1
  160. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.js +46 -0
  161. package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.js.map +1 -1
  162. package/dist/cli/backend/src/services/trace/trace.types.d.ts +1 -1
  163. package/dist/cli/backend/src/services/trace/trace.types.d.ts.map +1 -1
  164. package/dist/cli/backend/src/services/trace/trace.types.js +2 -0
  165. package/dist/cli/backend/src/services/trace/trace.types.js.map +1 -1
  166. package/dist/cli/backend/src/types/decision.types.d.ts +27 -2
  167. package/dist/cli/backend/src/types/decision.types.d.ts.map +1 -1
  168. package/dist/cli/backend/src/types/v2/index.d.ts +1 -1
  169. package/dist/cli/backend/src/types/v2/index.d.ts.map +1 -1
  170. package/dist/cli/backend/src/types/v2/index.js.map +1 -1
  171. package/dist/cli/backend/src/types/v2/reconcile.types.d.ts +20 -0
  172. package/dist/cli/backend/src/types/v2/reconcile.types.d.ts.map +1 -1
  173. package/dist/cli/backend/src/types/v2/reconcile.types.js.map +1 -1
  174. package/frontend/dist/assets/{index-2db17f1e.js → index-83188f0b.js} +2 -2
  175. package/frontend/dist/index.html +1 -1
  176. package/package.json +1 -1
@@ -20,6 +20,8 @@ export declare const RESOURCE_MODE_CONSTANTS: {
20
20
  readonly START_WAIT_MS: number;
21
21
  /** A started agent counts against the cap even before it shows as running */
22
22
  readonly ADMIT_TTL_MS: number;
23
+ /** errorCode of a start that waited for a slot and got none (deferred, not failed) */
24
+ readonly START_DEFERRED_ERROR_CODE: "RESOURCE_PRESSURE_CAP";
23
25
  };
24
26
  export type ResourceMode = 'normal' | 'pressure';
25
27
  export interface MemoryReading {
@@ -65,6 +67,8 @@ export declare class ResourceModeService {
65
67
  private waiters;
66
68
  private seq;
67
69
  private admitted;
70
+ /** The start promise of each agent waiting for a slot (one per agent) */
71
+ private pendingStarts;
68
72
  private pumping;
69
73
  private lastRunning;
70
74
  private lastCap;
@@ -117,6 +121,15 @@ export declare class ResourceModeService {
117
121
  * @returns True when the start may proceed
118
122
  */
119
123
  requestStart(sessionName: string, ownerTriggered: boolean): Promise<boolean>;
124
+ /**
125
+ * Whether a start for this agent is waiting for a slot right now.
126
+ *
127
+ * @param sessionName - Agent session
128
+ * @returns True while it waits behind the running-agent cap
129
+ */
130
+ isStartWaiting(sessionName: string): boolean;
131
+ /** Queue a start behind the cap (see {@link requestStart}). */
132
+ private enqueueStart;
120
133
  /** Admit waiting starts while a slot is free or can be freed. */
121
134
  pump(): Promise<void>;
122
135
  /** Longest-idle agent that is not busy and has no owner message pending. */
@@ -1 +1 @@
1
- {"version":3,"file":"resource-mode.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/resource-mode.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource-mode.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/resource-mode.service.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,8 @@ export const RESOURCE_MODE_CONSTANTS = {
24
24
  START_WAIT_MS: 2 * 60_000,
25
25
  /** A started agent counts against the cap even before it shows as running */
26
26
  ADMIT_TTL_MS: 3 * 60_000,
27
+ /** errorCode of a start that waited for a slot and got none (deferred, not failed) */
28
+ START_DEFERRED_ERROR_CODE: 'RESOURCE_PRESSURE_CAP',
27
29
  };
28
30
  /**
29
31
  * Whether memory alone is tight (used share, free floor, swap, OS pressure).
@@ -51,6 +53,8 @@ export class ResourceModeService {
51
53
  waiters = [];
52
54
  seq = 0;
53
55
  admitted = new Map();
56
+ /** The start promise of each agent waiting for a slot (one per agent) */
57
+ pendingStarts = new Map();
54
58
  pumping = false;
55
59
  lastRunning = 0;
56
60
  lastCap = RESOURCE_MODE_CONSTANTS.DEFAULT_MAX_RUNNING_AGENTS;
@@ -87,6 +91,7 @@ export class ResourceModeService {
87
91
  w.resolve(false);
88
92
  }
89
93
  this.waiters = [];
94
+ this.pendingStarts.clear();
90
95
  }
91
96
  getMode() {
92
97
  return this.mode;
@@ -168,6 +173,37 @@ export class ResourceModeService {
168
173
  async requestStart(sessionName, ownerTriggered) {
169
174
  if (this.mode !== 'pressure' || !this.deps)
170
175
  return true;
176
+ // One place in line per agent (CREW-304): a second request for an agent
177
+ // already waiting joins that wait instead of queuing it twice. An owner
178
+ // message moves the existing place to the front.
179
+ const existing = this.pendingStarts.get(sessionName);
180
+ if (existing) {
181
+ const queued = this.waiters.find((w) => w.name === sessionName);
182
+ if (queued && ownerTriggered && !queued.owner) {
183
+ queued.owner = true;
184
+ this.waiters.sort((a, b) => Number(b.owner) - Number(a.owner) || a.seq - b.seq);
185
+ }
186
+ return existing;
187
+ }
188
+ const promise = this.enqueueStart(sessionName, ownerTriggered);
189
+ this.pendingStarts.set(sessionName, promise);
190
+ void promise.finally(() => {
191
+ if (this.pendingStarts.get(sessionName) === promise)
192
+ this.pendingStarts.delete(sessionName);
193
+ });
194
+ return promise;
195
+ }
196
+ /**
197
+ * Whether a start for this agent is waiting for a slot right now.
198
+ *
199
+ * @param sessionName - Agent session
200
+ * @returns True while it waits behind the running-agent cap
201
+ */
202
+ isStartWaiting(sessionName) {
203
+ return this.waiters.some((w) => w.name === sessionName);
204
+ }
205
+ /** Queue a start behind the cap (see {@link requestStart}). */
206
+ enqueueStart(sessionName, ownerTriggered) {
171
207
  return new Promise((resolve) => {
172
208
  const timer = setTimeout(() => {
173
209
  this.waiters = this.waiters.filter((w) => w !== waiter);
@@ -1 +1 @@
1
- {"version":3,"file":"resource-mode.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/resource-mode.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,aAAa,EAAwB,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACtC,0BAA0B,EAAE,CAAC;IAC7B,4BAA4B,EAAE,EAAE;IAChC,8DAA8D;IAC9D,WAAW,EAAE,CAAC;IACd,4DAA4D;IAC5D,WAAW,EAAE,CAAC;IACd,gFAAgF;IAChF,aAAa,EAAE,CAAC;IAChB,kBAAkB,EAAE,MAAM;IAC1B,uFAAuF;IACvF,aAAa,EAAE,CAAC,GAAG,MAAM;IACzB,6EAA6E;IAC7E,YAAY,EAAE,CAAC,GAAG,MAAM;CACf,CAAC;AAYX;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAoB;IACpD,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACjC,OAAO,CACN,KAAK,CAAC,WAAW,IAAI,uBAAuB,CAAC,6BAA6B;QAC1E,KAAK,CAAC,MAAM,GAAG,uBAAuB,CAAC,qBAAqB;QAC5D,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC,IAAI,uBAAuB,CAAC,2BAA2B;QACnF,KAAK,CAAC,gBAAgB,KAAK,IAAI,CAC/B,CAAC;AACH,CAAC;AAoBD,MAAM,OAAO,mBAAmB;IACvB,MAAM,CAAC,QAAQ,GAA+B,IAAI,CAAC;IACnD,MAAM,CAAkB;IACxB,IAAI,GAAiB,QAAQ,CAAC;IAC9B,WAAW,GAAG,CAAC,CAAC;IAChB,UAAU,GAAG,CAAC,CAAC;IACf,UAAU,GAAG,EAAE,CAAC;IAChB,KAAK,GAA0B,IAAI,CAAC;IACpC,IAAI,GAA4B,IAAI,CAAC;IACrC,OAAO,GAAa,EAAE,CAAC;IACvB,GAAG,GAAG,CAAC,CAAC;IACR,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrC,OAAO,GAAG,KAAK,CAAC;IAChB,WAAW,GAAG,CAAC,CAAC;IAChB,OAAO,GAAW,uBAAuB,CAAC,0BAA0B,CAAC;IAE7E,sCAAsC;IACtC,WAAW,GAAwB,cAAc,CAAC;IAClD,OAAO,GAAiB,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,QAAQ,GAAiB,GAAG,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC;IAErD;QACC,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,cAAc,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,CAAC,WAAW;QACjB,OAAO,CAAC,mBAAmB,CAAC,QAAQ,KAAK,IAAI,mBAAmB,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,aAAa;QACnB,mBAAmB,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QACrC,mBAAmB,CAAC,QAAQ,GAAG,IAAI,CAAC;IACrC,CAAC;IAED,OAAO,CAAC,IAA6B;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,+BAA+B;IAC/B,KAAK;QACJ,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;QACpG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;IACtB,CAAC;IAED,IAAI;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAAC,CAAC;QAC1E,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;IACnB,CAAC;IAED,OAAO;QACN,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAED,8CAA8C;IACtC,WAAW;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,eAAe,GAAG,CAAC,WAAW,UAAU,GAAG,CAAC,MAAM,WAAW,GAAG,CAAC,eAAe,IAAI,CAAC,gBAAgB,GAAG,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;QAC7I,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,IAAI,GAAG,uBAAuB,CAAC,aAAa,GAAG,KAAK;YAAE,OAAO,YAAY,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,uBAAuB,CAAC,aAAa,IAAI,KAAK,QAAQ,CAAC;QACzJ,OAAO,EAAE,CAAC;IACX,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,MAAM,EAAE,CAAC;YAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAAC,CAAC;aAAM,CAAC;YAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;QAAC,CAAC;QAC1G,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,IAAI,uBAAuB,CAAC,WAAW,EAAE,CAAC;YACvF,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;YACvB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kEAAkE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAClG,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,UAAU,IAAI,uBAAuB,CAAC,WAAW,EAAE,CAAC;YAC/F,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,IAAI,CAAC;IAClB,CAAC;IAED;;;;;;OAMG;IACH,2BAA2B,CAAC,aAAqB,EAAE,eAAuB;QACzE,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,aAAa,CAAC;QACnD,OAAO,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC;IAC9D,CAAC;IAED,4BAA4B;IAC5B,KAAK;QACJ,OAAO;YACN,YAAY,EAAE,IAAI,CAAC,IAAI;YACvB,OAAO,EAAE,IAAI,CAAC,WAAW;YACzB,GAAG,EAAE,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;YACnD,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YAC5B,MAAM,EAAE,IAAI,CAAC,UAAU;SACvB,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,YAAY,CAAC,WAAmB,EAAE,cAAuB;QAC9D,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACxD,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;YACvC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;gBACxD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gFAAgF,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;gBACpH,OAAO,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,EAAE,uBAAuB,CAAC,aAAa,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAW,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACrG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAChF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,yCAAyC,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3H,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,IAAI;QACT,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO;QACvC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,KAAK,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ;gBAAE,IAAI,GAAG,GAAG,EAAE,GAAG,uBAAuB,CAAC,YAAY;oBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAClH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAChD,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC;YAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;YACzD,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC/C,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,IAAI,GAAG,OAAO,CAAC;YACnB,6DAA6D;YAC7D,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC/D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAG,CAAC,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAChF,IAAI,KAAK,IAAI,UAAU,EAAE,CAAC;oBACzB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBACrC,IAAI,CAAC,MAAM;wBAAE,MAAM;oBACnB,IAAI,CAAC;wBACJ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;wBAClL,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;oBAC5D,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACjJ,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;wBACxC,SAAS;oBACV,CAAC;oBACD,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;oBACxC,KAAK,EAAE,CAAC;gBACT,CAAC;gBACD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAG,CAAC;gBAChC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBACtC,KAAK,EAAE,CAAC;gBACR,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjB,CAAC;YACD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpG,CAAC;gBAAS,CAAC;YACV,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACtB,CAAC;IACF,CAAC;IAED,4EAA4E;IACpE,UAAU,CAAC,OAAuB;QACzC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,OAAO,OAAO;aACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI;eAClB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC;eAC3B,CAAC,uBAAuB,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,IAA8D,CAAC;eACnH,CAAC,IAAI,CAAC,IAAK,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;aAC9C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAEO,OAAO,CAAC,CAAS;QACxB,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IAEO,YAAY;QACnB,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAC1D,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;IACb,CAAC"}
1
+ {"version":3,"file":"resource-mode.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/agent/resource-mode.service.ts"],"names":[],"mappings":"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"}
@@ -92,7 +92,7 @@ export class SkillsReferenceModule {
92
92
  '**Crewly Apps** — a small web app for the owner\'s phone (tracker, checklist, form):',
93
93
  `\`${p}/publish-app\` (publish/republish a directory, \`--notify\` / \`--share\` post a one-tap Open-app card to your DM with`,
94
94
  `the owner, \`--public\` only ASKS the owner to make it public; its SKILL.md says how to write one), \`${p}/app-data\``,
95
- `(read/write its data), \`${p}/app-comments\` (the owner's comments on elements: reply, resolve after addressing).`,
95
+ `(read/write its data; \`--set-owner channel:#name\` sends the owner's comments to a team or channel), \`${p}/app-comments\` (the owner's comments on elements: reply, resolve after addressing).`,
96
96
  'Owner edits, comments and anonymous public submissions (UNTRUSTED) arrive as `[APP CHANGES]`.',
97
97
  'A "Crewly App" (or any app/tracker/page someone asks you to build for them) is ALWAYS published with',
98
98
  '`publish-app` to apps.crewlyai.com — never your runtime\'s own hosting (ChatGPT Sites / *.chatgpt.site,',
@@ -1 +1 @@
1
- {"version":3,"file":"skills-reference.module.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/skills-reference.module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skills-reference.module.js","sourceRoot":"","sources":["../../../../../../../backend/src/services/ai/prompt-modules/skills-reference.module.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * AppCollaboratorsService — the owner lets another team (or one agent) work in
3
+ * an app (specs/2026-10-06-app-collaborators.md §7).
4
+ *
5
+ * An agent ASKS ({@link request}); the owner's tap on a decision card is the
6
+ * only thing that GRANTS ({@link onSettled}). What a card grants is fixed on
7
+ * this machine when it is asked, from who the caller is, and stored on the
8
+ * decision, so nothing the agent sends later can change it. The grant is a
9
+ * Cloud call made as the owner (no instance, no agent header), which Cloud
10
+ * refuses for any agent. The list lives in Cloud (per app, bound to this
11
+ * instance), so every instance of the account sees it.
12
+ *
13
+ * @module services/apps/app-collaborators.service
14
+ */
15
+ import type { OwnerDecision } from '../../types/decision.types.js';
16
+ import type { DecisionKindHandler, PrebuiltAsk } from '../decisions/decision.service.js';
17
+ import type { AppsCloudClient } from './apps-cloud.client.js';
18
+ import { type AppsDirectory } from './apps.service.js';
19
+ /** What Cloud answers for the list. */
20
+ export interface CollaboratorList {
21
+ collaborators: Array<{
22
+ id: string;
23
+ kind: 'team' | 'agent';
24
+ who: string;
25
+ name: string;
26
+ instanceId: string;
27
+ addedAt: string;
28
+ }>;
29
+ enforced?: boolean;
30
+ }
31
+ /** The slice of the decision service used here. */
32
+ export interface CollaboratorDecisions {
33
+ askPrebuilt(ask: PrebuiltAsk): Promise<OwnerDecision>;
34
+ }
35
+ /** Collaborators. */
36
+ export interface AppCollaboratorsDeps {
37
+ client: AppsCloudClient;
38
+ /** Who is on which team on this machine */
39
+ directory: AppsDirectory;
40
+ /** This instance's Cloud id */
41
+ instanceId: () => Promise<string | null>;
42
+ /** The decision service, once it runs */
43
+ decisions: () => CollaboratorDecisions | null;
44
+ /** Tell an agent something (the answer to its request) */
45
+ notifyAgent: (session: string, text: string, activate: boolean) => Promise<boolean>;
46
+ }
47
+ /** The owner's yes/no card for a collaborator request, and the grant behind the yes. */
48
+ export declare class AppCollaboratorsService implements DecisionKindHandler {
49
+ private readonly deps;
50
+ constructor(deps: AppCollaboratorsDeps);
51
+ /**
52
+ * An agent asks the owner to let its team (default) or only itself work in an
53
+ * app. Nothing is granted here: a card goes to the owner. Who is added is
54
+ * decided from the caller's identity, never from the request body.
55
+ *
56
+ * @param appIdIn - The app (from the owner or the app's publisher)
57
+ * @param agentSession - The verified calling agent
58
+ * @param input - `{ scope?: 'team' | 'agent', reason?: string }`
59
+ * @returns The card's decision id
60
+ * @throws AppsCloudError validation / not_found (not this account's app) / unavailable (no decision cards)
61
+ */
62
+ request(appIdIn: unknown, agentSession: string | undefined, input: {
63
+ scope?: unknown;
64
+ reason?: unknown;
65
+ }): Promise<{
66
+ requested: true;
67
+ decisionId: string;
68
+ for: string;
69
+ }>;
70
+ /**
71
+ * A collaborator decision settled. Allow → add the collaborator in Cloud as
72
+ * the owner; anything else → nothing changes. Tells the asking agent.
73
+ *
74
+ * @param decision - The settled decision
75
+ * @returns Note for the asking agent, or null
76
+ */
77
+ onSettled(decision: OwnerDecision): Promise<string | null>;
78
+ /**
79
+ * Add a collaborator as the owner (the route refuses agents).
80
+ *
81
+ * @param appId - App
82
+ * @param body - `{ kind:'team', team }` or `{ kind:'agent', session }`; `instanceId` defaults to this instance
83
+ * @returns Cloud's list
84
+ */
85
+ add(appId: unknown, body: Record<string, unknown>): Promise<CollaboratorList>;
86
+ /**
87
+ * Remove a collaborator as the owner. Takes effect on the next call.
88
+ *
89
+ * @param appId - App
90
+ * @param entryId - The entry id from the list
91
+ * @returns Cloud's list
92
+ */
93
+ remove(appId: unknown, entryId: unknown): Promise<CollaboratorList>;
94
+ /**
95
+ * Who collaborates on an app.
96
+ *
97
+ * @param appId - App
98
+ * @param agentSession - The caller when an agent (omitted for the owner)
99
+ * @returns Cloud's list
100
+ */
101
+ list(appId: unknown, agentSession?: string): Promise<CollaboratorList>;
102
+ }
103
+ //# sourceMappingURL=app-collaborators.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-collaborators.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/apps/app-collaborators.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAA0C,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC3G,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AACzF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AASrE,uCAAuC;AACvC,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7H,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,mDAAmD;AACnD,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACvD;AAED,qBAAqB;AACrB,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,eAAe,CAAC;IACxB,2CAA2C;IAC3C,SAAS,EAAE,aAAa,CAAC;IACzB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACzC,yCAAyC;IACzC,SAAS,EAAE,MAAM,qBAAqB,GAAG,IAAI,CAAC;IAC9C,0DAA0D;IAC1D,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACrF;AAMD,wFAAwF;AACxF,qBAAa,uBAAwB,YAAW,mBAAmB;IACrD,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,oBAAoB;IAEvD;;;;;;;;;;OAUG;IACG,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IA+C9K;;;;;;OAMG;IACG,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAiBhE;;;;;;OAMG;IACG,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAOnF;;;;;;OAMG;IACG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAMzE;;;;;;OAMG;IACG,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAI7E"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * AppCollaboratorsService — the owner lets another team (or one agent) work in
3
+ * an app (specs/2026-10-06-app-collaborators.md §7).
4
+ *
5
+ * An agent ASKS ({@link request}); the owner's tap on a decision card is the
6
+ * only thing that GRANTS ({@link onSettled}). What a card grants is fixed on
7
+ * this machine when it is asked, from who the caller is, and stored on the
8
+ * decision, so nothing the agent sends later can change it. The grant is a
9
+ * Cloud call made as the owner (no instance, no agent header), which Cloud
10
+ * refuses for any agent. The list lives in Cloud (per app, bound to this
11
+ * instance), so every instance of the account sees it.
12
+ *
13
+ * @module services/apps/app-collaborators.service
14
+ */
15
+ import { AppsCloudError } from './apps-cloud.client.js';
16
+ import { CREWLY_APPS_CONSTANTS } from '../../constants.js';
17
+ import { requireAppId } from './apps.service.js';
18
+ const C = CREWLY_APPS_CONSTANTS;
19
+ const ALLOW_KEY = 'a';
20
+ const DENY_KEY = 'b';
21
+ /** How long a request waits for the owner before it lapses (nothing is granted). */
22
+ const REQUEST_DEADLINE_MS = 48 * 60 * 60 * 1000;
23
+ const MAX_REASON = 300;
24
+ function validation(message) {
25
+ return new AppsCloudError(400, C.ERROR_CODES.VALIDATION, message);
26
+ }
27
+ /** The owner's yes/no card for a collaborator request, and the grant behind the yes. */
28
+ export class AppCollaboratorsService {
29
+ deps;
30
+ constructor(deps) {
31
+ this.deps = deps;
32
+ }
33
+ /**
34
+ * An agent asks the owner to let its team (default) or only itself work in an
35
+ * app. Nothing is granted here: a card goes to the owner. Who is added is
36
+ * decided from the caller's identity, never from the request body.
37
+ *
38
+ * @param appIdIn - The app (from the owner or the app's publisher)
39
+ * @param agentSession - The verified calling agent
40
+ * @param input - `{ scope?: 'team' | 'agent', reason?: string }`
41
+ * @returns The card's decision id
42
+ * @throws AppsCloudError validation / not_found (not this account's app) / unavailable (no decision cards)
43
+ */
44
+ async request(appIdIn, agentSession, input) {
45
+ const appId = requireAppId(appIdIn);
46
+ if (!agentSession)
47
+ throw validation('Only an agent asks; the owner adds a collaborator directly.');
48
+ const scope = input.scope === undefined || input.scope === '' ? 'team' : input.scope;
49
+ if (scope !== 'team' && scope !== 'agent')
50
+ throw validation("scope is 'team' (your team, the default) or 'agent' (only you).");
51
+ if (input.reason !== undefined && typeof input.reason !== 'string')
52
+ throw validation('reason is text.');
53
+ const reason = typeof input.reason === 'string' && input.reason.trim() ? input.reason.trim().slice(0, MAX_REASON) : undefined;
54
+ const me = await this.deps.directory.member(agentSession);
55
+ if (!me)
56
+ throw validation('You are not a member of a team on this machine.');
57
+ if (scope === 'team' && !me.team)
58
+ throw validation('You have no team; ask for access for yourself with scope "agent".');
59
+ const instanceId = await this.deps.instanceId();
60
+ if (!instanceId)
61
+ throw new AppsCloudError(409, C.ERROR_CODES.NO_INSTANCE, 'This machine has no Crewly Cloud instance id yet. Try again in a minute.');
62
+ // Cloud answers 404 when the app is not this account's.
63
+ const view = await this.deps.client.request('GET', `/apps/${appId}`, { agent: agentSession });
64
+ const decisions = this.deps.decisions();
65
+ if (!decisions)
66
+ throw new AppsCloudError(503, 'unavailable', 'Owner approval cards are not running on this machine, so the request cannot be asked.');
67
+ const subject = {
68
+ appId,
69
+ ...(view.name ? { appName: view.name } : {}),
70
+ kind: scope,
71
+ ...(scope === 'team' ? { team: me.team } : { session: agentSession }),
72
+ instanceId,
73
+ askerSession: agentSession,
74
+ askerName: me.name,
75
+ ...(reason ? { reason } : {}),
76
+ };
77
+ const forWho = scope === 'team' ? `the ${subject.team} team` : me.name;
78
+ const options = [
79
+ { key: ALLOW_KEY, label: 'Allow', detail: 'they can read and write this app\'s data, not change the app' },
80
+ { key: DENY_KEY, label: 'Do not allow', detail: 'nothing changes' },
81
+ ];
82
+ const decision = await decisions.askPrebuilt({
83
+ kind: 'app_collaborator',
84
+ asker: agentSession,
85
+ question: `Let ${forWho} work in the app "${view.name ?? appId}"? ${me.name} asked.`,
86
+ title: 'Add a collaborator to an app',
87
+ body: reason ? [`Reason: ${reason}`] : [],
88
+ options,
89
+ defaultKey: DENY_KEY,
90
+ yesKey: ALLOW_KEY,
91
+ deadline: new Date(Date.now() + REQUEST_DEADLINE_MS),
92
+ sensitive: 'app_access',
93
+ appCollaborator: subject,
94
+ });
95
+ return { requested: true, decisionId: decision.id, for: forWho };
96
+ }
97
+ /**
98
+ * A collaborator decision settled. Allow → add the collaborator in Cloud as
99
+ * the owner; anything else → nothing changes. Tells the asking agent.
100
+ *
101
+ * @param decision - The settled decision
102
+ * @returns Note for the asking agent, or null
103
+ */
104
+ async onSettled(decision) {
105
+ const s = decision.appCollaborator;
106
+ if (!s)
107
+ return null;
108
+ const label = s.kind === 'team' ? `the ${s.team} team` : s.askerName;
109
+ const app = s.appName ?? s.appId;
110
+ if (decision.status !== 'resolved' || decision.chosenKey !== ALLOW_KEY) {
111
+ return `[APP ACCESS] The owner did not add ${label} to "${app}". Nothing changed.`;
112
+ }
113
+ try {
114
+ await this.add(s.appId, s.kind === 'team' ? { kind: 'team', team: s.team, instanceId: s.instanceId } : { kind: 'agent', session: s.session, instanceId: s.instanceId });
115
+ return `[APP ACCESS] The owner added ${label} to "${app}". You can now read and write its data with app-data (app id ${s.appId}). You cannot republish or change the app itself.`;
116
+ }
117
+ catch (err) {
118
+ const why = err instanceof AppsCloudError ? `${err.code}: ${err.message}` : String(err);
119
+ return `[APP ACCESS] The owner said yes, but adding ${label} to "${app}" failed (${why}). Ask the owner to try again.`;
120
+ }
121
+ }
122
+ /**
123
+ * Add a collaborator as the owner (the route refuses agents).
124
+ *
125
+ * @param appId - App
126
+ * @param body - `{ kind:'team', team }` or `{ kind:'agent', session }`; `instanceId` defaults to this instance
127
+ * @returns Cloud's list
128
+ */
129
+ async add(appId, body) {
130
+ const id = requireAppId(appId);
131
+ const instanceId = typeof body['instanceId'] === 'string' && body['instanceId'] ? body['instanceId'] : await this.deps.instanceId();
132
+ if (!instanceId)
133
+ throw new AppsCloudError(409, C.ERROR_CODES.NO_INSTANCE, 'This machine has no Crewly Cloud instance id yet.');
134
+ return this.deps.client.request('PUT', `/apps/${id}/collaborators`, { body: { ...body, instanceId }, asOwner: true });
135
+ }
136
+ /**
137
+ * Remove a collaborator as the owner. Takes effect on the next call.
138
+ *
139
+ * @param appId - App
140
+ * @param entryId - The entry id from the list
141
+ * @returns Cloud's list
142
+ */
143
+ async remove(appId, entryId) {
144
+ const id = requireAppId(appId);
145
+ if (typeof entryId !== 'string' || !/^[A-Za-z0-9_-]{1,64}$/.test(entryId))
146
+ throw validation('entryId is the id from the list.');
147
+ return this.deps.client.request('DELETE', `/apps/${id}/collaborators/${entryId}`, { asOwner: true });
148
+ }
149
+ /**
150
+ * Who collaborates on an app.
151
+ *
152
+ * @param appId - App
153
+ * @param agentSession - The caller when an agent (omitted for the owner)
154
+ * @returns Cloud's list
155
+ */
156
+ async list(appId, agentSession) {
157
+ const id = requireAppId(appId);
158
+ return this.deps.client.request('GET', `/apps/${id}/collaborators`, agentSession ? { agent: agentSession } : { asOwner: true });
159
+ }
160
+ }
161
+ //# sourceMappingURL=app-collaborators.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-collaborators.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/apps/app-collaborators.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,149 @@
1
+ /**
2
+ * App comments in the room that owns the app (crewly-services apps/SPEC.md
3
+ * §15). An app owned by a team or a Crewly channel gets its owner's comments
4
+ * where that team / channel talks, so every member sees them and the room's
5
+ * rules decide who picks one up:
6
+ *
7
+ * - Each comment thread is ONE thread in the room (the chat-v2 huddle) and,
8
+ * when the room has a Slack channel, ONE Slack thread there (posted by a
9
+ * member's bot). The link is stored with the Slack mirror's links
10
+ * ({@link AppCommentsSlackService}), so the owner's reply in that Slack
11
+ * thread is relayed back to the app — and, not being consumed, reaches the
12
+ * room through the normal Slack routing.
13
+ * - The comment is written into the room as the owner's message
14
+ * (`metadata.source: 'app-comment'`) and dispatched with the room rules:
15
+ * an @mention in the comment wakes that member; otherwise the members awake
16
+ * here read it and decide, and when nobody is awake the room's lead is
17
+ * woken.
18
+ * - The owner's replies written in the app, and reopen, go into the same
19
+ * thread (and its Slack thread). A reply the owner wrote in Slack is
20
+ * already in the room: Cloud's `via: 'slack'` copy is skipped.
21
+ * - An agent's reply in the room thread (reply-channel) is added to the
22
+ * app's comment as that agent's reply; an agent's reply or resolve made
23
+ * with app-comments is written into the room thread as that agent, which
24
+ * the room's Slack mirror posts as the agent's bot.
25
+ *
26
+ * Harness text is English; the comment text is the owner's words.
27
+ *
28
+ * @module services/apps/app-comment-room.service
29
+ */
30
+ import type { ChatChannelDTO, ChatMessageDTO } from '../chat-v2/types.js';
31
+ import type { RecordTurnInput } from '../chat-v2/chat-v2.service.js';
32
+ import type { DispatchMessageOptions } from '../chat-v2/chat-v2.dispatcher.service.js';
33
+ import { type AppChange } from './app-wake-message.js';
34
+ import type { AppCommentsSlackService, CommentRoomRef } from './app-comments-slack.service.js';
35
+ /** Where a room-owned comment goes on this machine. */
36
+ export interface ResolvedRoom {
37
+ /** chat-v2 huddle id of the room */
38
+ chatChannelId: string;
39
+ /** Readable name (`#daily-brief`, `Dev team`) */
40
+ label: string;
41
+ /** The room's Slack channel, when it has one and Slack is connected */
42
+ slackChannelId: string | null;
43
+ /** Member agent sessions */
44
+ members: string[];
45
+ }
46
+ /** A room-owned batch of the owner's comment changes. */
47
+ export interface RoomDelivery {
48
+ appId: string;
49
+ appName: string;
50
+ room: CommentRoomRef;
51
+ comments: AppChange[];
52
+ }
53
+ /** The chat-v2 slice used here. */
54
+ export interface RoomChatApi {
55
+ recordTurn(input: RecordTurnInput): {
56
+ message: ChatMessageDTO;
57
+ };
58
+ getChannelForBridge(channelId: string): ChatChannelDTO | null;
59
+ }
60
+ /** Collaborators (all injectable). */
61
+ export interface AppCommentRoomDeps {
62
+ /** Find the room on this machine (null: it is gone) */
63
+ resolveRoom: (room: CommentRoomRef) => Promise<ResolvedRoom | null>;
64
+ chat: () => RoomChatApi | null;
65
+ /** The chat-v2 dispatcher's `dispatchMessage` (null before it is wired) */
66
+ dispatch: () => ((channel: ChatChannelDTO, message: ChatMessageDTO, options?: DispatchMessageOptions) => Promise<unknown>) | null;
67
+ /** Whether an agent's session runs now (who is awake in the room) */
68
+ isRunning: (session: string) => boolean;
69
+ /** Post into Slack as an agent's bot */
70
+ slackPost?: (req: {
71
+ agentSession: string;
72
+ target: string;
73
+ text: string;
74
+ threadTs?: string;
75
+ }) => Promise<{
76
+ channelId: string;
77
+ messageTs: string;
78
+ }>;
79
+ /** The link store shared with the Slack mirror */
80
+ links: Pick<AppCommentsSlackService, 'load' | 'linkOf' | 'saveLink' | 'noteReply' | 'linkOfChatRoot'>;
81
+ /** The agent that publishes an app here (preferred poster in Slack) */
82
+ publisherOf?: (appId: string) => Promise<string | null>;
83
+ /** This instance's Cloud id (to tell its mentions from another machine's) */
84
+ instanceId?: () => Promise<string | null>;
85
+ /** Add an agent's room reply to the app comment, as that agent */
86
+ relayAgentReply?: (appId: string, commentId: string, agentSession: string, text: string) => Promise<void>;
87
+ /** Agent skills root, for the command named in the room message */
88
+ skillsPath?: string;
89
+ /** Where the app opens */
90
+ appUrl?: (appId: string) => string;
91
+ /** Off switch for the Slack side (`CREWLY_APP_COMMENTS_SLACK=off`) */
92
+ slackOff?: () => boolean;
93
+ log?: (level: 'info' | 'warn', msg: string, meta?: Record<string, unknown>) => void;
94
+ }
95
+ /** Posts room-owned app comments into their room and relays the room's answers back. */
96
+ export declare class AppCommentRoomService {
97
+ private readonly deps;
98
+ constructor(deps: AppCommentRoomDeps);
99
+ private log;
100
+ private url;
101
+ /**
102
+ * Post a batch of the owner's comment changes into the owning room.
103
+ *
104
+ * @param input - App, room and comment changes (oldest first)
105
+ * @returns True when every change was posted (false: retry the batch later)
106
+ */
107
+ deliver(input: RoomDelivery): Promise<boolean>;
108
+ /** Which member's bot posts in Slack: the publisher when it is in the room, else the first member. */
109
+ private poster;
110
+ /**
111
+ * Members this change @mentions on this machine (they are addressed in the room).
112
+ *
113
+ * @param change - Comment change
114
+ * @param room - The room
115
+ * @returns Member sessions
116
+ */
117
+ private addressed;
118
+ private openThread;
119
+ private postInThread;
120
+ /**
121
+ * Dispatch with the room rules: @mentioned members must answer; otherwise
122
+ * the members awake here read it and decide, and with nobody awake the
123
+ * room's lead is woken (the dispatcher's no-presence rule).
124
+ */
125
+ private dispatch;
126
+ /**
127
+ * An agent replied with app-comments: write it into the room thread as that
128
+ * agent (the room's Slack mirror posts it as the agent's bot).
129
+ *
130
+ * @returns True when the comment has a room thread (handled here)
131
+ */
132
+ agentReplied(appId: string, commentId: string, agent: string, text: string): Promise<boolean>;
133
+ /**
134
+ * An agent resolved / reopened with app-comments: one line in the room thread.
135
+ *
136
+ * @returns True when the comment has a room thread
137
+ */
138
+ statusChanged(appId: string, commentId: string, agent: string, action: 'resolve' | 'reopen'): Promise<boolean>;
139
+ private agentRow;
140
+ /**
141
+ * A chat-v2 row was written: an agent's reply in a room-owned comment
142
+ * thread (not one written here) is added to the app's comment as that agent.
143
+ *
144
+ * @param dto - The row
145
+ * @returns True when it was relayed
146
+ */
147
+ onChatMessage(dto: ChatMessageDTO): Promise<boolean>;
148
+ }
149
+ //# sourceMappingURL=app-comment-room.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-comment-room.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/apps/app-comment-room.service.ts"],"names":[],"mappings":"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"}