@geminixiang/mikan 1.0.1 → 1.1.0
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/CHANGELOG.md +52 -0
- package/dist/adapters/discord/context.js +1 -1
- package/dist/adapters/discord/context.js.map +1 -1
- package/dist/adapters/messages.d.ts +1 -0
- package/dist/adapters/messages.d.ts.map +1 -1
- package/dist/adapters/messages.js +3 -0
- package/dist/adapters/messages.js.map +1 -1
- package/dist/adapters/progressive-renderer.d.ts.map +1 -1
- package/dist/adapters/progressive-renderer.js +132 -147
- package/dist/adapters/progressive-renderer.js.map +1 -1
- package/dist/adapters/slack/bot.d.ts +3 -0
- package/dist/adapters/slack/bot.d.ts.map +1 -1
- package/dist/adapters/slack/bot.js +88 -33
- package/dist/adapters/slack/bot.js.map +1 -1
- package/dist/adapters/slack/response-lifecycle.d.ts.map +1 -1
- package/dist/adapters/slack/response-lifecycle.js +1 -3
- package/dist/adapters/slack/response-lifecycle.js.map +1 -1
- package/dist/adapters/telegram/context.js +1 -1
- package/dist/adapters/telegram/context.js.map +1 -1
- package/dist/adapters/types.d.ts +1 -2
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/types.js.map +1 -1
- package/dist/file-guards.d.ts +2 -0
- package/dist/file-guards.d.ts.map +1 -1
- package/dist/file-guards.js +2 -1
- package/dist/file-guards.js.map +1 -1
- package/dist/harness/execution-env.d.ts.map +1 -1
- package/dist/harness/execution-env.js +82 -5
- package/dist/harness/execution-env.js.map +1 -1
- package/dist/harness/presenter.d.ts.map +1 -1
- package/dist/harness/presenter.js +21 -28
- package/dist/harness/presenter.js.map +1 -1
- package/dist/harness/prompt.d.ts +3 -2
- package/dist/harness/prompt.d.ts.map +1 -1
- package/dist/harness/prompt.js +47 -6
- package/dist/harness/prompt.js.map +1 -1
- package/dist/harness/runner.d.ts.map +1 -1
- package/dist/harness/runner.js +5 -3
- package/dist/harness/runner.js.map +1 -1
- package/dist/harness/session.d.ts +2 -0
- package/dist/harness/session.d.ts.map +1 -1
- package/dist/harness/session.js +49 -8
- package/dist/harness/session.js.map +1 -1
- package/dist/harness/tools/task.d.ts +4 -0
- package/dist/harness/tools/task.d.ts.map +1 -1
- package/dist/harness/tools/task.js +12 -0
- package/dist/harness/tools/task.js.map +1 -1
- package/dist/harness/types.d.ts +7 -0
- package/dist/harness/types.d.ts.map +1 -1
- package/dist/harness/types.js.map +1 -1
- package/dist/runtime/conversation-runtime.d.ts.map +1 -1
- package/dist/runtime/conversation-runtime.js +15 -0
- package/dist/runtime/conversation-runtime.js.map +1 -1
- package/dist/runtime/session-lifecycle.d.ts +1 -0
- package/dist/runtime/session-lifecycle.d.ts.map +1 -1
- package/dist/runtime/session-lifecycle.js +17 -1
- package/dist/runtime/session-lifecycle.js.map +1 -1
- package/dist/runtime/types.d.ts +1 -0
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/sandbox/container.d.ts +2 -1
- package/dist/sandbox/container.d.ts.map +1 -1
- package/dist/sandbox/container.js +23 -4
- package/dist/sandbox/container.js.map +1 -1
- package/dist/sandbox/provisioner.d.ts.map +1 -1
- package/dist/sandbox/provisioner.js +4 -0
- package/dist/sandbox/provisioner.js.map +1 -1
- package/dist/sessions/session-store.d.ts +4 -0
- package/dist/sessions/session-store.d.ts.map +1 -1
- package/dist/sessions/session-store.js +83 -4
- package/dist/sessions/session-store.js.map +1 -1
- package/dist/sessions/types.d.ts +1 -0
- package/dist/sessions/types.d.ts.map +1 -1
- package/dist/sessions/types.js.map +1 -1
- package/dist/types.d.ts +7 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/response-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAkB,MAAM,gBAAgB,CAAC;AAOjG,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"response-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/adapters/slack/response-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAkB,MAAM,gBAAgB,CAAC;AAOjG,OAAO,KAAK,EAAE,UAAU,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAoPzF,wBAAgB,0BAA0B,CAAC,EACzC,KAAK,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,OAAO,GACR,EAAE;IACD,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,iBAAiB,CAAC;IACzB,WAAW,EAAE,uBAAuB,CAAC;IACrC,SAAS,EAAE,WAAW,GAAG,QAAQ,CAAC;IAClC,OAAO,EAAE,mBAAmB,CAAC;CAC9B,GAAG,qBAAqB,CAuFxB"}
|
|
@@ -8,7 +8,6 @@ import { normalizeSlackCurrencyBold } from "./markdown.js";
|
|
|
8
8
|
import { slackPersonaForProfile } from "./persona.js";
|
|
9
9
|
import { errorMessage } from "../../unknown-values.js";
|
|
10
10
|
const MAX_MAIN_LENGTH = 35000;
|
|
11
|
-
const STREAM_MIN_DELTA_CHARS = 256;
|
|
12
11
|
const MAX_THREAD_LENGTH = 20000;
|
|
13
12
|
const FALLBACK_MAIN_LENGTH = 3000;
|
|
14
13
|
const WORKING_INDICATOR = "\n\n...";
|
|
@@ -216,13 +215,12 @@ export function createSlackResponseContext({ event, slack, sessionPlan, replyMod
|
|
|
216
215
|
workingIndicator: streamKind === "buffered" ? WORKING_INDICATOR : undefined,
|
|
217
216
|
formatProvisional: formatProvisionalSlackText,
|
|
218
217
|
prepareSource: prepareSlackSource,
|
|
219
|
-
|
|
218
|
+
showsPartialAnswer: true,
|
|
220
219
|
stream: streamKind === "native"
|
|
221
220
|
? {
|
|
222
221
|
start: (text) => slack.startMessageStream(event.channel, text, rootTs, event.user),
|
|
223
222
|
append: (id, delta) => slack.appendMessageStream(event.channel, id, delta),
|
|
224
223
|
stop: (id) => slack.stopMessageStream(event.channel, id),
|
|
225
|
-
minDeltaChars: STREAM_MIN_DELTA_CHARS,
|
|
226
224
|
}
|
|
227
225
|
: undefined,
|
|
228
226
|
needsCanonicalRender,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-lifecycle.js","sourceRoot":"","sources":["../../../src/adapters/slack/response-lifecycle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAChC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,MAAM,iBAAiB,GAAG,SAAS,CAAC;AACpC,MAAM,2BAA2B,GAC/B,kEAAkE,CAAC;AACrE,MAAM,uBAAuB,GAAG,CAAC,OAAe,EAAU,EAAE,CAAC,eAAe,OAAO,IAAI,CAAC;AAExF,SAAS,iBAAiB,CAAC,GAAY;IACrC,MAAM,IAAI,GAAI,GAAiD,EAAE,IAAI,CAAC;IACtE,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAClC,OAAO,IAAI,EAAE,KAAK,KAAK,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,KAAa;IAChD,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAChD,OAAO,SAAS,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AACtD,CAAC;AAED,SAAS,qBAAqB,CAC5B,IAAY,EACZ,YAAqB,EACrB,YAAY,GAAG,oBAAoB;IAEnC,MAAM,MAAM,GAAG,YAAY;QACzB,CAAC,CAAC,yEAAyE,YAAY,UAAU;QACjG,CAAC,CAAC,yDAAyD,CAAC;IAC9D,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAC9C,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC;AACzD,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,IAAqC,EACrC,IAAY,EACZ,YAAqB;IAErB,IAAI,YAAY,GAAG,oBAAoB,CAAC;IACxC,SAAS,CAAC;QACR,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;QACzE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC1B,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;gBAAE,MAAM,GAAG,CAAC;YACvC,IAAI,YAAY,KAAK,CAAC;gBAAE,MAAM,GAAG,CAAC;YAClC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAAC,MAAsB;IACnD,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,IAAI,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,QAAQ,GAAG,CAAC;IAChE,IAAI,MAAM,CAAC,KAAK;QAAE,IAAI,IAAI,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;IAC9C,IAAI,IAAI,KAAK,QAAQ,MAAM,CAAC;IAC5B,IAAI,aAAa;QAAE,IAAI,IAAI,WAAW,aAAa,YAAY,CAAC;IAChE,IAAI,IAAI,sBAAsB,MAAM,CAAC,MAAM,UAAU,CAAC;IACtD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACnC,IAAI,UAAU,GAAkB,IAAI,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpD,IAAI,MAAM,KAAK,SAAS;YAAE,SAAS;QACnC,IAAI,UAAU,KAAK,IAAI;YAAE,UAAU,GAAG,MAAM,CAAC;aACxC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,UAAU,CAAC,MAAM;YAAE,UAAU,GAAG,IAAI,CAAC;IAChG,CAAC;IACD,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,0BAA0B,CAAC,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC3D,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;AAChF,CAAC;AAUD,MAAM,sBAAsB;IAQ1B,YAA6B,OAAsC;QAAtC,YAAO,GAAP,OAAO,CAA+B;QAP3D,iCAA4B,GAAG,KAAK,CAAC;QACrC,gBAAW,GAAG,KAAK,CAAC;QACpB,oBAAe,GAAG,KAAK,CAAC;QACxB,wBAAmB,GAAG,EAAE,CAAC;QACzB,uBAAkB,GAAkB,IAAI,CAAC;QACzC,qBAAgB,GAAG,EAAE,CAAC;IAEwC,CAAC;IAE/D,sBAAsB,CAAC,KAAa,EAAE,GAAY;QACxD,IAAI,IAAI,CAAC,4BAA4B;YAAE,OAAO;QAC9C,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC;QACzC,GAAG,CAAC,UAAU,CACZ,oCAAoC,KAAK,oDAAoD,EAC7F,YAAY,CAAC,GAAG,CAAC,CAClB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,IAAY,EACZ,OAAO,GAAkC,EAAE,EAC3C,UAAyB;QAEzB,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACnD,MAAM,YAAY,GAAG,UAAU,IAAI,WAAW,CAAC,MAAM,CAAC;QACtD,IAAI,CAAC,YAAY;YAAE,OAAO,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,IAAI,EAAE,iBAAiB,EAAE,uBAAuB,CAAC,EAAE,CAAC;YAC/E,IAAI,OAAO,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;gBAC9B,GAAG,CAAC,IAAI,CACN,MAAM,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE;oBAChE,uBAAuB,CAAC,IAAI,CAAC;iBAC9B,CAAC,CACH,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,IAAI,CACN,MAAM,KAAK,CAAC,YAAY,CACtB,KAAK,CAAC,OAAO,EACb,YAAY,EACZ,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CACxD,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,mBAAmB,KAAK,IAAI,CAAC,gBAAgB;YAAE,OAAO;QAC5F,MAAM,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACrF,MAAM,MAAM,GAAG,iBAAiB;YAC9B,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAC9D,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YAAE,OAAO;QAC3B,MAAM,IAAI,CAAC,oBAAoB,CAC7B,iBAAiB,IAAI,IAAI,CAAC,gBAAgB;YACxC,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,2CAA2C,MAAM,EAAE,EACvD,EAAE,EACF,IAAI,CAAC,kBAAkB,CACxB,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,CAAC;IACnD,CAAC;IAEO,aAAa,CAAC,MAAc;QAClC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACnD,IAAI,CAAC,WAAW,CAAC,MAAM;YAAE,OAAO;QAChC,KAAK,KAAK;aACP,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;aAC7D,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,SAAS;QACP,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAAU;QAC5B,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACtC,MAAM,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAiB,EAAE,UAAyB;QAC1D,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpD,IAAI,CAAC,QAAQ,IAAI,UAAU,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,eAAe;YAC5F,OAAO;QACT,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,mBAAmB,aAAa,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,OAAgB;QACrC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,UAAyB;QACpD,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAClE,IAAI,UAAU,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9B,KAAK,CAAC,cAAc,CAClB,KAAK,CAAC,OAAO,EACb,IAAI,EACJ,UAAU,EACV,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC9C,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,WAAW,CAAC,UAAU,EAAE,EAAE,CACtE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAClB,IAAI,EACJ,SAAS,EACT,OAAO,EACP,UAAU,EACV,KAAK,EACL,aAAa,GACM;QACnB,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACpD,IAAI,YAAgC,CAAC;QACrC,MAAM,mBAAmB,GAAG,GAAuB,EAAE;YACnD,IAAI,YAAY,KAAK,SAAS,IAAI,OAAO,EAAE,kBAAkB,EAAE,CAAC;gBAC9D,YAAY,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAC9C,CAAC;YACD,OAAO,YAAY,CAAC;QACtB,CAAC,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAErF,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QACzE,IAAI,CAAC,kBAAkB,GAAG,aAAa;YACrC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,IAAI,aAAa,EAAE,IAAI,UAAU,CAAC;YACvD,CAAC,CAAC,CAAC,aAAa,EAAE,IAAI,UAAU,CAAC,CAAC;QACpC,IAAI,SAAS,KAAK,SAAS;YAAE,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC5D,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAED,SAAS,0BAA0B,CAAC,IAAY,EAAE,OAAgB;IAChE,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,iBAAiB,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5D,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,OAAgB;IACxD,IAAI,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,eAAe,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC;IACrF,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC,GAAG,2BAA2B,EAAE,CAAC;AACnH,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,EACzC,KAAK,EACL,KAAK,EACL,WAAW,EACX,SAAS,EACT,OAAO,GAOR;IACC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC;IAC3C,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,IAAI,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC;IAChF,MAAM,aAAa,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,IAAI,sBAAsB,CAAC;QAC3C,KAAK;QACL,KAAK;QACL,WAAW;QACX,aAAa;QACb,aAAa;KACd,CAAC,CAAC;IAEH,MAAM,UAAU,GACd,aAAa,IAAI,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;IACnF,MAAM,EAAE,SAAS,EAAE,GAAG,yBAAyB,CAAC;QAC9C,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,eAAe;QAC1B,iBAAiB,EAAE,WAAW,CAAC,gBAAgB,IAAI,IAAI;QACvD,kBAAkB,EAAE,uBAAuB;QAC3C,WAAW,EAAE,EAAE;QACf,gBAAgB,EAAE,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS;QAC3E,iBAAiB,EAAE,0BAA0B;QAC7C,aAAa,EAAE,kBAAkB;QACjC,cAAc,EAAE,IAAI;QACpB,MAAM,EACJ,UAAU,KAAK,QAAQ;YACrB,CAAC,CAAC;gBACE,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC;gBAClF,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC;gBAC1E,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;gBACxD,aAAa,EAAE,sBAAsB;aACtC;YACH,CAAC,CAAC,SAAS;QACf,oBAAoB;QACpB,gBAAgB,EAAE,qBAAqB;QACvC,oBAAoB,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACrC,QAAQ,EAAE,OAAO;YACjB,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,cAAc;YAC5C,SAAS,EAAE,KAAK,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,iBAAiB,EAAE,UAAU;YAC7B,QAAQ,EAAE,MAAM;YAChB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,UAAU;SACX,CAAC;QACF,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CACb,aAAa,IAAI,MAAM;YACrB,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC;YACjD,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC;QAC5C,MAAM,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC;QAClE,SAAS,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,CAC9B,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,MAAM,IAAI,EAAE,EAAE,IAAI,CAAC;QACrE,cAAc,EAAE,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC;QAC9D,MAAM,EAAE,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;QAC/C,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACnE,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;QAC9C,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC;QAC5D,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;QAC5C,cAAc,EAAE,iBAAiB;QACjC,aAAa,EAAE,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;QACtD,UAAU,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAC9B,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QACtF,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACrB,IAAI,CAAC,aAAa;gBAAE,MAAM,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC9E,CAAC;KACF,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,SAAS;QACZ,cAAc,EAAE,KAAK,IAAI,EAAE;YACzB,SAAS,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,SAAS,CAAC,cAAc,EAAE,CAAC;QACnC,CAAC;QACD,aAAa,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;YACrC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;YACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,CAAC,aAAa,IAAI,MAAM;oBAC5B,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC;oBACjD,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC5C,OAAO;YACT,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,CAAC,aAAa,IAAI,MAAM;gBACvC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC;gBAC3D,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;YACjE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACpF,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { ConversationMessage, ConversationResponder, ChatToolResult } from \"../../types.js\";\nimport * as log from \"../../log.js\";\nimport { createProgressiveRenderer } from \"../progressive-renderer.js\";\nimport { splitText } from \"../shared.js\";\nimport { formatToolArgs } from \"../../harness/tool-args.js\";\nimport type { HandleTooLongInput } from \"../types.js\";\nimport { buildMrkdwnContextBlock, italicizeLines } from \"./bot.js\";\nimport type { SlackEvent, SlackAdapterSessionPlan, SlackResponderBot } from \"./types.js\";\nimport { renderSlackBlocks } from \"./blocks.js\";\nimport { normalizeSlackCurrencyBold } from \"./markdown.js\";\nimport { slackPersonaForProfile } from \"./persona.js\";\nimport { errorMessage } from \"../../unknown-values.js\";\n\nconst MAX_MAIN_LENGTH = 35000;\nconst STREAM_MIN_DELTA_CHARS = 256;\n\nconst MAX_THREAD_LENGTH = 20000;\nconst FALLBACK_MAIN_LENGTH = 3000;\nconst WORKING_INDICATOR = \"\\n\\n...\";\nconst TRUNCATION_NOTE_INCREMENTAL =\n \"\\n\\n_(message truncated, ask me to elaborate on specific parts)_\";\nconst formatSlackContinuation = (partNum: number): string => `_(continued ${partNum})_`;\n\nfunction isSlackMsgTooLong(err: unknown): boolean {\n const data = (err as { data?: { error?: string } } | undefined)?.data;\n const message = errorMessage(err);\n return data?.error === \"msg_too_long\" || message.includes(\"msg_too_long\");\n}\n\nfunction truncationCut(text: string, limit: number): number {\n if (text.length <= limit) return text.length;\n const lastBreak = text.lastIndexOf(\"\\n\", limit);\n return lastBreak > limit * 0.75 ? lastBreak : limit;\n}\n\nfunction fallbackLongSlackText(\n text: string,\n overflowLink?: string,\n prefixLength = FALLBACK_MAIN_LENGTH,\n): { text: string; cut: number } {\n const suffix = overflowLink\n ? `\\n\\n_(message too long for Slack; continued in thread; session view: <${overflowLink}|open>)_`\n : \"\\n\\n_(message too long for Slack; continued in thread)_\";\n const cut = truncationCut(text, prefixLength);\n return { text: `${text.slice(0, cut)}${suffix}`, cut };\n}\n\nasync function postSlackTextWithFallback(\n post: (text: string) => Promise<void>,\n text: string,\n overflowLink?: string,\n): Promise<{ text: string; prefixLength: number }> {\n let prefixLength = FALLBACK_MAIN_LENGTH;\n for (;;) {\n const fallback = fallbackLongSlackText(text, overflowLink, prefixLength);\n try {\n await post(fallback.text);\n return { text: fallback.text, prefixLength: fallback.cut };\n } catch (err) {\n if (!isSlackMsgTooLong(err)) throw err;\n if (prefixLength === 0) throw err;\n prefixLength = Math.max(0, Math.floor(prefixLength / 2));\n }\n }\n}\n\nfunction formatSlackToolResult(result: ChatToolResult): string {\n const argsFormatted = formatToolArgs(result.args);\n const duration = (result.durationMs / 1000).toFixed(1);\n let text = `*${result.isError ? \"✗\" : \"✓\"} ${result.toolName}*`;\n if (result.label) text += `: ${result.label}`;\n text += ` (${duration}s)\\n`;\n if (argsFormatted) text += `\\`\\`\\`\\n${argsFormatted}\\n\\`\\`\\`\\n`;\n text += `*Result:*\\n\\`\\`\\`\\n${result.result}\\n\\`\\`\\``;\n return text;\n}\n\nfunction closeOpenFences(text: string): string {\n let openMarker: string | null = null;\n for (const line of text.split(\"\\n\")) {\n const marker = line.match(/^\\s*(`{3,}|~{3,})/)?.[1];\n if (marker === undefined) continue;\n if (openMarker === null) openMarker = marker;\n else if (marker[0] === openMarker[0] && marker.length >= openMarker.length) openMarker = null;\n }\n return openMarker ? `${text}\\n${openMarker}` : text;\n}\n\nfunction needsCanonicalRender(text: string): boolean {\n if (normalizeSlackCurrencyBold(text) !== text) return true;\n return renderSlackBlocks(text).blocks.some((block) => block.type === \"table\");\n}\n\ninterface SlackResponseLifecycleOptions {\n event: SlackEvent;\n slack: SlackResponderBot;\n sessionPlan: SlackAdapterSessionPlan;\n replyInThread: boolean;\n eventFilename: string | undefined;\n}\n\nclass SlackResponseLifecycle {\n private assistantStatusFailureWarned = false;\n private statusEnded = false;\n private statusRequested = false;\n private pendingContinuation = \"\";\n private continuationAnchor: string | null = null;\n private continuationSent = \"\";\n\n constructor(private readonly context: SlackResponseLifecycleOptions) {}\n\n private onAssistantStatusError(label: string, err: unknown): void {\n if (this.assistantStatusFailureWarned) return;\n this.assistantStatusFailureWarned = true;\n log.logWarning(\n `Slack setAssistantStatus failed (${label}; further occurrences suppressed for this session)`,\n errorMessage(err),\n );\n }\n\n async postThreadDiagnostic(\n text: string,\n options: { style?: \"muted\" | \"error\" } = {},\n responseId: string | null,\n ): Promise<Array<string | number>> {\n const { event, sessionPlan, slack } = this.context;\n const threadAnchor = responseId ?? sessionPlan.rootTs;\n if (!threadAnchor) return [];\n const ids: string[] = [];\n for (const part of splitText(text, MAX_THREAD_LENGTH, formatSlackContinuation)) {\n if (options.style === \"muted\") {\n ids.push(\n await slack.postInThreadBlocks(event.channel, threadAnchor, part, [\n buildMrkdwnContextBlock(part),\n ]),\n );\n } else {\n ids.push(\n await slack.postInThread(\n event.channel,\n threadAnchor,\n options.style === \"error\" ? italicizeLines(part) : part,\n ),\n );\n }\n }\n return ids;\n }\n\n private async flushContinuation(): Promise<void> {\n if (!this.pendingContinuation || this.pendingContinuation === this.continuationSent) return;\n const extendsSentPrefix = this.pendingContinuation.startsWith(this.continuationSent);\n const unsent = extendsSentPrefix\n ? this.pendingContinuation.slice(this.continuationSent.length)\n : this.pendingContinuation;\n if (!unsent.trim()) return;\n await this.postThreadDiagnostic(\n extendsSentPrefix && this.continuationSent\n ? unsent\n : `_(continued from truncated message)_\\n\\n${unsent}`,\n {},\n this.continuationAnchor,\n );\n this.continuationSent = this.pendingContinuation;\n }\n\n private requestStatus(status: string): void {\n const { event, sessionPlan, slack } = this.context;\n if (!sessionPlan.rootTs) return;\n void slack\n .setAssistantStatus(event.channel, sessionPlan.rootTs, status)\n .catch((err) => this.onAssistantStatusError(status ? \"typing\" : \"clear-on-idle\", err));\n }\n\n endStatus(): void {\n if (this.statusEnded) return;\n this.statusEnded = true;\n this.requestStatus(\"\");\n }\n\n async deleteMessage(id: string): Promise<void> {\n this.endStatus();\n const { event, slack } = this.context;\n await slack.deleteMessage(event.channel, id);\n }\n\n async setTyping(isTyping: boolean, responseId: string | null): Promise<void> {\n const { eventFilename, sessionPlan } = this.context;\n if (!isTyping || responseId || !sessionPlan.rootTs || this.statusEnded || this.statusRequested)\n return;\n this.statusRequested = true;\n this.requestStatus(eventFilename ? `Starting event: ${eventFilename}` : \"Thinking\");\n }\n\n async onWorkingChanged(working: boolean): Promise<void> {\n if (!working) this.endStatus();\n }\n\n async onFinish(text: string, responseId: string | null): Promise<void> {\n const { event, replyInThread, sessionPlan, slack } = this.context;\n if (responseId && text.trim()) {\n slack.logBotResponse(\n event.channel,\n text,\n responseId,\n replyInThread ? sessionPlan.rootTs : undefined,\n { answer: { replyTo: event.ts, sessionKey: sessionPlan.sessionKey } },\n );\n }\n this.endStatus();\n await this.flushContinuation();\n }\n\n async handleTooLong({\n text,\n operation,\n options,\n responseId,\n write,\n getResponseId,\n }: HandleTooLongInput): Promise<{ text: string; prefixLength: number }> {\n const { replyInThread, sessionPlan } = this.context;\n let overflowLink: string | undefined;\n const resolveOverflowLink = (): string | undefined => {\n if (overflowLink === undefined && options?.createOverflowLink) {\n overflowLink = options.createOverflowLink();\n }\n return overflowLink;\n };\n const fallback = await postSlackTextWithFallback(write, text, resolveOverflowLink());\n\n this.pendingContinuation = text.slice(fallback.prefixLength).trimStart();\n this.continuationAnchor = replyInThread\n ? (sessionPlan.rootTs ?? getResponseId() ?? responseId)\n : (getResponseId() ?? responseId);\n if (operation === \"replace\") await this.flushContinuation();\n return fallback;\n }\n}\n\nfunction formatProvisionalSlackText(text: string, working: boolean): string {\n const closed = closeOpenFences(text);\n return working ? `${closed}${WORKING_INDICATOR}` : closed;\n}\n\nfunction prepareSlackSource(text: string, working: boolean): string {\n text = normalizeSlackCurrencyBold(text);\n const limit = working ? MAX_MAIN_LENGTH - WORKING_INDICATOR.length : MAX_MAIN_LENGTH;\n if (text.length <= limit) return text;\n return `${text.slice(0, Math.max(0, limit - TRUNCATION_NOTE_INCREMENTAL.length))}${TRUNCATION_NOTE_INCREMENTAL}`;\n}\n\nexport function createSlackResponseContext({\n event,\n slack,\n sessionPlan,\n replyMode,\n message,\n}: {\n event: SlackEvent;\n slack: SlackResponderBot;\n sessionPlan: SlackAdapterSessionPlan;\n replyMode: \"top-level\" | \"thread\";\n message: ConversationMessage;\n}): ConversationResponder {\n const { rootTs, isThreaded } = sessionPlan;\n const replyInThread = Boolean(rootTs && (isThreaded || replyMode === \"thread\"));\n const eventFilename = event.ts.match(/^event:([^:]+(?:\\.json)?)/)?.[1];\n const lifecycle = new SlackResponseLifecycle({\n event,\n slack,\n sessionPlan,\n replyInThread,\n eventFilename,\n });\n\n const streamKind =\n replyInThread && rootTs && slack.tryReserveStreamStart() ? \"native\" : \"buffered\";\n const { responder } = createProgressiveRenderer({\n label: \"Slack\",\n maxLength: MAX_MAIN_LENGTH,\n initialResponseId: sessionPlan.initialMessageTs ?? null,\n formatContinuation: formatSlackContinuation,\n errorPrefix: \"\",\n workingIndicator: streamKind === \"buffered\" ? WORKING_INDICATOR : undefined,\n formatProvisional: formatProvisionalSlackText,\n prepareSource: prepareSlackSource,\n supportsDeltas: true,\n stream:\n streamKind === \"native\"\n ? {\n start: (text) => slack.startMessageStream(event.channel, text, rootTs, event.user),\n append: (id, delta) => slack.appendMessageStream(event.channel, id, delta),\n stop: (id) => slack.stopMessageStream(event.channel, id),\n minDeltaChars: STREAM_MIN_DELTA_CHARS,\n }\n : undefined,\n needsCanonicalRender,\n formatToolResult: formatSlackToolResult,\n responseErrorContext: (responseId) => ({\n platform: \"slack\",\n conversationId: event.address.conversationId,\n channelId: event.channel,\n messageId: message.id,\n sessionKey: message.sessionKey,\n responseMessageId: responseId,\n threadTs: rootTs,\n conversationKind: message.conversationKind,\n isThreaded,\n }),\n post: (text) =>\n replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text)\n : slack.postMessage(event.channel, text),\n update: (id, text) => slack.updateMessage(event.channel, id, text),\n postExtra: (text, responseId) =>\n slack.postInThread(event.channel, responseId ?? rootTs ?? \"\", text),\n postDiagnostic: lifecycle.postThreadDiagnostic.bind(lifecycle),\n delete: lifecycle.deleteMessage.bind(lifecycle),\n deleteExtra: (id) => slack.deleteMessage(event.channel, String(id)),\n setTyping: lifecycle.setTyping.bind(lifecycle),\n onWorkingChanged: lifecycle.onWorkingChanged.bind(lifecycle),\n onFinish: lifecycle.onFinish.bind(lifecycle),\n isTooLongError: isSlackMsgTooLong,\n handleTooLong: lifecycle.handleTooLong.bind(lifecycle),\n uploadFile: (filePath, title) =>\n slack.uploadFile(event.channel, filePath, title, replyInThread ? rootTs : undefined),\n react: async (emoji) => {\n if (!eventFilename) await slack.addReaction(event.channel, event.ts, emoji);\n },\n });\n\n return {\n ...responder,\n deleteResponse: async () => {\n lifecycle.endStatus();\n await responder.deleteResponse();\n },\n respondAsRole: async (profile, text) => {\n const identity = slackPersonaForProfile(profile);\n if (!identity) {\n await (replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text)\n : slack.postMessage(event.channel, text));\n return;\n }\n const ts = await (replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text, identity)\n : slack.postMessage(event.channel, text, undefined, identity));\n slack.logBotResponse(event.channel, text, ts, replyInThread ? rootTs : undefined);\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"response-lifecycle.js","sourceRoot":"","sources":["../../../src/adapters/slack/response-lifecycle.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ConversationMessage, ConversationResponder, ChatToolResult } from \"../../types.js\";\nimport * as log from \"../../log.js\";\nimport { createProgressiveRenderer } from \"../progressive-renderer.js\";\nimport { splitText } from \"../shared.js\";\nimport { formatToolArgs } from \"../../harness/tool-args.js\";\nimport type { HandleTooLongInput } from \"../types.js\";\nimport { buildMrkdwnContextBlock, italicizeLines } from \"./bot.js\";\nimport type { SlackEvent, SlackAdapterSessionPlan, SlackResponderBot } from \"./types.js\";\nimport { renderSlackBlocks } from \"./blocks.js\";\nimport { normalizeSlackCurrencyBold } from \"./markdown.js\";\nimport { slackPersonaForProfile } from \"./persona.js\";\nimport { errorMessage } from \"../../unknown-values.js\";\n\nconst MAX_MAIN_LENGTH = 35000;\n\nconst MAX_THREAD_LENGTH = 20000;\nconst FALLBACK_MAIN_LENGTH = 3000;\nconst WORKING_INDICATOR = \"\\n\\n...\";\nconst TRUNCATION_NOTE_INCREMENTAL =\n \"\\n\\n_(message truncated, ask me to elaborate on specific parts)_\";\nconst formatSlackContinuation = (partNum: number): string => `_(continued ${partNum})_`;\n\nfunction isSlackMsgTooLong(err: unknown): boolean {\n const data = (err as { data?: { error?: string } } | undefined)?.data;\n const message = errorMessage(err);\n return data?.error === \"msg_too_long\" || message.includes(\"msg_too_long\");\n}\n\nfunction truncationCut(text: string, limit: number): number {\n if (text.length <= limit) return text.length;\n const lastBreak = text.lastIndexOf(\"\\n\", limit);\n return lastBreak > limit * 0.75 ? lastBreak : limit;\n}\n\nfunction fallbackLongSlackText(\n text: string,\n overflowLink?: string,\n prefixLength = FALLBACK_MAIN_LENGTH,\n): { text: string; cut: number } {\n const suffix = overflowLink\n ? `\\n\\n_(message too long for Slack; continued in thread; session view: <${overflowLink}|open>)_`\n : \"\\n\\n_(message too long for Slack; continued in thread)_\";\n const cut = truncationCut(text, prefixLength);\n return { text: `${text.slice(0, cut)}${suffix}`, cut };\n}\n\nasync function postSlackTextWithFallback(\n post: (text: string) => Promise<void>,\n text: string,\n overflowLink?: string,\n): Promise<{ text: string; prefixLength: number }> {\n let prefixLength = FALLBACK_MAIN_LENGTH;\n for (;;) {\n const fallback = fallbackLongSlackText(text, overflowLink, prefixLength);\n try {\n await post(fallback.text);\n return { text: fallback.text, prefixLength: fallback.cut };\n } catch (err) {\n if (!isSlackMsgTooLong(err)) throw err;\n if (prefixLength === 0) throw err;\n prefixLength = Math.max(0, Math.floor(prefixLength / 2));\n }\n }\n}\n\nfunction formatSlackToolResult(result: ChatToolResult): string {\n const argsFormatted = formatToolArgs(result.args);\n const duration = (result.durationMs / 1000).toFixed(1);\n let text = `*${result.isError ? \"✗\" : \"✓\"} ${result.toolName}*`;\n if (result.label) text += `: ${result.label}`;\n text += ` (${duration}s)\\n`;\n if (argsFormatted) text += `\\`\\`\\`\\n${argsFormatted}\\n\\`\\`\\`\\n`;\n text += `*Result:*\\n\\`\\`\\`\\n${result.result}\\n\\`\\`\\``;\n return text;\n}\n\nfunction closeOpenFences(text: string): string {\n let openMarker: string | null = null;\n for (const line of text.split(\"\\n\")) {\n const marker = line.match(/^\\s*(`{3,}|~{3,})/)?.[1];\n if (marker === undefined) continue;\n if (openMarker === null) openMarker = marker;\n else if (marker[0] === openMarker[0] && marker.length >= openMarker.length) openMarker = null;\n }\n return openMarker ? `${text}\\n${openMarker}` : text;\n}\n\nfunction needsCanonicalRender(text: string): boolean {\n if (normalizeSlackCurrencyBold(text) !== text) return true;\n return renderSlackBlocks(text).blocks.some((block) => block.type === \"table\");\n}\n\ninterface SlackResponseLifecycleOptions {\n event: SlackEvent;\n slack: SlackResponderBot;\n sessionPlan: SlackAdapterSessionPlan;\n replyInThread: boolean;\n eventFilename: string | undefined;\n}\n\nclass SlackResponseLifecycle {\n private assistantStatusFailureWarned = false;\n private statusEnded = false;\n private statusRequested = false;\n private pendingContinuation = \"\";\n private continuationAnchor: string | null = null;\n private continuationSent = \"\";\n\n constructor(private readonly context: SlackResponseLifecycleOptions) {}\n\n private onAssistantStatusError(label: string, err: unknown): void {\n if (this.assistantStatusFailureWarned) return;\n this.assistantStatusFailureWarned = true;\n log.logWarning(\n `Slack setAssistantStatus failed (${label}; further occurrences suppressed for this session)`,\n errorMessage(err),\n );\n }\n\n async postThreadDiagnostic(\n text: string,\n options: { style?: \"muted\" | \"error\" } = {},\n responseId: string | null,\n ): Promise<Array<string | number>> {\n const { event, sessionPlan, slack } = this.context;\n const threadAnchor = responseId ?? sessionPlan.rootTs;\n if (!threadAnchor) return [];\n const ids: string[] = [];\n for (const part of splitText(text, MAX_THREAD_LENGTH, formatSlackContinuation)) {\n if (options.style === \"muted\") {\n ids.push(\n await slack.postInThreadBlocks(event.channel, threadAnchor, part, [\n buildMrkdwnContextBlock(part),\n ]),\n );\n } else {\n ids.push(\n await slack.postInThread(\n event.channel,\n threadAnchor,\n options.style === \"error\" ? italicizeLines(part) : part,\n ),\n );\n }\n }\n return ids;\n }\n\n private async flushContinuation(): Promise<void> {\n if (!this.pendingContinuation || this.pendingContinuation === this.continuationSent) return;\n const extendsSentPrefix = this.pendingContinuation.startsWith(this.continuationSent);\n const unsent = extendsSentPrefix\n ? this.pendingContinuation.slice(this.continuationSent.length)\n : this.pendingContinuation;\n if (!unsent.trim()) return;\n await this.postThreadDiagnostic(\n extendsSentPrefix && this.continuationSent\n ? unsent\n : `_(continued from truncated message)_\\n\\n${unsent}`,\n {},\n this.continuationAnchor,\n );\n this.continuationSent = this.pendingContinuation;\n }\n\n private requestStatus(status: string): void {\n const { event, sessionPlan, slack } = this.context;\n if (!sessionPlan.rootTs) return;\n void slack\n .setAssistantStatus(event.channel, sessionPlan.rootTs, status)\n .catch((err) => this.onAssistantStatusError(status ? \"typing\" : \"clear-on-idle\", err));\n }\n\n endStatus(): void {\n if (this.statusEnded) return;\n this.statusEnded = true;\n this.requestStatus(\"\");\n }\n\n async deleteMessage(id: string): Promise<void> {\n this.endStatus();\n const { event, slack } = this.context;\n await slack.deleteMessage(event.channel, id);\n }\n\n async setTyping(isTyping: boolean, responseId: string | null): Promise<void> {\n const { eventFilename, sessionPlan } = this.context;\n if (!isTyping || responseId || !sessionPlan.rootTs || this.statusEnded || this.statusRequested)\n return;\n this.statusRequested = true;\n this.requestStatus(eventFilename ? `Starting event: ${eventFilename}` : \"Thinking\");\n }\n\n async onWorkingChanged(working: boolean): Promise<void> {\n if (!working) this.endStatus();\n }\n\n async onFinish(text: string, responseId: string | null): Promise<void> {\n const { event, replyInThread, sessionPlan, slack } = this.context;\n if (responseId && text.trim()) {\n slack.logBotResponse(\n event.channel,\n text,\n responseId,\n replyInThread ? sessionPlan.rootTs : undefined,\n { answer: { replyTo: event.ts, sessionKey: sessionPlan.sessionKey } },\n );\n }\n this.endStatus();\n await this.flushContinuation();\n }\n\n async handleTooLong({\n text,\n operation,\n options,\n responseId,\n write,\n getResponseId,\n }: HandleTooLongInput): Promise<{ text: string; prefixLength: number }> {\n const { replyInThread, sessionPlan } = this.context;\n let overflowLink: string | undefined;\n const resolveOverflowLink = (): string | undefined => {\n if (overflowLink === undefined && options?.createOverflowLink) {\n overflowLink = options.createOverflowLink();\n }\n return overflowLink;\n };\n const fallback = await postSlackTextWithFallback(write, text, resolveOverflowLink());\n\n this.pendingContinuation = text.slice(fallback.prefixLength).trimStart();\n this.continuationAnchor = replyInThread\n ? (sessionPlan.rootTs ?? getResponseId() ?? responseId)\n : (getResponseId() ?? responseId);\n if (operation === \"replace\") await this.flushContinuation();\n return fallback;\n }\n}\n\nfunction formatProvisionalSlackText(text: string, working: boolean): string {\n const closed = closeOpenFences(text);\n return working ? `${closed}${WORKING_INDICATOR}` : closed;\n}\n\nfunction prepareSlackSource(text: string, working: boolean): string {\n text = normalizeSlackCurrencyBold(text);\n const limit = working ? MAX_MAIN_LENGTH - WORKING_INDICATOR.length : MAX_MAIN_LENGTH;\n if (text.length <= limit) return text;\n return `${text.slice(0, Math.max(0, limit - TRUNCATION_NOTE_INCREMENTAL.length))}${TRUNCATION_NOTE_INCREMENTAL}`;\n}\n\nexport function createSlackResponseContext({\n event,\n slack,\n sessionPlan,\n replyMode,\n message,\n}: {\n event: SlackEvent;\n slack: SlackResponderBot;\n sessionPlan: SlackAdapterSessionPlan;\n replyMode: \"top-level\" | \"thread\";\n message: ConversationMessage;\n}): ConversationResponder {\n const { rootTs, isThreaded } = sessionPlan;\n const replyInThread = Boolean(rootTs && (isThreaded || replyMode === \"thread\"));\n const eventFilename = event.ts.match(/^event:([^:]+(?:\\.json)?)/)?.[1];\n const lifecycle = new SlackResponseLifecycle({\n event,\n slack,\n sessionPlan,\n replyInThread,\n eventFilename,\n });\n\n const streamKind =\n replyInThread && rootTs && slack.tryReserveStreamStart() ? \"native\" : \"buffered\";\n const { responder } = createProgressiveRenderer({\n label: \"Slack\",\n maxLength: MAX_MAIN_LENGTH,\n initialResponseId: sessionPlan.initialMessageTs ?? null,\n formatContinuation: formatSlackContinuation,\n errorPrefix: \"\",\n workingIndicator: streamKind === \"buffered\" ? WORKING_INDICATOR : undefined,\n formatProvisional: formatProvisionalSlackText,\n prepareSource: prepareSlackSource,\n showsPartialAnswer: true,\n stream:\n streamKind === \"native\"\n ? {\n start: (text) => slack.startMessageStream(event.channel, text, rootTs, event.user),\n append: (id, delta) => slack.appendMessageStream(event.channel, id, delta),\n stop: (id) => slack.stopMessageStream(event.channel, id),\n }\n : undefined,\n needsCanonicalRender,\n formatToolResult: formatSlackToolResult,\n responseErrorContext: (responseId) => ({\n platform: \"slack\",\n conversationId: event.address.conversationId,\n channelId: event.channel,\n messageId: message.id,\n sessionKey: message.sessionKey,\n responseMessageId: responseId,\n threadTs: rootTs,\n conversationKind: message.conversationKind,\n isThreaded,\n }),\n post: (text) =>\n replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text)\n : slack.postMessage(event.channel, text),\n update: (id, text) => slack.updateMessage(event.channel, id, text),\n postExtra: (text, responseId) =>\n slack.postInThread(event.channel, responseId ?? rootTs ?? \"\", text),\n postDiagnostic: lifecycle.postThreadDiagnostic.bind(lifecycle),\n delete: lifecycle.deleteMessage.bind(lifecycle),\n deleteExtra: (id) => slack.deleteMessage(event.channel, String(id)),\n setTyping: lifecycle.setTyping.bind(lifecycle),\n onWorkingChanged: lifecycle.onWorkingChanged.bind(lifecycle),\n onFinish: lifecycle.onFinish.bind(lifecycle),\n isTooLongError: isSlackMsgTooLong,\n handleTooLong: lifecycle.handleTooLong.bind(lifecycle),\n uploadFile: (filePath, title) =>\n slack.uploadFile(event.channel, filePath, title, replyInThread ? rootTs : undefined),\n react: async (emoji) => {\n if (!eventFilename) await slack.addReaction(event.channel, event.ts, emoji);\n },\n });\n\n return {\n ...responder,\n deleteResponse: async () => {\n lifecycle.endStatus();\n await responder.deleteResponse();\n },\n respondAsRole: async (profile, text) => {\n const identity = slackPersonaForProfile(profile);\n if (!identity) {\n await (replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text)\n : slack.postMessage(event.channel, text));\n return;\n }\n const ts = await (replyInThread && rootTs\n ? slack.postInThread(event.channel, rootTs, text, identity)\n : slack.postMessage(event.channel, text, undefined, identity));\n slack.logBotResponse(event.channel, text, ts, replyInThread ? rootTs : undefined);\n },\n };\n}\n"]}
|
|
@@ -32,7 +32,7 @@ export function createTelegramAdapters(event, bot) {
|
|
|
32
32
|
maxLength: MAX_LENGTH,
|
|
33
33
|
formatContinuation: (partNum) => `(continued ${partNum})`,
|
|
34
34
|
errorPrefix: "Error: ",
|
|
35
|
-
|
|
35
|
+
showsPartialAnswer: true,
|
|
36
36
|
typing: {
|
|
37
37
|
send: () => bot.sendTyping(chatId),
|
|
38
38
|
intervalMs: 4000,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/telegram/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG5D,MAAM,UAAU,GAAG,KAAK,CAAC;AAEzB,SAAS,gBAAgB,CAAC,MAAsB;IAC9C,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC;IACjI,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,KAAoB,EACpB,GAAwB;IAExB,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC;IACpD,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAErE,MAAM,OAAO,GAAG,yBAAyB,CAAC;QACxC,QAAQ,EAAE,UAAU;QACpB,cAAc;QACd,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,UAAU,EAAE,gBAAgB,CAAC,KAAK,CAAC;QACnC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,MAAM,EAAE,KAAK,CAAC,IAAI;QAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS;KAC1B,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAExC,MAAM,EAAE,SAAS,EAAE,GAAG,yBAAyB,CAAC;QAC9C,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,UAAU;QACrB,kBAAkB,EAAE,CAAC,OAAe,EAAU,EAAE,CAAC,cAAc,OAAO,GAAG;QACzE,WAAW,EAAE,SAAS;QACtB,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/adapters/telegram/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { createConversationMessage } from \"../../office/index.js\";\nimport type { ChatToolResult, ConversationContext } from \"../../types.js\";\nimport { deriveSessionKey } from \"../../sessions/session-key.js\";\nimport { createProgressiveRenderer } from \"../progressive-renderer.js\";\nimport { formatToolArgs } from \"../../harness/tool-args.js\";\nimport type { TelegramEvent, TelegramResponseBot } from \"./types.js\";\n\nconst MAX_LENGTH = 30000;\n\nfunction formatToolResult(result: ChatToolResult): string {\n const argsFormatted = formatToolArgs(result.args);\n const duration = (result.durationMs / 1000).toFixed(1);\n const title = `${result.isError ? \"Error\" : \"Done\"} ${result.toolName}${result.label ? `: ${result.label}` : \"\"} (${duration}s)`;\n return [title, argsFormatted, result.result].filter(Boolean).join(\"\\n\\n\");\n}\n\nexport function createTelegramAdapters(\n event: TelegramEvent,\n bot: TelegramResponseBot,\n): ConversationContext {\n const conversationId = event.address.conversationId;\n const chatId = parseInt(conversationId);\n const replyToId = event.thread_ts ? parseInt(event.thread_ts) : null;\n\n const message = createConversationMessage({\n platform: \"telegram\",\n conversationId,\n address: event.address,\n id: event.ts,\n sessionKey: deriveSessionKey(event),\n conversationKind: event.conversationKind,\n userId: event.user,\n userName: event.userName,\n text: event.text,\n attachments: event.attachments,\n threadTs: event.thread_ts,\n });\n\n const platform = bot.getMessagingInfo();\n\n const { responder } = createProgressiveRenderer({\n label: \"Telegram\",\n maxLength: MAX_LENGTH,\n formatContinuation: (partNum: number): string => `(continued ${partNum})`,\n errorPrefix: \"Error: \",\n showsPartialAnswer: true,\n typing: {\n send: () => bot.sendTyping(chatId),\n intervalMs: 4000,\n },\n formatToolResult,\n responseErrorContext: (responseId) => ({\n platform: \"telegram\",\n conversationId,\n chatId,\n messageId: message.id,\n sessionKey: message.sessionKey,\n responseMessageId: responseId,\n replyToId,\n conversationKind: message.conversationKind,\n }),\n notifySendFailure: async (errorMessage) => {\n await bot.postPlainMessage(chatId, `⚠️ 發送失敗:${errorMessage}`);\n },\n post: async (text) => {\n const id =\n replyToId !== null\n ? await bot.postReply(chatId, replyToId, text)\n : await bot.postMessageRaw(chatId, text);\n return String(id);\n },\n update: (id, text) => bot.updateMessage(conversationId, id, text),\n postExtra: (text) => bot.postMessageRaw(chatId, text),\n delete: (id) => bot.deleteMessageRaw(chatId, Number(id)),\n logBotResponse: (text, id) =>\n bot.logBotResponse(conversationId, text, id, undefined, {\n answer: { replyTo: message.id, sessionKey: message.sessionKey },\n }),\n uploadFile: (filePath, title) => bot.uploadFile(conversationId, filePath, title),\n react: (emoji) => bot.addReaction(conversationId, event.ts, emoji),\n });\n\n return { address: message.address, message, responder, platform };\n}\n"]}
|
package/dist/adapters/types.d.ts
CHANGED
|
@@ -41,7 +41,6 @@ interface ProgressiveStreamTransport {
|
|
|
41
41
|
start(text: string): Promise<string>;
|
|
42
42
|
append(messageId: string, delta: string): Promise<void>;
|
|
43
43
|
stop(messageId: string): Promise<void>;
|
|
44
|
-
minDeltaChars?: number;
|
|
45
44
|
}
|
|
46
45
|
export interface ProgressiveRendererPlatform {
|
|
47
46
|
label: string;
|
|
@@ -58,7 +57,7 @@ export interface ProgressiveRendererPlatform {
|
|
|
58
57
|
setTyping?: (isTyping: boolean, responseId: string | null) => Promise<void>;
|
|
59
58
|
onFinish?: (text: string, responseId: string | null) => void | Promise<void>;
|
|
60
59
|
logIntermediateResponses?: boolean;
|
|
61
|
-
|
|
60
|
+
showsPartialAnswer?: boolean;
|
|
62
61
|
stream?: ProgressiveStreamTransport;
|
|
63
62
|
needsCanonicalRender?: (text: string) => boolean;
|
|
64
63
|
formatSubagentProgress?: (progress: SubagentProgressSnapshot) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,qBAAqB,EACrB,aAAa,EACb,wBAAwB,EACzB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,0BAA0B,GAClC,SAAS,GACT,kBAAkB,GAClB,oBAAoB,GACpB,aAAa,CAAC;AAElB,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,0BAA0B,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,MAAM,yBAAyB,GAAG,CACtC,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,0BAA0B,EACrC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC5B,IAAI,CAAC;AAEV,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,OAAO,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,qBAAqB,CAAC;IAC/B,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,OAAO,EAAE;QAAE,kBAAkB,CAAC,EAAE,MAAM,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IAC3D,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,aAAa,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,UAAU,0BAA0B;IAClC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n Attachment,\n ChatToolResult,\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n ConversationLogMessage,\n LoggedAttachment,\n MessagingEventHandler,\n OfficeAddress,\n SubagentProgressSnapshot,\n} from \"../types.js\";\n\nexport type ChatResponseErrorOperation =\n | \"respond\"\n | \"replace_response\"\n | \"respond_diagnostic\"\n | \"set_working\";\n\nexport interface ChatResponseErrorContext {\n platform: string;\n conversationId: string;\n messageId: string;\n sessionKey: string;\n conversationKind: string;\n operation: ChatResponseErrorOperation;\n channelId?: string;\n chatId?: number;\n responseMessageId?: string | number | null;\n threadTs?: string;\n replyTargetId?: string;\n replyToId?: number | null;\n isThreaded?: boolean;\n extra?: Record<string, unknown>;\n}\n\nexport type ChatResponseErrorReporter = (\n err: unknown,\n operation: ChatResponseErrorOperation,\n extra?: Record<string, unknown>,\n) => void;\n\nexport interface RetryOptions {\n isRateLimited: (err: Error) => boolean;\n maxAttempts?: number;\n baseDelayMs?: number;\n}\n\nexport interface ResolveStopTargetInput {\n handler: MessagingEventHandler;\n address: OfficeAddress;\n sessionKey?: string;\n}\n\nexport interface HandleTooLongInput {\n text: string;\n operation: \"render\" | \"replace\";\n options: { createOverflowLink?: () => string } | undefined;\n responseId: string | null;\n write: (text: string) => Promise<void>;\n getResponseId: () => string | null;\n}\n\ninterface ProgressiveStreamTransport {\n start(text: string): Promise<string>;\n append(messageId: string, delta: string): Promise<void>;\n stop(messageId: string): Promise<void>;\n
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n Attachment,\n ChatToolResult,\n MessagingBot,\n ConversationContext,\n ConversationEvent,\n ConversationLogMessage,\n LoggedAttachment,\n MessagingEventHandler,\n OfficeAddress,\n SubagentProgressSnapshot,\n} from \"../types.js\";\n\nexport type ChatResponseErrorOperation =\n | \"respond\"\n | \"replace_response\"\n | \"respond_diagnostic\"\n | \"set_working\";\n\nexport interface ChatResponseErrorContext {\n platform: string;\n conversationId: string;\n messageId: string;\n sessionKey: string;\n conversationKind: string;\n operation: ChatResponseErrorOperation;\n channelId?: string;\n chatId?: number;\n responseMessageId?: string | number | null;\n threadTs?: string;\n replyTargetId?: string;\n replyToId?: number | null;\n isThreaded?: boolean;\n extra?: Record<string, unknown>;\n}\n\nexport type ChatResponseErrorReporter = (\n err: unknown,\n operation: ChatResponseErrorOperation,\n extra?: Record<string, unknown>,\n) => void;\n\nexport interface RetryOptions {\n isRateLimited: (err: Error) => boolean;\n maxAttempts?: number;\n baseDelayMs?: number;\n}\n\nexport interface ResolveStopTargetInput {\n handler: MessagingEventHandler;\n address: OfficeAddress;\n sessionKey?: string;\n}\n\nexport interface HandleTooLongInput {\n text: string;\n operation: \"render\" | \"replace\";\n options: { createOverflowLink?: () => string } | undefined;\n responseId: string | null;\n write: (text: string) => Promise<void>;\n getResponseId: () => string | null;\n}\n\ninterface ProgressiveStreamTransport {\n start(text: string): Promise<string>;\n append(messageId: string, delta: string): Promise<void>;\n stop(messageId: string): Promise<void>;\n}\n\nexport interface ProgressiveRendererPlatform {\n label: string;\n maxLength: number;\n flushIntervalMs?: number;\n initialResponseId?: string | null;\n formatContinuation: (partNum: number) => string;\n errorPrefix: string;\n sanitize?: (text: string) => string;\n workingIndicator?: string;\n formatProvisional?: (text: string, working: boolean) => string;\n prepareSource?: (text: string, working: boolean) => string;\n onWorkingChanged?: (working: boolean, responseId: string | null) => Promise<void>;\n setTyping?: (isTyping: boolean, responseId: string | null) => Promise<void>;\n onFinish?: (text: string, responseId: string | null) => void | Promise<void>;\n logIntermediateResponses?: boolean;\n showsPartialAnswer?: boolean;\n stream?: ProgressiveStreamTransport;\n needsCanonicalRender?: (text: string) => boolean;\n formatSubagentProgress?: (progress: SubagentProgressSnapshot) => string;\n typing?: {\n send: () => Promise<unknown>;\n intervalMs: number;\n stopOnSend?: boolean;\n };\n formatToolResult: (result: ChatToolResult) => string;\n responseErrorContext?: (\n responseId: string | null,\n ) => Omit<ChatResponseErrorContext, \"operation\" | \"extra\">;\n notifySendFailure?: (errorMessage: string) => Promise<void>;\n post: (text: string) => Promise<string>;\n update: (id: string, text: string) => Promise<void>;\n postExtra: (text: string, responseId: string | null) => Promise<string | number | void>;\n postDiagnostic?: (\n text: string,\n options: { style?: \"muted\" | \"error\" },\n responseId: string | null,\n ) => Promise<Array<string | number>>;\n delete?: (id: string) => Promise<void>;\n deleteExtra?: (id: string | number) => Promise<void>;\n logBotResponse?: (text: string, id: string) => void;\n uploadFile?: (filePath: string, title?: string) => Promise<void>;\n uploadFallbackNote?: (name: string) => string;\n react?: (emoji: string) => Promise<void>;\n isTooLongError?: (err: unknown) => boolean;\n handleTooLong?: (input: HandleTooLongInput) => Promise<{ text: string; prefixLength?: number }>;\n}\n\nexport type MessageIntakeOutcome = \"magic-word\" | \"not-triggered\" | \"rejected-busy\" | \"enqueued\";\n\nexport type QueueAdmission = \"started\" | \"waiting\" | \"closed\";\n\nexport interface MagicWordIntakeOptions {\n text?: string;\n addressed: boolean;\n scopeFallback: \"top-level\" | \"always\" | \"never\";\n}\n\nexport interface IncomingAttachment {\n name: string;\n timestampMs?: number;\n download(destPath: string): Promise<void>;\n}\n\nexport interface SavedAttachments {\n saved: Attachment[];\n failed: { name: string; error: unknown }[];\n}\n\nexport interface MessageIntakeOptions<TEvent extends ConversationEvent> {\n eventBase: TEvent;\n addressed: boolean;\n magicWord: MagicWordIntakeOptions;\n busyPolicy: \"queue\" | \"reject\";\n logEntryBase: ConversationLogMessage;\n log?: (entry: ConversationLogMessage) => void;\n processAttachments: () => Promise<LoggedAttachment[]>;\n queueKey: string;\n enqueue: (queueKey: string, work: () => Promise<void>) => QueueAdmission;\n react?: (emoji: string) => Promise<void>;\n handler: MessagingEventHandler;\n bot: MessagingBot;\n createContext: (event: TEvent) => ConversationContext;\n deferAttachmentsUntilRun?: boolean;\n}\n\nexport interface MarkdownTable {\n headers: string[];\n rows: string[][];\n startLine: number;\n endLine: number;\n}\n"]}
|
package/dist/file-guards.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Static, TSchema } from "typebox";
|
|
2
|
+
import type { Dirent } from "node:fs";
|
|
2
3
|
type JsonFailureKind = "syntax" | "shape" | "field";
|
|
3
4
|
type MalformedJsonMessage = (detail: string, kind: JsonFailureKind) => string;
|
|
4
5
|
export declare function ensureDirExists(dir: string): void;
|
|
@@ -6,6 +7,7 @@ export declare function ensurePrivateDirExists(dir: string): void;
|
|
|
6
7
|
export declare function readTextFileNoFollowIfExists(path: string): string | undefined;
|
|
7
8
|
export interface PinnedDirectory {
|
|
8
9
|
pathOf(name: string): string;
|
|
10
|
+
entries(): Dirent[];
|
|
9
11
|
close(): void;
|
|
10
12
|
}
|
|
11
13
|
export declare function pinDirectoryNoFollow(dir: string): PinnedDirectory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-guards.d.ts","sourceRoot":"","sources":["../src/file-guards.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"file-guards.d.ts","sourceRoot":"","sources":["../src/file-guards.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAc/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAOtC,KAAK,eAAe,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;AAEpD,KAAK,oBAAoB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,KAAK,MAAM,CAAC;AAI9E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAExD;AAmBD,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAa7E;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,OAAO,IAAI,MAAM,EAAE,CAAC;IACpB,KAAK,IAAI,IAAI,CAAC;CACf;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAkBjE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAUtE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASrE;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,EACxC,gBAAgB,EAAE,oBAAoB,GACrC,CAAC,GAAG,SAAS,CAGf;AAED,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,OAAO,EAC1D,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,EACT,gBAAgB,EAAE,oBAAoB,GACrC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAGvB;AAWD,wBAAgB,cAAc,CAAC,CAAC,EAC9B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,KAAK,IAAI,CAAC,EACxC,gBAAgB,EAAE,oBAAoB,GACrC,CAAC,CAMH;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,OAAO,EACpD,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,CAAC,EACT,gBAAgB,EAAE,oBAAoB,GACrC,MAAM,CAAC,CAAC,CAAC,CAUX;AAID,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CA6BhF;AAQD,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,IAAI,CAWN"}
|
package/dist/file-guards.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Value } from "typebox/value";
|
|
2
|
-
import { closeSync, constants as fsConstants, fstatSync, mkdirSync, openSync, readFileSync, renameSync, unlinkSync, writeSync, } from "node:fs";
|
|
2
|
+
import { closeSync, constants as fsConstants, fstatSync, mkdirSync, openSync, readFileSync, readdirSync, renameSync, unlinkSync, writeSync, } from "node:fs";
|
|
3
3
|
import { resolve } from "node:path";
|
|
4
4
|
import * as log from "./log.js";
|
|
5
5
|
import { randomBytes } from "node:crypto";
|
|
@@ -62,6 +62,7 @@ export function pinDirectoryNoFollow(dir) {
|
|
|
62
62
|
}
|
|
63
63
|
return join(base, name);
|
|
64
64
|
},
|
|
65
|
+
entries: () => readdirSync(base, { withFileTypes: true }),
|
|
65
66
|
close: () => closeSync(fd),
|
|
66
67
|
};
|
|
67
68
|
}
|
package/dist/file-guards.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-guards.js","sourceRoot":"","sources":["../src/file-guards.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Static, TSchema } from \"typebox\";\nimport { Value } from \"typebox/value\";\nimport {\n closeSync,\n constants as fsConstants,\n fstatSync,\n mkdirSync,\n openSync,\n readFileSync,\n renameSync,\n unlinkSync,\n writeSync,\n} from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport * as log from \"./log.js\";\nimport { randomBytes } from \"node:crypto\";\nimport { basename, dirname, join } from \"node:path\";\nimport { errorMessage } from \"./unknown-values.js\";\n\ntype JsonFailureKind = \"syntax\" | \"shape\" | \"field\";\n\ntype MalformedJsonMessage = (detail: string, kind: JsonFailureKind) => string;\n\nconst UNEXPECTED_JSON_SHAPE = \"unexpected JSON shape\";\n\nexport function ensureDirExists(dir: string): void {\n mkdirSync(dir, { recursive: true });\n}\n\nexport function ensurePrivateDirExists(dir: string): void {\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n}\n\nfunction openRegularFileNoFollow(path: string, flags: number): number {\n let fd: number;\n try {\n fd = openSync(path, flags | fsConstants.O_NOFOLLOW | fsConstants.O_NONBLOCK, 0o644);\n } catch (err) {\n if (err instanceof Error && \"code\" in err && err.code === \"ELOOP\") {\n throw new Error(`Refusing to follow a symbolic link: ${path}`, { cause: err });\n }\n throw err;\n }\n if (!fstatSync(fd).isFile()) {\n closeSync(fd);\n throw new Error(`Expected a regular file: ${path}`);\n }\n return fd;\n}\n\nexport function readTextFileNoFollowIfExists(path: string): string | undefined {\n let fd: number;\n try {\n fd = openRegularFileNoFollow(path, fsConstants.O_RDONLY);\n } catch (err) {\n if (err instanceof Error && \"code\" in err && err.code === \"ENOENT\") return undefined;\n throw err;\n }\n try {\n return readFileSync(fd, \"utf-8\");\n } finally {\n closeSync(fd);\n }\n}\n\nexport interface PinnedDirectory {\n pathOf(name: string): string;\n close(): void;\n}\n\nexport function pinDirectoryNoFollow(dir: string): PinnedDirectory {\n let fd: number;\n try {\n fd = openSync(dir, fsConstants.O_RDONLY | fsConstants.O_DIRECTORY | fsConstants.O_NOFOLLOW);\n } catch (err) {\n throw new Error(`Expected a directory that is not a symbolic link: ${dir}`, { cause: err });\n }\n const base = process.platform === \"linux\" ? `/proc/self/fd/${fd}` : dir;\n return {\n pathOf(name) {\n if (basename(name) !== name || name === \".\" || name === \"..\") {\n throw new Error(`Expected a plain file name: ${name}`);\n }\n return join(base, name);\n },\n close: () => closeSync(fd),\n };\n}\n\nexport function appendFileNoFollow(path: string, content: string): void {\n const fd = openRegularFileNoFollow(\n path,\n fsConstants.O_WRONLY | fsConstants.O_APPEND | fsConstants.O_CREAT,\n );\n try {\n writeSync(fd, content);\n } finally {\n closeSync(fd);\n }\n}\n\nexport function readTextFileIfExists(path: string): string | undefined {\n try {\n return readFileSync(path, \"utf-8\");\n } catch (err) {\n if (err instanceof Error && \"code\" in err && err.code === \"ENOENT\") {\n return undefined;\n }\n throw err;\n }\n}\n\nexport function readJsonFileIfExists<T>(\n path: string,\n validate: (value: unknown) => value is T,\n malformedMessage: MalformedJsonMessage,\n): T | undefined {\n const raw = readTextFileIfExists(path);\n return raw === undefined ? undefined : parseJsonValue(raw, validate, malformedMessage);\n}\n\nexport function readJsonSchemaFileIfExists<T extends TSchema>(\n path: string,\n schema: T,\n malformedMessage: MalformedJsonMessage,\n): Static<T> | undefined {\n const raw = readTextFileIfExists(path);\n return raw === undefined ? undefined : parseJsonSchemaValue(raw, schema, malformedMessage);\n}\n\nfunction parseJson(raw: string, malformedMessage: MalformedJsonMessage): unknown {\n try {\n return JSON.parse(raw);\n } catch (err) {\n const detail = errorMessage(err);\n throw new Error(malformedMessage(detail, \"syntax\"), { cause: err });\n }\n}\n\nexport function parseJsonValue<T>(\n raw: string,\n validate: (value: unknown) => value is T,\n malformedMessage: MalformedJsonMessage,\n): T {\n const parsed = parseJson(raw, malformedMessage);\n if (!validate(parsed)) {\n throw new Error(malformedMessage(UNEXPECTED_JSON_SHAPE, \"shape\"));\n }\n return parsed;\n}\n\nexport function parseJsonSchemaValue<T extends TSchema>(\n raw: string,\n schema: T,\n malformedMessage: MalformedJsonMessage,\n): Static<T> {\n const parsed = parseJson(raw, malformedMessage);\n if (!Value.Check(schema, parsed)) {\n const firstError = Value.Errors(schema, parsed)[0];\n if (!firstError || firstError.instancePath === \"\" || firstError.instancePath === \"/\") {\n throw new Error(malformedMessage(UNEXPECTED_JSON_SHAPE, \"shape\"));\n }\n throw new Error(malformedMessage(`${firstError.instancePath}: ${firstError.message}`, \"field\"));\n }\n return parsed;\n}\n\nconst PRIVATE_FILE_MODE = 0o600;\n\nexport function atomicWritePrivateFile(targetPath: string, content: string): void {\n const dir = dirname(targetPath);\n const tmpPath = join(\n dir,\n `.${basename(targetPath)}.${process.pid}.${randomBytes(8).toString(\"hex\")}.tmp`,\n );\n const fd = openSync(\n tmpPath,\n fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL,\n PRIVATE_FILE_MODE,\n );\n try {\n writeSync(fd, content);\n } catch (err) {\n try {\n unlinkSync(tmpPath);\n } catch {}\n throw err;\n } finally {\n closeSync(fd);\n }\n try {\n renameSync(tmpPath, targetPath);\n } catch (err) {\n try {\n unlinkSync(tmpPath);\n } catch {}\n throw err;\n }\n}\n\nfunction isPathInside(child: string, parent: string): boolean {\n const parentPath = resolve(parent);\n const childPath = resolve(child);\n return childPath === parentPath || childPath.startsWith(parentPath + \"/\");\n}\n\nexport function assertStateDirOutsideWorkspace(\n stateDir: string,\n workingDir: string,\n sandboxType: string,\n): void {\n if (!isPathInside(stateDir, workingDir)) return;\n const message =\n `The state directory (${stateDir}) must not be inside the working directory (${workingDir}): ` +\n `sandbox containers mount the working directory, and a mounted state dir ` +\n `would expose settings, office records, vaults, and credentials to sandboxed code.`;\n if (sandboxType === \"host\") {\n log.logWarning(\"Insecure state dir location\", message);\n return;\n }\n throw new Error(message);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"file-guards.js","sourceRoot":"","sources":["../src/file-guards.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Static, TSchema } from \"typebox\";\nimport { Value } from \"typebox/value\";\nimport {\n closeSync,\n constants as fsConstants,\n fstatSync,\n mkdirSync,\n openSync,\n readFileSync,\n readdirSync,\n renameSync,\n unlinkSync,\n writeSync,\n} from \"node:fs\";\nimport type { Dirent } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport * as log from \"./log.js\";\nimport { randomBytes } from \"node:crypto\";\nimport { basename, dirname, join } from \"node:path\";\nimport { errorMessage } from \"./unknown-values.js\";\n\ntype JsonFailureKind = \"syntax\" | \"shape\" | \"field\";\n\ntype MalformedJsonMessage = (detail: string, kind: JsonFailureKind) => string;\n\nconst UNEXPECTED_JSON_SHAPE = \"unexpected JSON shape\";\n\nexport function ensureDirExists(dir: string): void {\n mkdirSync(dir, { recursive: true });\n}\n\nexport function ensurePrivateDirExists(dir: string): void {\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n}\n\nfunction openRegularFileNoFollow(path: string, flags: number): number {\n let fd: number;\n try {\n fd = openSync(path, flags | fsConstants.O_NOFOLLOW | fsConstants.O_NONBLOCK, 0o644);\n } catch (err) {\n if (err instanceof Error && \"code\" in err && err.code === \"ELOOP\") {\n throw new Error(`Refusing to follow a symbolic link: ${path}`, { cause: err });\n }\n throw err;\n }\n if (!fstatSync(fd).isFile()) {\n closeSync(fd);\n throw new Error(`Expected a regular file: ${path}`);\n }\n return fd;\n}\n\nexport function readTextFileNoFollowIfExists(path: string): string | undefined {\n let fd: number;\n try {\n fd = openRegularFileNoFollow(path, fsConstants.O_RDONLY);\n } catch (err) {\n if (err instanceof Error && \"code\" in err && err.code === \"ENOENT\") return undefined;\n throw err;\n }\n try {\n return readFileSync(fd, \"utf-8\");\n } finally {\n closeSync(fd);\n }\n}\n\nexport interface PinnedDirectory {\n pathOf(name: string): string;\n entries(): Dirent[];\n close(): void;\n}\n\nexport function pinDirectoryNoFollow(dir: string): PinnedDirectory {\n let fd: number;\n try {\n fd = openSync(dir, fsConstants.O_RDONLY | fsConstants.O_DIRECTORY | fsConstants.O_NOFOLLOW);\n } catch (err) {\n throw new Error(`Expected a directory that is not a symbolic link: ${dir}`, { cause: err });\n }\n const base = process.platform === \"linux\" ? `/proc/self/fd/${fd}` : dir;\n return {\n pathOf(name) {\n if (basename(name) !== name || name === \".\" || name === \"..\") {\n throw new Error(`Expected a plain file name: ${name}`);\n }\n return join(base, name);\n },\n entries: () => readdirSync(base, { withFileTypes: true }),\n close: () => closeSync(fd),\n };\n}\n\nexport function appendFileNoFollow(path: string, content: string): void {\n const fd = openRegularFileNoFollow(\n path,\n fsConstants.O_WRONLY | fsConstants.O_APPEND | fsConstants.O_CREAT,\n );\n try {\n writeSync(fd, content);\n } finally {\n closeSync(fd);\n }\n}\n\nexport function readTextFileIfExists(path: string): string | undefined {\n try {\n return readFileSync(path, \"utf-8\");\n } catch (err) {\n if (err instanceof Error && \"code\" in err && err.code === \"ENOENT\") {\n return undefined;\n }\n throw err;\n }\n}\n\nexport function readJsonFileIfExists<T>(\n path: string,\n validate: (value: unknown) => value is T,\n malformedMessage: MalformedJsonMessage,\n): T | undefined {\n const raw = readTextFileIfExists(path);\n return raw === undefined ? undefined : parseJsonValue(raw, validate, malformedMessage);\n}\n\nexport function readJsonSchemaFileIfExists<T extends TSchema>(\n path: string,\n schema: T,\n malformedMessage: MalformedJsonMessage,\n): Static<T> | undefined {\n const raw = readTextFileIfExists(path);\n return raw === undefined ? undefined : parseJsonSchemaValue(raw, schema, malformedMessage);\n}\n\nfunction parseJson(raw: string, malformedMessage: MalformedJsonMessage): unknown {\n try {\n return JSON.parse(raw);\n } catch (err) {\n const detail = errorMessage(err);\n throw new Error(malformedMessage(detail, \"syntax\"), { cause: err });\n }\n}\n\nexport function parseJsonValue<T>(\n raw: string,\n validate: (value: unknown) => value is T,\n malformedMessage: MalformedJsonMessage,\n): T {\n const parsed = parseJson(raw, malformedMessage);\n if (!validate(parsed)) {\n throw new Error(malformedMessage(UNEXPECTED_JSON_SHAPE, \"shape\"));\n }\n return parsed;\n}\n\nexport function parseJsonSchemaValue<T extends TSchema>(\n raw: string,\n schema: T,\n malformedMessage: MalformedJsonMessage,\n): Static<T> {\n const parsed = parseJson(raw, malformedMessage);\n if (!Value.Check(schema, parsed)) {\n const firstError = Value.Errors(schema, parsed)[0];\n if (!firstError || firstError.instancePath === \"\" || firstError.instancePath === \"/\") {\n throw new Error(malformedMessage(UNEXPECTED_JSON_SHAPE, \"shape\"));\n }\n throw new Error(malformedMessage(`${firstError.instancePath}: ${firstError.message}`, \"field\"));\n }\n return parsed;\n}\n\nconst PRIVATE_FILE_MODE = 0o600;\n\nexport function atomicWritePrivateFile(targetPath: string, content: string): void {\n const dir = dirname(targetPath);\n const tmpPath = join(\n dir,\n `.${basename(targetPath)}.${process.pid}.${randomBytes(8).toString(\"hex\")}.tmp`,\n );\n const fd = openSync(\n tmpPath,\n fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_EXCL,\n PRIVATE_FILE_MODE,\n );\n try {\n writeSync(fd, content);\n } catch (err) {\n try {\n unlinkSync(tmpPath);\n } catch {}\n throw err;\n } finally {\n closeSync(fd);\n }\n try {\n renameSync(tmpPath, targetPath);\n } catch (err) {\n try {\n unlinkSync(tmpPath);\n } catch {}\n throw err;\n }\n}\n\nfunction isPathInside(child: string, parent: string): boolean {\n const parentPath = resolve(parent);\n const childPath = resolve(child);\n return childPath === parentPath || childPath.startsWith(parentPath + \"/\");\n}\n\nexport function assertStateDirOutsideWorkspace(\n stateDir: string,\n workingDir: string,\n sandboxType: string,\n): void {\n if (!isPathInside(stateDir, workingDir)) return;\n const message =\n `The state directory (${stateDir}) must not be inside the working directory (${workingDir}): ` +\n `sandbox containers mount the working directory, and a mounted state dir ` +\n `would expose settings, office records, vaults, and credentials to sandboxed code.`;\n if (sandboxType === \"host\") {\n log.logWarning(\"Insecure state dir location\", message);\n return;\n }\n throw new Error(message);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution-env.d.ts","sourceRoot":"","sources":["../../src/harness/execution-env.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"execution-env.d.ts","sourceRoot":"","sources":["../../src/harness/execution-env.ts"],"names":[],"mappings":"AAGA,OAAO,EAQL,KAAK,YAAY,EAUlB,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAanE,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,EAClC,oBAAoB,EAAE,MAAM,GAC3B,YAAY,CAKd"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import { randomBytes } from "node:crypto";
|
|
2
2
|
import { posix } from "node:path";
|
|
3
|
-
import { ExecutionError, FileError, err, ok, } from "@earendil-works/pi-durable/env";
|
|
3
|
+
import { ExecutionError, FileError, LineScanner, err, ok, } from "@earendil-works/pi-durable/env";
|
|
4
4
|
import { NodeExecutionEnv } from "@earendil-works/pi-durable/env/node";
|
|
5
5
|
import { execAppendFile, execWriteFile, shellEscape } from "../sandbox/utils.js";
|
|
6
6
|
import { errorMessage } from "../unknown-values.js";
|
|
7
7
|
const SPILL_DIR = ".mikan/bash-output";
|
|
8
|
+
const READ_REGULAR_FILE = [
|
|
9
|
+
'if [ "$2" = 1 ] && [ -L "$1" ]; then echo link;',
|
|
10
|
+
'elif [ -d "$1" ]; then echo directory;',
|
|
11
|
+
'elif [ -f "$1" ]; then echo "file $(date -r "$1" +%s)"; base64 < "$1";',
|
|
12
|
+
'elif [ -e "$1" ]; then echo other; else echo missing; fi',
|
|
13
|
+
].join(" ");
|
|
8
14
|
export function createSandboxExecutionEnv(executor, sandboxType, runtimeWorkspaceRoot) {
|
|
9
15
|
if (sandboxType === "host") {
|
|
10
16
|
return new NodeExecutionEnv({ cwd: runtimeWorkspaceRoot });
|
|
@@ -90,6 +96,38 @@ class ShellExecutionEnv {
|
|
|
90
96
|
return { name: posix.basename(path), path, kind, size, mtimeMs };
|
|
91
97
|
});
|
|
92
98
|
}
|
|
99
|
+
async openBinaryReader(path, options, context) {
|
|
100
|
+
return this.fileOp(async () => {
|
|
101
|
+
const { stdout } = await this.run(`sh -c ${shellEscape(READ_REGULAR_FILE)} _ ${shellEscape(path)} ${options?.noFollow ? 1 : 0}`, context);
|
|
102
|
+
const headerEnd = stdout.indexOf("\n");
|
|
103
|
+
const [kind, mtime] = stdout.slice(0, headerEnd).split(" ");
|
|
104
|
+
if (kind === "missing")
|
|
105
|
+
throw new FileError("not_found", `No such file: ${path}`, path);
|
|
106
|
+
if (kind === "directory")
|
|
107
|
+
throw new FileError("is_directory", `Is a directory: ${path}`, path);
|
|
108
|
+
if (kind !== "file")
|
|
109
|
+
throw new FileError("invalid", `Not a regular file: ${path}`, path);
|
|
110
|
+
const bytes = Buffer.from(stdout.slice(headerEnd + 1).replace(/\s+/g, ""), "base64");
|
|
111
|
+
return new SnapshotBinaryReader(bytes, {
|
|
112
|
+
name: posix.basename(path),
|
|
113
|
+
path,
|
|
114
|
+
kind: "file",
|
|
115
|
+
size: bytes.length,
|
|
116
|
+
mtimeMs: (Number.parseInt(mtime ?? "", 10) || 0) * 1000,
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
openDirReader(path, context) {
|
|
121
|
+
return this.fileOp(async () => {
|
|
122
|
+
const listed = await this.listDir(path, context);
|
|
123
|
+
if (!listed.ok)
|
|
124
|
+
throw listed.error;
|
|
125
|
+
return new SnapshotDirReader(listed.value);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
async watch() {
|
|
129
|
+
return err(new FileError("not_supported", "The sandbox does not report file changes"));
|
|
130
|
+
}
|
|
93
131
|
async listDir(path, context) {
|
|
94
132
|
return this.fileOp(async () => {
|
|
95
133
|
const { stdout } = await this.run(`ls -A ${shellEscape(path)}`, context);
|
|
@@ -148,14 +186,19 @@ class ShellExecutionEnv {
|
|
|
148
186
|
async cleanup(_context) { }
|
|
149
187
|
async exec(command, options, context) {
|
|
150
188
|
try {
|
|
151
|
-
const
|
|
189
|
+
const shellCommand = typeof command === "string" ? command : command.map(shellEscape).join(" ");
|
|
190
|
+
const result = await this.executor.exec(shellCommand, {
|
|
152
191
|
cwd: options?.cwd || undefined,
|
|
153
192
|
timeout: options?.timeout || undefined,
|
|
154
193
|
signal: context.abortSignal,
|
|
155
194
|
});
|
|
156
|
-
const
|
|
157
|
-
if (
|
|
158
|
-
options?.onOutput?.(
|
|
195
|
+
const stdout = result.stdout.length > 0 && result.stderr.length > 0 ? `${result.stdout}\n` : result.stdout;
|
|
196
|
+
if (stdout.length > 0)
|
|
197
|
+
options?.onOutput?.(stdout, context, { stream: "stdout" });
|
|
198
|
+
if (result.stderr.length > 0) {
|
|
199
|
+
options?.onOutput?.(result.stderr, context, { stream: "stderr" });
|
|
200
|
+
}
|
|
201
|
+
const combined = `${stdout}${result.stderr}`;
|
|
159
202
|
return ok({ exitCode: result.code, spillPath: await this.spill(combined, options, context) });
|
|
160
203
|
}
|
|
161
204
|
catch (error) {
|
|
@@ -197,6 +240,38 @@ class ShellExecutionEnv {
|
|
|
197
240
|
}
|
|
198
241
|
}
|
|
199
242
|
}
|
|
243
|
+
class SnapshotBinaryReader {
|
|
244
|
+
constructor(bytes, metadata) {
|
|
245
|
+
this.bytes = bytes;
|
|
246
|
+
this.metadata = metadata;
|
|
247
|
+
}
|
|
248
|
+
async info(_context) {
|
|
249
|
+
return ok(this.metadata);
|
|
250
|
+
}
|
|
251
|
+
async read(offset, length, _context) {
|
|
252
|
+
return ok(this.bytes.subarray(offset, offset + length));
|
|
253
|
+
}
|
|
254
|
+
async scanLines(options, _context) {
|
|
255
|
+
const scanner = new LineScanner(options.startLine, options.endLine);
|
|
256
|
+
scanner.push(this.bytes);
|
|
257
|
+
return ok(scanner.finish());
|
|
258
|
+
}
|
|
259
|
+
async close(_context) { }
|
|
260
|
+
}
|
|
261
|
+
class SnapshotDirReader {
|
|
262
|
+
constructor(entries) {
|
|
263
|
+
this.entries = entries;
|
|
264
|
+
this.offset = 0;
|
|
265
|
+
}
|
|
266
|
+
async next(maxEntries, _context) {
|
|
267
|
+
const page = this.entries.slice(this.offset, this.offset + Math.max(1, maxEntries));
|
|
268
|
+
this.offset += page.length;
|
|
269
|
+
return ok({ entries: page, done: this.offset >= this.entries.length });
|
|
270
|
+
}
|
|
271
|
+
async close(_context) {
|
|
272
|
+
this.offset = this.entries.length;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
200
275
|
class ShellTextLineReader {
|
|
201
276
|
constructor(content) {
|
|
202
277
|
this.content = content;
|
|
@@ -220,6 +295,8 @@ class ShellTextLineReader {
|
|
|
220
295
|
}
|
|
221
296
|
}
|
|
222
297
|
function toFileError(error) {
|
|
298
|
+
if (error instanceof FileError)
|
|
299
|
+
return error;
|
|
223
300
|
const message = errorMessage(error);
|
|
224
301
|
if (/aborted/i.test(message))
|
|
225
302
|
return new FileError("aborted", message);
|