@frogbotai/piece-linear 0.24.0 → 0.26.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.
Files changed (42) hide show
  1. package/README.md +5 -0
  2. package/dist/adapter.d.ts +9 -0
  3. package/dist/adapter.d.ts.map +1 -0
  4. package/dist/adapter.js +12 -0
  5. package/dist/adapter.js.map +1 -0
  6. package/dist/index.d.ts +6 -4
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +4 -2
  9. package/dist/index.js.map +1 -1
  10. package/dist/questions/elicitation.d.ts +17 -0
  11. package/dist/questions/elicitation.d.ts.map +1 -0
  12. package/dist/questions/elicitation.js +70 -0
  13. package/dist/questions/elicitation.js.map +1 -0
  14. package/dist/questions/index.d.ts +4 -0
  15. package/dist/questions/index.d.ts.map +1 -0
  16. package/dist/questions/index.js +15 -0
  17. package/dist/questions/index.js.map +1 -0
  18. package/dist/questions/linearThread.d.ts +12 -0
  19. package/dist/questions/linearThread.d.ts.map +1 -0
  20. package/dist/questions/linearThread.js +23 -0
  21. package/dist/questions/linearThread.js.map +1 -0
  22. package/dist/questions/notify.d.ts +8 -0
  23. package/dist/questions/notify.d.ts.map +1 -0
  24. package/dist/questions/notify.js +25 -0
  25. package/dist/questions/notify.js.map +1 -0
  26. package/dist/questions/parse.d.ts +3 -0
  27. package/dist/questions/parse.d.ts.map +1 -0
  28. package/dist/questions/parse.js +109 -0
  29. package/dist/questions/parse.js.map +1 -0
  30. package/dist/questions/render.d.ts +4 -0
  31. package/dist/questions/render.d.ts.map +1 -0
  32. package/dist/questions/render.js +10 -0
  33. package/dist/questions/render.js.map +1 -0
  34. package/dist/questions/settled.d.ts +4 -0
  35. package/dist/questions/settled.d.ts.map +1 -0
  36. package/dist/questions/settled.js +13 -0
  37. package/dist/questions/settled.js.map +1 -0
  38. package/dist/questions/supports.d.ts +3 -0
  39. package/dist/questions/supports.d.ts.map +1 -0
  40. package/dist/questions/supports.js +3 -0
  41. package/dist/questions/supports.js.map +1 -0
  42. package/package.json +3 -3
package/README.md CHANGED
@@ -58,6 +58,11 @@ For a personal API key bot that responds to issue comments, set `channelMode: 'c
58
58
  an admin-created workspace webhook to **Comments**, and set `botUsername` to the name users mention.
59
59
  Comment mode supports post-and-edit streaming, but not Agent Session thoughts or native activity streaming.
60
60
 
61
+ Agents with the `question` tool ask in Agent Sessions with Linear's native elicitation: a single-choice
62
+ question up to 25 options shows buttons, and other questions show numbered options answered by reply.
63
+ **Send stop request** dismisses the question. Comment mode does not offer the tool. See
64
+ [Linear](https://docs.frogbot.ai/pieces/linear) in the FrogBot docs.
65
+
61
66
  Linear signs the exact request body in `Linear-Signature` with HMAC-SHA256. FrogBot rejects missing,
62
67
  invalid, or stale signed deliveries before channel or trigger dispatch. Channel replies are handled
63
68
  by the adapter; the triggers below remain independent per-subscription workflows.
@@ -0,0 +1,9 @@
1
+ import { LinearAdapter, type LinearRawMessage } from '@chat-adapter/linear';
2
+ import type { AgentSessionEventWebhookPayload } from '@linear/sdk/webhooks';
3
+ export type LinearChannelRawMessage = LinearRawMessage & {
4
+ agentActivitySignal?: string;
5
+ };
6
+ export declare class LinearChannelAdapter extends LinearAdapter {
7
+ protected parseMessageFromAgentSessionEvent(payload: AgentSessionEventWebhookPayload): import("chat").Message<LinearRawMessage> | null;
8
+ }
9
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AAE5E,MAAM,MAAM,uBAAuB,GAAG,gBAAgB,GAAG;IAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1F,qBAAa,oBAAqB,SAAQ,aAAa;cAClC,iCAAiC,CAAC,OAAO,EAAE,+BAA+B;CAU9F"}
@@ -0,0 +1,12 @@
1
+ import { LinearAdapter } from '@chat-adapter/linear';
2
+ export class LinearChannelAdapter extends LinearAdapter {
3
+ parseMessageFromAgentSessionEvent(payload) {
4
+ const message = super.parseMessageFromAgentSessionEvent(payload);
5
+ const signal = payload.action === 'prompted' ? payload.agentActivity?.signal : undefined;
6
+ if (!message || !signal)
7
+ return message;
8
+ const raw = { ...message.raw, agentActivitySignal: signal };
9
+ return this.parseMessage(raw);
10
+ }
11
+ }
12
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAyB,MAAM,sBAAsB,CAAC;AAK5E,MAAM,OAAO,oBAAqB,SAAQ,aAAa;IAClC,iCAAiC,CAAC,OAAwC;QAC3F,MAAM,OAAO,GAAG,KAAK,CAAC,iCAAiC,CAAC,OAAO,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAEzF,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM;YAAE,OAAO,OAAO,CAAC;QAExC,MAAM,GAAG,GAA4B,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,mBAAmB,EAAE,MAAM,EAAE,CAAC;QAErF,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC;CACF"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { z } from 'zod';
2
+ import { LinearChannelAdapter } from './adapter.js';
2
3
  import { createLinearClient, type Linear } from './client.js';
3
4
  export declare const linearActions: readonly ["createIssue", "updateIssue", "createProject", "updateProject", "createComment", "rawGraphqlQuery"];
4
5
  export declare const linearTriggers: readonly ["commentCreated", "issueCreated", "issueUpdated", "issueRemoved", "projectCreated", "projectUpdated", "projectRemoved"];
@@ -19,7 +20,7 @@ export declare const linearOAuth: {
19
20
  account({ client }: {
20
21
  tokens: import("frogbot/pieces").OAuthTokens;
21
22
  client: import("@linear/sdk").LinearClient;
22
- req: import("node_modules/frogbot/dist/types/request.js").FrogbotRequest;
23
+ req: import("node_modules/frogbot/dist/types/request.js").FrogBotRequest;
23
24
  }): Promise<{
24
25
  id: string;
25
26
  label: string;
@@ -65,7 +66,7 @@ export declare const createLinear: import("frogbot/pieces").PieceFactory<{
65
66
  account({ client }: {
66
67
  tokens: import("frogbot/pieces").OAuthTokens;
67
68
  client: import("@linear/sdk").LinearClient;
68
- req: import("node_modules/frogbot/dist/types/request.js").FrogbotRequest;
69
+ req: import("node_modules/frogbot/dist/types/request.js").FrogBotRequest;
69
70
  }): Promise<{
70
71
  id: string;
71
72
  label: string;
@@ -90,15 +91,16 @@ export declare const createLinear: import("frogbot/pieces").PieceFactory<{
90
91
  webhookSecret?: string | undefined;
91
92
  botUsername?: string | undefined;
92
93
  };
93
- }): import("@chat-adapter/linear").LinearAdapter;
94
+ }): LinearChannelAdapter;
94
95
  identity({ author, client, req }: {
95
96
  author: import("chat").Author;
96
97
  client: import("@linear/sdk").LinearClient;
97
- req: import("node_modules/frogbot/dist/types/request.js").FrogbotRequest;
98
+ req: import("node_modules/frogbot/dist/types/request.js").FrogBotRequest;
98
99
  }): Promise<{
99
100
  collection: string;
100
101
  id: string | number;
101
102
  } | null>;
103
+ questions: import("frogbot/pieces").PieceChannelQuestions<import("@linear/sdk").LinearClient>;
102
104
  };
103
105
  readonly actions: readonly [{
104
106
  slug: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQ7B,OAAO,EAAE,kBAAkB,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAW9D,eAAO,MAAM,aAAa,+GAOhB,CAAC;AACX,eAAO,MAAM,cAAc,mIAQjB,CAAC;AACX,eAAO,MAAM,YAAY,aAAc,CAAC;AAExC,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;CAsByC,CAAC;AAoClE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BA/DP,CAAC;;;;;;;;;0BAAD,CAAC;;;;;;;;;;;;;;;;;;;qEAjBK,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAiBd,CAAC;;;;;;;;;0BAAD,CAAC;;;;;;;;;0BAAD,CAAC;;;;;;;;;;;;;;;;;;;qEAjBQ,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qEAJD,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qEACZ,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAoBpB,CAAC;;;;;;;qEAvBV,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;qEAJmC,EAAE,MAClD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgHF,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQ7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAY9D,eAAO,MAAM,aAAa,+GAOhB,CAAC;AACX,eAAO,MAAM,cAAc,mIAQjB,CAAC;AACX,eAAO,MAAM,YAAY,aAAc,CAAC;AAExC,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;CAsByC,CAAC;AAqClE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAlElB,CAAC;;;;;;;;;0BAAD,CAAC;;;;;;;;;;;;;;;;;;;qEAhB8B,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAgBvC,CAAC;;;;;;;;;0BAAD,CAAC;;;;;;;;;0BAAD,CAAC;;;;;;;;;;;;;;;;;;;qEAhBiC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qEAJL,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qEACZ,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAmBzC,CAAC;;;;;;;qEAtBQ,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;qEAJgC,EAAE,MACtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkHF,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,3 @@
1
- import { createLinearAdapter } from '@chat-adapter/linear';
2
1
  import { definePiece } from 'frogbot/pieces';
3
2
  import { createComment } from './actions/createComment.js';
4
3
  import { createIssue } from './actions/createIssue.js';
@@ -6,8 +5,10 @@ import { createProject } from './actions/createProject.js';
6
5
  import { rawGraphqlQuery } from './actions/rawGraphqlQuery.js';
7
6
  import { updateIssue } from './actions/updateIssue.js';
8
7
  import { updateProject } from './actions/updateProject.js';
8
+ import { LinearChannelAdapter } from './adapter.js';
9
9
  import { createLinearClient } from './client.js';
10
10
  import { linearAuth, linearOptions } from './config.js';
11
+ import { linearQuestions } from './questions/index.js';
11
12
  import { commentCreated } from './triggers/commentCreated.js';
12
13
  import { issueCreated } from './triggers/issueCreated.js';
13
14
  import { issueRemoved } from './triggers/issueRemoved.js';
@@ -59,7 +60,7 @@ const linearChannel = {
59
60
  if (!options.webhookSecret) {
60
61
  throw new Error('Linear channels require a webhookSecret option.');
61
62
  }
62
- return createLinearAdapter({
63
+ return new LinearChannelAdapter({
63
64
  ...('apiKey' in auth ? { apiKey: auth.apiKey } : { accessToken: auth.accessToken }),
64
65
  webhookSecret: options.webhookSecret,
65
66
  mode: options.channelMode,
@@ -83,6 +84,7 @@ const linearChannel = {
83
84
  const match = result.docs[0];
84
85
  return match ? { ...match, collection: payloadConfig.admin.user } : null;
85
86
  },
87
+ questions: linearQuestions,
86
88
  };
87
89
  export const createLinear = definePiece({
88
90
  slug: 'linear',
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ChannelQuestionCall, QuestionInput } from 'frogbot/pieces';
2
+ import type { LinearActivity } from './linearThread.js';
3
+ export declare const SELECT_OPTIONS = 25;
4
+ type QuestionItem = QuestionInput['questions'][number];
5
+ export declare function isSelectQuestion(input: QuestionInput): boolean;
6
+ export declare function elicitation({ call, notice, }: {
7
+ call: ChannelQuestionCall;
8
+ notice?: string;
9
+ }): LinearActivity;
10
+ export declare function response(body: string): LinearActivity;
11
+ export declare function replyHint({ item, numbered }: {
12
+ item: QuestionItem;
13
+ numbered: boolean;
14
+ }): string;
15
+ export declare function escapeMarkdown(text: string): string;
16
+ export {};
17
+ //# sourceMappingURL=elicitation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elicitation.d.ts","sourceRoot":"","sources":["../../src/questions/elicitation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,eAAO,MAAM,cAAc,KAAK,CAAC;AAEjC,KAAK,YAAY,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAI9D;AAED,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,MAAM,GACP,EAAE;IACD,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,cAAc,CAejB;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAErD;AAED,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAU/F;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKnD"}
@@ -0,0 +1,70 @@
1
+ import { AgentActivitySignal, AgentActivityType } from '@linear/sdk';
2
+ export const SELECT_OPTIONS = 25;
3
+ export function isSelectQuestion(input) {
4
+ const [item] = input.questions;
5
+ return input.questions.length === 1 && !item.multiple && item.options.length <= SELECT_OPTIONS;
6
+ }
7
+ export function elicitation({ call, notice, }) {
8
+ const { input } = call;
9
+ const select = isSelectQuestion(input);
10
+ const sections = select ? selectSections(input.questions[0]) : listSections(input);
11
+ const body = [...(notice ? [`> ${notice}`] : []), ...sections].join('\n\n');
12
+ if (!select)
13
+ return { content: { type: AgentActivityType.Elicitation, body } };
14
+ return {
15
+ content: { type: AgentActivityType.Elicitation, body },
16
+ signal: AgentActivitySignal.Select,
17
+ signalMetadata: {
18
+ options: input.questions[0].options.map(({ label }) => ({ label, value: label })),
19
+ },
20
+ };
21
+ }
22
+ export function response(body) {
23
+ return { content: { type: AgentActivityType.Response, body } };
24
+ }
25
+ export function replyHint({ item, numbered }) {
26
+ const header = `“${escapeMarkdown(item.header)}”`;
27
+ if (item.custom)
28
+ return `Reply to ${header} with an option or your own answer.`;
29
+ if (item.multiple)
30
+ return `Reply to ${header} with option numbers or labels, such as \`1, 3\`.`;
31
+ return numbered
32
+ ? `Reply to ${header} with one option number or label.`
33
+ : `Reply to ${header} with one of the options.`;
34
+ }
35
+ export function escapeMarkdown(text) {
36
+ return text
37
+ .replace(/[\\`*_[\]<>#|~]/g, '\\$&')
38
+ .replace(/^[-+]/, '\\$&')
39
+ .replace(/^(\d+)([.)])/, '$1\\$2');
40
+ }
41
+ function selectSections(item) {
42
+ const options = item.options.map(({ label, description }) => `- **${escapeMarkdown(label)}**${description ? ` — ${description}` : ''}`);
43
+ return [
44
+ prompt(item),
45
+ options.join('\n'),
46
+ item.custom ? 'Choose an option, or reply with your own answer.' : 'Choose one of the options.',
47
+ ];
48
+ }
49
+ function listSections(input) {
50
+ const questions = input.questions.map((item) => [
51
+ prompt(item),
52
+ item.options
53
+ .map(({ label, description }, index) => `${index + 1}. ${escapeMarkdown(label)}${description ? ` — ${description}` : ''}`)
54
+ .join('\n'),
55
+ `_${optionsHint(item)}_`,
56
+ ].join('\n\n'));
57
+ return input.questions.length > 1
58
+ ? [...questions, 'Reply with one line per question, in the order shown.']
59
+ : questions;
60
+ }
61
+ function optionsHint(item) {
62
+ const choose = item.multiple
63
+ ? 'Choose one or more: reply with option numbers or labels, separated by commas (`1, 3`)'
64
+ : 'Choose one: reply with an option number or label';
65
+ return item.custom ? `${choose}, or type your own answer.` : `${choose}.`;
66
+ }
67
+ function prompt({ header, question }) {
68
+ return `**${escapeMarkdown(header)}**\n${question}`;
69
+ }
70
+ //# sourceMappingURL=elicitation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elicitation.js","sourceRoot":"","sources":["../../src/questions/elicitation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PieceChannelQuestions } from 'frogbot/pieces';
2
+ import type { Linear } from '../client.js';
3
+ export declare const linearQuestions: PieceChannelQuestions<Linear>;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/questions/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAO3C,eAAO,MAAM,eAAe,EAAE,qBAAqB,CAAC,MAAM,CAQzD,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { denyLinearQuestion, rejectLinearQuestion, staleLinearQuestion } from './notify.js';
2
+ import { parseLinearQuestion } from './parse.js';
3
+ import { renderLinearQuestion } from './render.js';
4
+ import { settleLinearQuestion } from './settled.js';
5
+ import { supportsLinearQuestion } from './supports.js';
6
+ export const linearQuestions = {
7
+ supports: supportsLinearQuestion,
8
+ render: renderLinearQuestion,
9
+ parse: parseLinearQuestion,
10
+ settled: settleLinearQuestion,
11
+ rejected: rejectLinearQuestion,
12
+ denied: denyLinearQuestion,
13
+ stale: staleLinearQuestion,
14
+ };
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/questions/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAEvD,MAAM,CAAC,MAAM,eAAe,GAAkC;IAC5D,QAAQ,EAAE,sBAAsB;IAChC,MAAM,EAAE,oBAAoB;IAC5B,KAAK,EAAE,mBAAmB;IAC1B,OAAO,EAAE,oBAAoB;IAC7B,QAAQ,EAAE,oBAAoB;IAC9B,MAAM,EAAE,kBAAkB;IAC1B,KAAK,EAAE,mBAAmB;CAC3B,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type LinearDocument } from '@linear/sdk';
2
+ import type { QuestionInteraction } from 'frogbot/pieces';
3
+ import type { Linear } from '../client.js';
4
+ export type LinearActivity = Omit<LinearDocument.AgentActivityCreateInput, 'agentSessionId'>;
5
+ export declare function agentSessionId(threadId: string): string | undefined;
6
+ export declare function stopRequested(interaction: QuestionInteraction): boolean;
7
+ export declare function postActivity({ activity, client, threadId, }: {
8
+ activity: LinearActivity;
9
+ client: Linear;
10
+ threadId: string;
11
+ }): Promise<string>;
12
+ //# sourceMappingURL=linearThread.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linearThread.d.ts","sourceRoot":"","sources":["../../src/questions/linearThread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAG1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,wBAAwB,EAAE,gBAAgB,CAAC,CAAC;AAE7F,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEnE;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,mBAAmB,GAAG,OAAO,CAMvE;AAED,wBAAsB,YAAY,CAAC,EACjC,QAAQ,EACR,MAAM,EACN,QAAQ,GACT,EAAE;IACD,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,MAAM,CAAC,CAalB"}
@@ -0,0 +1,23 @@
1
+ import { AgentActivitySignal } from '@linear/sdk';
2
+ const SESSION_THREAD = /^linear:[^:]+(?::c:[^:]+)?:s:([^:]+)$/;
3
+ export function agentSessionId(threadId) {
4
+ return SESSION_THREAD.exec(threadId)?.[1];
5
+ }
6
+ export function stopRequested(interaction) {
7
+ if (interaction.type !== 'message')
8
+ return false;
9
+ const raw = interaction.message.raw;
10
+ return raw?.agentActivitySignal === AgentActivitySignal.Stop;
11
+ }
12
+ export async function postActivity({ activity, client, threadId, }) {
13
+ const sessionId = agentSessionId(threadId);
14
+ if (!sessionId)
15
+ throw new Error(`Linear thread '${threadId}' is not an agent session.`);
16
+ const result = await client.createAgentActivity({ ...activity, agentSessionId: sessionId });
17
+ const id = result.agentActivityId;
18
+ if (!result.success || !id) {
19
+ throw new Error(`Linear did not create the agent activity in session '${sessionId}'.`);
20
+ }
21
+ return id;
22
+ }
23
+ //# sourceMappingURL=linearThread.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linearThread.js","sourceRoot":"","sources":["../../src/questions/linearThread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAuB,MAAM,aAAa,CAAC;AAMvE,MAAM,cAAc,GAAG,uCAAuC,CAAC;AAI/D,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,WAAgC;IAC5D,IAAI,WAAW,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAEjD,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC,GAA0C,CAAC;IAE3E,OAAO,GAAG,EAAE,mBAAmB,KAAK,mBAAmB,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,EACjC,QAAQ,EACR,MAAM,EACN,QAAQ,GAKT;IACC,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE3C,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,4BAA4B,CAAC,CAAC;IAExF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,EAAE,GAAG,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,CAAC,CAAC;IAC5F,MAAM,EAAE,GAAG,MAAM,CAAC,eAAe,CAAC;IAElC,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,wDAAwD,SAAS,IAAI,CAAC,CAAC;IACzF,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { PieceChannelQuestions } from 'frogbot/pieces';
2
+ import type { Linear } from '../client.js';
3
+ type LinearQuestions = Required<PieceChannelQuestions<Linear>>;
4
+ export declare const denyLinearQuestion: LinearQuestions['denied'];
5
+ export declare const rejectLinearQuestion: LinearQuestions['rejected'];
6
+ export declare const staleLinearQuestion: LinearQuestions['stale'];
7
+ export {};
8
+ //# sourceMappingURL=notify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.d.ts","sourceRoot":"","sources":["../../src/questions/notify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAuB,MAAM,gBAAgB,CAAC;AAEjF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,KAAK,eAAe,GAAG,QAAQ,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC;AAE/D,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAAC,QAAQ,CASxD,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,eAAe,CAAC,UAAU,CAW5D,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAAe,CAAC,OAAO,CAUxD,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { elicitation, escapeMarkdown, response } from './elicitation.js';
2
+ import { postActivity, stopRequested } from './linearThread.js';
3
+ export const denyLinearQuestion = async ({ call, client, interaction, thread, }) => {
4
+ const notice = `${authorName(interaction)} can't answer this question without access to this agent. It is still open.`;
5
+ await postActivity({ activity: elicitation({ call, notice }), client, threadId: thread.id });
6
+ };
7
+ export const rejectLinearQuestion = async ({ call, client, reason, thread, }) => {
8
+ await postActivity({
9
+ activity: elicitation({ call, notice: reason }),
10
+ client,
11
+ threadId: thread.id,
12
+ });
13
+ };
14
+ export const staleLinearQuestion = async ({ client, interaction, thread, }) => {
15
+ const body = stopRequested(interaction)
16
+ ? 'This question was already answered. A stop request only dismisses an open question.'
17
+ : 'This question was already answered.';
18
+ await postActivity({ activity: response(body), client, threadId: thread.id });
19
+ };
20
+ function authorName(interaction) {
21
+ const author = interaction.type === 'message' ? interaction.message.author : interaction.event.user;
22
+ const name = author.fullName || author.userName;
23
+ return name ? escapeMarkdown(name) : 'This participant';
24
+ }
25
+ //# sourceMappingURL=notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/questions/notify.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIhE,MAAM,CAAC,MAAM,kBAAkB,GAA8B,KAAK,EAAE,EAClE,IAAI,EACJ,MAAM,EACN,WAAW,EACX,MAAM,GACP,EAAE,EAAE;IACH,MAAM,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,6EAA6E,CAAC;IAEvH,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/F,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAgC,KAAK,EAAE,EACtE,IAAI,EACJ,MAAM,EACN,MAAM,EACN,MAAM,GACP,EAAE,EAAE;IACH,MAAM,YAAY,CAAC;QACjB,QAAQ,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC/C,MAAM;QACN,QAAQ,EAAE,MAAM,CAAC,EAAE;KACpB,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAA6B,KAAK,EAAE,EAClE,MAAM,EACN,WAAW,EACX,MAAM,GACP,EAAE,EAAE;IACH,MAAM,IAAI,GAAG,aAAa,CAAC,WAAW,CAAC;QACrC,CAAC,CAAC,qFAAqF;QACvF,CAAC,CAAC,qCAAqC,CAAC;IAE1C,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;AAChF,CAAC,CAAC;AAEF,SAAS,UAAU,CAAC,WAAgC;IAClD,MAAM,MAAM,GACV,WAAW,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC;IACvF,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;IAEhD,OAAO,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PieceChannelQuestions } from 'frogbot/pieces';
2
+ export declare const parseLinearQuestion: PieceChannelQuestions['parse'];
3
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/questions/parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAiC,MAAM,gBAAgB,CAAC;AAmB3F,eAAO,MAAM,mBAAmB,EAAE,qBAAqB,CAAC,OAAO,CAqB9D,CAAC"}
@@ -0,0 +1,109 @@
1
+ import { isSelectQuestion, replyHint } from './elicitation.js';
2
+ import { stopRequested } from './linearThread.js';
3
+ const NUMBER_LIST = /^\d+(?:[\s,]+\d+)+$/;
4
+ const OPTION_NUMBER = /^(\d+)[.)]?$/;
5
+ const LIST_MARKER = /^(?:[-*+]|\d+[.)])\s+/;
6
+ const MARKDOWN_ESCAPE = /\\([!-/:-@[-`{-~])/g;
7
+ export const parseLinearQuestion = ({ call, interaction, question, settled, }) => {
8
+ if (interaction.type !== 'message')
9
+ return { kind: 'ignore' };
10
+ if (stopRequested(interaction))
11
+ return { kind: 'dismiss' };
12
+ const { metadata, text } = interaction.message;
13
+ const result = parseReply({ input: call.input, text });
14
+ const early = new Date(metadata.dateSent).getTime() < new Date(question.messages.at(-1).postedAt).getTime();
15
+ if (settled || early) {
16
+ return result.kind === 'answer' && result.explicit ? { kind: 'stale' } : { kind: 'ignore' };
17
+ }
18
+ return result.kind === 'answer' ? { kind: 'answer', output: result.output } : result;
19
+ };
20
+ function parseReply({ input, text }) {
21
+ const { questions } = input;
22
+ const numbered = !isSelectQuestion(input);
23
+ const lines = questions.length === 1
24
+ ? [text.trim()]
25
+ : text
26
+ .split(/\r?\n/)
27
+ .map((line) => line.trim())
28
+ .filter(Boolean);
29
+ if (lines.length !== questions.length) {
30
+ return {
31
+ kind: 'rejected',
32
+ reason: `Answer each of the ${questions.length} questions on its own line, in the order shown.`,
33
+ };
34
+ }
35
+ const results = questions.map((item, index) => parseLine({ item, line: lines[index], numbered, unmarkCustom: questions.length > 1 }));
36
+ const failure = results.find((result) => 'reason' in result);
37
+ if (failure)
38
+ return { kind: 'rejected', reason: failure.reason };
39
+ const answers = results.map((result) => result.answer);
40
+ return {
41
+ kind: 'answer',
42
+ output: { answers },
43
+ explicit: answers.every(({ custom }) => custom === undefined),
44
+ };
45
+ }
46
+ function parseLine({ item, line, numbered, unmarkCustom, }) {
47
+ const unmarked = line.replace(LIST_MARKER, '');
48
+ const selected = line
49
+ ? (selectOptions({ item, line, numbered }) ??
50
+ (unmarked !== line ? selectOptions({ item, line: unmarked, numbered }) : undefined))
51
+ : undefined;
52
+ if (selected)
53
+ return { answer: { header: item.header, selected } };
54
+ const custom = unmarkCustom ? unmarked : line;
55
+ if (custom && item.custom)
56
+ return { answer: { header: item.header, selected: [], custom } };
57
+ return { reason: replyHint({ item, numbered }) };
58
+ }
59
+ function selectOptions({ item, line, numbered, }) {
60
+ const whole = optionIndex({ item, numbered, token: line });
61
+ if (whole !== undefined)
62
+ return [item.options[whole].label];
63
+ const segments = numbered && NUMBER_LIST.test(line) ? line.split(/[\s,]+/) : line.split(',');
64
+ const indexes = matchSegments({ item, numbered, segments });
65
+ if (!indexes?.length)
66
+ return undefined;
67
+ const unique = [...new Set(indexes)].sort((a, b) => a - b);
68
+ if (!item.multiple && unique.length !== 1)
69
+ return undefined;
70
+ return unique.map((index) => item.options[index].label);
71
+ }
72
+ function matchSegments({ item, numbered, segments, }) {
73
+ const limit = 2 * Math.max(10, ...item.options.map(({ label }) => label.length));
74
+ const matches = [];
75
+ matches[segments.length] = [];
76
+ for (let start = segments.length - 1; start >= 0; start--) {
77
+ if (!segments[start].trim()) {
78
+ matches[start] = matches[start + 1];
79
+ continue;
80
+ }
81
+ for (let end = start + 1; end <= segments.length; end++) {
82
+ const token = segments.slice(start, end).join(',').trim();
83
+ if (token.length > limit)
84
+ break;
85
+ const rest = matches[end];
86
+ const index = rest ? optionIndex({ item, numbered, token }) : undefined;
87
+ if (index !== undefined)
88
+ matches[start] = [index, ...rest];
89
+ }
90
+ }
91
+ return matches[0];
92
+ }
93
+ function optionIndex({ item, numbered, token, }) {
94
+ const unescaped = token.replace(MARKDOWN_ESCAPE, '$1');
95
+ const label = labelIndex({ item, text: token }) ??
96
+ (unescaped !== token ? labelIndex({ item, text: unescaped }) : undefined);
97
+ if (label !== undefined || !numbered)
98
+ return label;
99
+ const number = Number(OPTION_NUMBER.exec(token)?.[1] ?? 0);
100
+ return number >= 1 && number <= item.options.length ? number - 1 : undefined;
101
+ }
102
+ function labelIndex({ item, text }) {
103
+ const exact = item.options.findIndex(({ label }) => label === text);
104
+ if (exact !== -1)
105
+ return exact;
106
+ const folded = item.options.flatMap(({ label }, index) => label.toLowerCase() === text.toLowerCase() ? [index] : []);
107
+ return folded.length === 1 ? folded[0] : undefined;
108
+ }
109
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/questions/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { PieceChannelQuestions } from 'frogbot/pieces';
2
+ import type { Linear } from '../client.js';
3
+ export declare const renderLinearQuestion: PieceChannelQuestions<Linear>['render'];
4
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/questions/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,eAAO,MAAM,oBAAoB,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC,QAAQ,CAYxE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { elicitation } from './elicitation.js';
2
+ import { postActivity } from './linearThread.js';
3
+ export const renderLinearQuestion = async ({ calls, client, thread, }) => {
4
+ const [call] = calls;
5
+ if (!call)
6
+ return [];
7
+ const id = await postActivity({ activity: elicitation({ call }), client, threadId: thread.id });
8
+ return [{ calls: [call.toolCallId], messages: [{ id, postedAt: '' }] }];
9
+ };
10
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/questions/render.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,CAAC,MAAM,oBAAoB,GAA4C,KAAK,EAAE,EAClF,KAAK,EACL,MAAM,EACN,MAAM,GACP,EAAE,EAAE;IACH,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IAErB,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAEhG,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1E,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { PieceChannelQuestions } from 'frogbot/pieces';
2
+ import type { Linear } from '../client.js';
3
+ export declare const settleLinearQuestion: PieceChannelQuestions<Linear>['settled'];
4
+ //# sourceMappingURL=settled.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settled.d.ts","sourceRoot":"","sources":["../../src/questions/settled.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE5D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAI3C,eAAO,MAAM,oBAAoB,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC,SAAS,CAiBzE,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { escapeMarkdown, response } from './elicitation.js';
2
+ import { postActivity } from './linearThread.js';
3
+ export const settleLinearQuestion = async ({ actor, client, outcome, thread, }) => {
4
+ if ('output' in outcome || !actor)
5
+ return;
6
+ const name = actor.channel?.name ?? actor.channel?.username;
7
+ await postActivity({
8
+ activity: response(name ? `Stopped. ${escapeMarkdown(name)} dismissed the question.` : 'Stopped.'),
9
+ client,
10
+ threadId: thread.id,
11
+ });
12
+ };
13
+ //# sourceMappingURL=settled.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settled.js","sourceRoot":"","sources":["../../src/questions/settled.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,MAAM,CAAC,MAAM,oBAAoB,GAA6C,KAAK,EAAE,EACnF,KAAK,EACL,MAAM,EACN,OAAO,EACP,MAAM,GACP,EAAE,EAAE;IACH,IAAI,QAAQ,IAAI,OAAO,IAAI,CAAC,KAAK;QAAE,OAAO;IAE1C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC;IAE5D,MAAM,YAAY,CAAC;QACjB,QAAQ,EAAE,QAAQ,CAChB,IAAI,CAAC,CAAC,CAAC,YAAY,cAAc,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC,UAAU,CAC/E;QACD,MAAM;QACN,QAAQ,EAAE,MAAM,CAAC,EAAE;KACpB,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { PieceChannelQuestions } from 'frogbot/pieces';
2
+ export declare const supportsLinearQuestion: NonNullable<PieceChannelQuestions['supports']>;
3
+ //# sourceMappingURL=supports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supports.d.ts","sourceRoot":"","sources":["../../src/questions/supports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAI5D,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAErC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { agentSessionId } from './linearThread.js';
2
+ export const supportsLinearQuestion = ({ thread, }) => agentSessionId(thread.id) !== undefined;
3
+ //# sourceMappingURL=supports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supports.js","sourceRoot":"","sources":["../../src/questions/supports.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,CAAC,MAAM,sBAAsB,GAAmD,CAAC,EACrF,MAAM,GACP,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frogbotai/piece-linear",
3
- "version": "0.24.0",
3
+ "version": "0.26.0",
4
4
  "description": "Linear tools for FrogBot.",
5
5
  "license": "MIT",
6
6
  "author": "Colby Gilbert",
@@ -29,11 +29,11 @@
29
29
  "zod": "^4.3.6"
30
30
  },
31
31
  "peerDependencies": {
32
- "frogbot": "0.24.0"
32
+ "frogbot": "0.26.0"
33
33
  },
34
34
  "devDependencies": {
35
35
  "typescript": "5.6.2",
36
- "frogbot": "0.24.0"
36
+ "frogbot": "0.26.0"
37
37
  },
38
38
  "publishConfig": {
39
39
  "access": "public"