@jungjaehoon/mama-os 0.28.0 → 0.28.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/code-act/host-bridge.d.ts.map +1 -1
- package/dist/agent/code-act/host-bridge.js +30 -2
- package/dist/agent/code-act/host-bridge.js.map +1 -1
- package/dist/agent/gateway-tool-executor.d.ts.map +1 -1
- package/dist/agent/gateway-tool-executor.js +50 -7
- package/dist/agent/gateway-tool-executor.js.map +1 -1
- package/dist/agent/gateway-tools.md +3 -1
- package/dist/agent/tool-registry.d.ts.map +1 -1
- package/dist/agent/tool-registry.js +14 -2
- package/dist/agent/tool-registry.js.map +1 -1
- package/dist/agent/types.d.ts +1 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +2 -0
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/config/types.d.ts.map +1 -1
- package/dist/cli/config/types.js +2 -0
- package/dist/cli/config/types.js.map +1 -1
- package/dist/connectors/trello/index.d.ts +13 -2
- package/dist/connectors/trello/index.d.ts.map +1 -1
- package/dist/connectors/trello/index.js +104 -20
- package/dist/connectors/trello/index.js.map +1 -1
- package/dist/connectors/trello/query-tools.d.ts +65 -0
- package/dist/connectors/trello/query-tools.d.ts.map +1 -0
- package/dist/connectors/trello/query-tools.js +131 -0
- package/dist/connectors/trello/query-tools.js.map +1 -0
- package/dist/operator/console-brief.d.ts +14 -4
- package/dist/operator/console-brief.d.ts.map +1 -1
- package/dist/operator/console-brief.js +42 -14
- package/dist/operator/console-brief.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* TrelloConnector — polls Trello boards via native fetch.
|
|
3
3
|
* Auth token format: "apiKey:token" stored in config.auth.token or TRELLO_TOKEN env var.
|
|
4
|
-
* Emits kanban_card NormalizedItems for moved/
|
|
4
|
+
* Emits kanban_card NormalizedItems for new/moved/updated cards.
|
|
5
|
+
*
|
|
6
|
+
* A card's operational state is more than its list: production boards track the
|
|
7
|
+
* assignee and the revision round (e.g. a "初稿" / "1回修正" label) on the card
|
|
8
|
+
* itself. The poller therefore ingests labels and resolved member names, and a
|
|
9
|
+
* label/member change on an unmoved card is a change worth emitting - owner
|
|
10
|
+
* question "who owns this and which revision round is it in" must be answerable
|
|
11
|
+
* from the raw store.
|
|
5
12
|
*/
|
|
6
13
|
import type { AuthRequirement, ConnectorConfig, ConnectorHealth, IConnector, NormalizedItem } from '../framework/types.js';
|
|
7
14
|
export declare class TrelloConnector implements IConnector {
|
|
@@ -14,7 +21,7 @@ export declare class TrelloConnector implements IConnector {
|
|
|
14
21
|
private lastPollTime;
|
|
15
22
|
private lastPollCount;
|
|
16
23
|
private lastError;
|
|
17
|
-
/** boardId → (cardId →
|
|
24
|
+
/** boardId → (cardId → encoded card state) */
|
|
18
25
|
private lastCardStates;
|
|
19
26
|
private readonly stateFilePath;
|
|
20
27
|
constructor(config: ConnectorConfig);
|
|
@@ -25,6 +32,10 @@ export declare class TrelloConnector implements IConnector {
|
|
|
25
32
|
healthCheck(): Promise<ConnectorHealth>;
|
|
26
33
|
getAuthRequirements(): AuthRequirement[];
|
|
27
34
|
authenticate(): Promise<boolean>;
|
|
35
|
+
private fetchWithTimeout;
|
|
36
|
+
/** id → display name for a board's members. Failure degrades to raw ids
|
|
37
|
+
* (name resolution is enrichment, never a reason to drop a poll). */
|
|
38
|
+
private fetchMemberNames;
|
|
28
39
|
poll(_since: Date): Promise<NormalizedItem[]>;
|
|
29
40
|
}
|
|
30
41
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/connectors/trello/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/connectors/trello/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,eAAe,EACf,UAAU,EACV,cAAc,EACf,MAAM,uBAAuB,CAAC;AA4D/B,qBAAa,eAAgB,YAAW,UAAU;IAChD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,IAAI,EAAG,KAAK,CAAU;IAE/B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAAiC;IAElD,8CAA8C;IAC9C,OAAO,CAAC,cAAc,CAA+C;IAErE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAM5B;gBAEU,MAAM,EAAE,eAAe;IAInC,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,SAAS;IAUX,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAMxB,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;IAS7C,mBAAmB,IAAI,eAAe,EAAE;IAWlC,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;YAWxB,gBAAgB;IAU9B;0EACsE;YACxD,gBAAgB;IAkBxB,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CA8HpD"}
|
|
@@ -2,13 +2,39 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* TrelloConnector — polls Trello boards via native fetch.
|
|
4
4
|
* Auth token format: "apiKey:token" stored in config.auth.token or TRELLO_TOKEN env var.
|
|
5
|
-
* Emits kanban_card NormalizedItems for moved/
|
|
5
|
+
* Emits kanban_card NormalizedItems for new/moved/updated cards.
|
|
6
|
+
*
|
|
7
|
+
* A card's operational state is more than its list: production boards track the
|
|
8
|
+
* assignee and the revision round (e.g. a "初稿" / "1回修正" label) on the card
|
|
9
|
+
* itself. The poller therefore ingests labels and resolved member names, and a
|
|
10
|
+
* label/member change on an unmoved card is a change worth emitting - owner
|
|
11
|
+
* question "who owns this and which revision round is it in" must be answerable
|
|
12
|
+
* from the raw store.
|
|
6
13
|
*/
|
|
7
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
15
|
exports.TrelloConnector = void 0;
|
|
9
16
|
const fs_1 = require("fs");
|
|
10
17
|
const path_1 = require("path");
|
|
11
18
|
const os_1 = require("os");
|
|
19
|
+
const STATE_V2_PREFIX = 'v2:';
|
|
20
|
+
function encodeCardState(state) {
|
|
21
|
+
return `${STATE_V2_PREFIX}${JSON.stringify([state.list, state.labels, state.members])}`;
|
|
22
|
+
}
|
|
23
|
+
function decodeCardState(raw) {
|
|
24
|
+
if (raw.startsWith(STATE_V2_PREFIX)) {
|
|
25
|
+
try {
|
|
26
|
+
const [list, labels, members] = JSON.parse(raw.slice(STATE_V2_PREFIX.length));
|
|
27
|
+
return { state: { list, labels: labels ?? [], members: members ?? [] }, legacy: false };
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
/* fall through to legacy interpretation */
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Legacy value: the bare list name (pre-label/member polling). Treated as
|
|
34
|
+
// list-only so the format upgrade never floods the raw store with a
|
|
35
|
+
// "changed" item for every open card.
|
|
36
|
+
return { state: { list: raw, labels: [], members: [] }, legacy: true };
|
|
37
|
+
}
|
|
12
38
|
class TrelloConnector {
|
|
13
39
|
name = 'trello';
|
|
14
40
|
type = 'api';
|
|
@@ -19,7 +45,7 @@ class TrelloConnector {
|
|
|
19
45
|
lastPollTime = null;
|
|
20
46
|
lastPollCount = 0;
|
|
21
47
|
lastError = undefined;
|
|
22
|
-
/** boardId → (cardId →
|
|
48
|
+
/** boardId → (cardId → encoded card state) */
|
|
23
49
|
lastCardStates = new Map();
|
|
24
50
|
stateFilePath = (0, path_1.join)((0, os_1.homedir)(), '.mama', 'connectors', 'trello', 'trello-state.json');
|
|
25
51
|
constructor(config) {
|
|
@@ -94,6 +120,36 @@ class TrelloConnector {
|
|
|
94
120
|
return false;
|
|
95
121
|
}
|
|
96
122
|
}
|
|
123
|
+
async fetchWithTimeout(url) {
|
|
124
|
+
const controller = new AbortController();
|
|
125
|
+
const timeout = setTimeout(() => controller.abort(), 30_000);
|
|
126
|
+
try {
|
|
127
|
+
return await fetch(url, { signal: controller.signal });
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
clearTimeout(timeout);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** id → display name for a board's members. Failure degrades to raw ids
|
|
134
|
+
* (name resolution is enrichment, never a reason to drop a poll). */
|
|
135
|
+
async fetchMemberNames(boardId) {
|
|
136
|
+
const names = new Map();
|
|
137
|
+
try {
|
|
138
|
+
const res = await this.fetchWithTimeout(`${this.baseUrl}/boards/${boardId}/members?fields=fullName,username&key=${this.apiKey}&token=${this.token}`);
|
|
139
|
+
if (!res.ok)
|
|
140
|
+
return names;
|
|
141
|
+
const members = (await res.json());
|
|
142
|
+
for (const m of members) {
|
|
143
|
+
const name = m.fullName || m.username;
|
|
144
|
+
if (name)
|
|
145
|
+
names.set(m.id, name);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
/* degrade to ids */
|
|
150
|
+
}
|
|
151
|
+
return names;
|
|
152
|
+
}
|
|
97
153
|
async poll(_since) {
|
|
98
154
|
if (!this.apiKey || !this.token)
|
|
99
155
|
throw new Error('TrelloConnector not initialized');
|
|
@@ -108,23 +164,18 @@ class TrelloConnector {
|
|
|
108
164
|
const boardId = channelCfg.boardId;
|
|
109
165
|
try {
|
|
110
166
|
const url = `${this.baseUrl}/boards/${boardId}/lists` +
|
|
111
|
-
`?cards=open&card_fields=name,idMembers,dateLastActivity` +
|
|
167
|
+
`?cards=open&card_fields=name,idMembers,labels,dateLastActivity` +
|
|
112
168
|
`&key=${this.apiKey}&token=${this.token}`;
|
|
113
|
-
const
|
|
114
|
-
const timeout = setTimeout(() => controller.abort(), 30_000);
|
|
115
|
-
let res;
|
|
116
|
-
try {
|
|
117
|
-
res = await fetch(url, { signal: controller.signal });
|
|
118
|
-
}
|
|
119
|
-
finally {
|
|
120
|
-
clearTimeout(timeout);
|
|
121
|
-
}
|
|
169
|
+
const res = await this.fetchWithTimeout(url);
|
|
122
170
|
if (!res.ok) {
|
|
123
171
|
hadError = true;
|
|
124
172
|
this.lastError = `Board ${boardId}: HTTP ${res.status}`;
|
|
125
173
|
continue;
|
|
126
174
|
}
|
|
127
175
|
const lists = (await res.json());
|
|
176
|
+
// Lazy: boards whose open cards carry no members need no roster call.
|
|
177
|
+
const anyMembers = lists.some((l) => l.cards.some((c) => c.idMembers.length > 0));
|
|
178
|
+
const memberNames = anyMembers ? await this.fetchMemberNames(boardId) : new Map();
|
|
128
179
|
// Get or init previous card states for this board
|
|
129
180
|
if (!this.lastCardStates.has(boardId)) {
|
|
130
181
|
this.lastCardStates.set(boardId, new Map());
|
|
@@ -133,14 +184,38 @@ class TrelloConnector {
|
|
|
133
184
|
const newCardState = new Map();
|
|
134
185
|
for (const list of lists) {
|
|
135
186
|
for (const card of list.cards) {
|
|
136
|
-
|
|
137
|
-
const
|
|
138
|
-
const
|
|
139
|
-
|
|
140
|
-
|
|
187
|
+
const labels = (card.labels ?? []).map((l) => l.name).filter(Boolean);
|
|
188
|
+
const assignees = card.idMembers.map((id) => memberNames.get(id) ?? id);
|
|
189
|
+
const current = { list: list.name, labels, members: assignees };
|
|
190
|
+
newCardState.set(card.id, encodeCardState(current));
|
|
191
|
+
const prevRaw = prevCardState.get(card.id);
|
|
192
|
+
const isNew = prevRaw === undefined;
|
|
193
|
+
const prev = prevRaw !== undefined ? decodeCardState(prevRaw) : undefined;
|
|
194
|
+
const isMoved = prev !== undefined && prev.state.list !== list.name;
|
|
195
|
+
// Label/assignee deltas only fire against v2 state: a legacy entry
|
|
196
|
+
// carries no labels/members, so comparing against it would emit a
|
|
197
|
+
// one-time "changed" flood across every open card on upgrade.
|
|
198
|
+
const isUpdated = prev !== undefined &&
|
|
199
|
+
!prev.legacy &&
|
|
200
|
+
!isMoved &&
|
|
201
|
+
(prev.state.labels.join('') !== labels.join('') ||
|
|
202
|
+
prev.state.members.join('') !== assignees.join(''));
|
|
203
|
+
if (isNew || isMoved || isUpdated) {
|
|
141
204
|
let content = `${card.name} | ${list.name}`;
|
|
142
205
|
if (isMoved) {
|
|
143
|
-
content += ` (from: ${
|
|
206
|
+
content += ` (from: ${prev.state.list})`;
|
|
207
|
+
}
|
|
208
|
+
if (isUpdated && prev.state.labels.join('') !== labels.join('')) {
|
|
209
|
+
content += ` (labels: ${prev.state.labels.join(', ') || 'none'} -> ${labels.join(', ') || 'none'})`;
|
|
210
|
+
}
|
|
211
|
+
if (isUpdated && prev.state.members.join('') !== assignees.join('')) {
|
|
212
|
+
content += ` (assignees changed)`;
|
|
213
|
+
}
|
|
214
|
+
if (labels.length > 0) {
|
|
215
|
+
content += ` | labels: ${labels.join(', ')}`;
|
|
216
|
+
}
|
|
217
|
+
if (assignees.length > 0) {
|
|
218
|
+
content += ` | assignees: ${assignees.join(', ')}`;
|
|
144
219
|
}
|
|
145
220
|
items.push({
|
|
146
221
|
source: 'trello',
|
|
@@ -148,17 +223,26 @@ class TrelloConnector {
|
|
|
148
223
|
channel: channelName,
|
|
149
224
|
author: 'trello',
|
|
150
225
|
content,
|
|
151
|
-
|
|
226
|
+
// First sight is an OBSERVATION, stamped now: on install (or a
|
|
227
|
+
// state reset) dateLastActivity can be years old, which parks
|
|
228
|
+
// the card's only enriched item below every since-window and
|
|
229
|
+
// makes it invisible to retrieval (live incident 2026-07-24).
|
|
230
|
+
// Moves/updates keep the card's own activity time - the change
|
|
231
|
+
// just happened, so it is both fresh and semantically exact.
|
|
232
|
+
timestamp: isNew ? new Date() : new Date(card.dateLastActivity),
|
|
152
233
|
type: 'kanban_card',
|
|
153
234
|
metadata: {
|
|
235
|
+
lastActivityAt: card.dateLastActivity,
|
|
154
236
|
boardId,
|
|
155
237
|
cardId: card.id,
|
|
156
238
|
listName: list.name,
|
|
157
239
|
// Omit when absent: the canonical raw-ref serializer rejects
|
|
158
240
|
// undefined values ("undefined is not serializable at $.prevListName").
|
|
159
|
-
...(
|
|
241
|
+
...(prev !== undefined ? { prevListName: prev.state.list } : {}),
|
|
160
242
|
cardName: card.name,
|
|
161
243
|
members: card.idMembers,
|
|
244
|
+
memberNames: assignees,
|
|
245
|
+
labels,
|
|
162
246
|
},
|
|
163
247
|
});
|
|
164
248
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/connectors/trello/index.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/connectors/trello/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trello live query tools — the READ answer path for current-state questions.
|
|
3
|
+
*
|
|
4
|
+
* Ported from Kagemusha's mechanism (trello_search / trello_card_detail):
|
|
5
|
+
* state questions are answered by reading the LIVE board at question time,
|
|
6
|
+
* never by projecting the connector change log. The 2026-07-24 incident chain
|
|
7
|
+
* (missing labels/assignees, first-sight timestamps burying enriched items,
|
|
8
|
+
* per-character card collapse) was one architecture mistake surfacing three
|
|
9
|
+
* ways: a log projection serving state queries. The connector log remains the
|
|
10
|
+
* delta/trigger source; these tools are the truth reads, the same pattern as
|
|
11
|
+
* kagemusha_* for the kagemusha DB.
|
|
12
|
+
*
|
|
13
|
+
* Read-only: no mutation endpoint is ever called. Card text is untrusted
|
|
14
|
+
* external data — tool descriptions instruct the model to treat it as data.
|
|
15
|
+
*/
|
|
16
|
+
export interface TrelloQueryDeps {
|
|
17
|
+
/** Injected for tests; defaults to global fetch. */
|
|
18
|
+
fetchFn?: typeof fetch;
|
|
19
|
+
env?: NodeJS.ProcessEnv;
|
|
20
|
+
/** Injected for tests; defaults to ~/.mama/connectors.json. */
|
|
21
|
+
configPath?: string;
|
|
22
|
+
}
|
|
23
|
+
interface TrelloAuth {
|
|
24
|
+
apiKey: string;
|
|
25
|
+
token: string;
|
|
26
|
+
/** boardId → display name for enabled trello channels ('' = unscoped). */
|
|
27
|
+
boardNames: Map<string, string>;
|
|
28
|
+
}
|
|
29
|
+
/** Loud, no-fallback auth resolution via the connector contract:
|
|
30
|
+
* config.auth.token ?? env[tokenName ?? 'TRELLO_TOKEN'], "apiKey:token". */
|
|
31
|
+
export declare function resolveTrelloQueryAuth(deps?: TrelloQueryDeps): TrelloAuth;
|
|
32
|
+
export interface TrelloCardSummary {
|
|
33
|
+
cardId: string;
|
|
34
|
+
name: string;
|
|
35
|
+
board: string;
|
|
36
|
+
list: string;
|
|
37
|
+
labels: string[];
|
|
38
|
+
assignees: string[];
|
|
39
|
+
due: string | null;
|
|
40
|
+
lastActivity: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Search cards across the configured boards, LIVE. Returns current list,
|
|
44
|
+
* labels (revision round / artist), and assignee names per card.
|
|
45
|
+
*/
|
|
46
|
+
export declare function searchTrelloCards(input: {
|
|
47
|
+
query: string;
|
|
48
|
+
limit?: number;
|
|
49
|
+
}, deps?: TrelloQueryDeps): Promise<TrelloCardSummary[]>;
|
|
50
|
+
export interface TrelloCardDetail extends TrelloCardSummary {
|
|
51
|
+
description: string;
|
|
52
|
+
checklists: Array<{
|
|
53
|
+
name: string;
|
|
54
|
+
items: Array<{
|
|
55
|
+
name: string;
|
|
56
|
+
complete: boolean;
|
|
57
|
+
}>;
|
|
58
|
+
}>;
|
|
59
|
+
}
|
|
60
|
+
/** Full card detail, LIVE: description head, members, labels, checklists. */
|
|
61
|
+
export declare function getTrelloCard(input: {
|
|
62
|
+
cardId: string;
|
|
63
|
+
}, deps?: TrelloQueryDeps): Promise<TrelloCardDetail>;
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=query-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-tools.d.ts","sourceRoot":"","sources":["../../../src/connectors/trello/query-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,MAAM,WAAW,eAAe;IAC9B,oDAAoD;IACpD,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,UAAU;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED;6EAC6E;AAC7E,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,eAAoB,GAAG,UAAU,CAqC7E;AAkCD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAgBD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EACxC,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAwB9B;AAED,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;CACxF;AAED,6EAA6E;AAC7E,wBAAsB,aAAa,CACjC,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,EACzB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAuC3B"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Trello live query tools — the READ answer path for current-state questions.
|
|
4
|
+
*
|
|
5
|
+
* Ported from Kagemusha's mechanism (trello_search / trello_card_detail):
|
|
6
|
+
* state questions are answered by reading the LIVE board at question time,
|
|
7
|
+
* never by projecting the connector change log. The 2026-07-24 incident chain
|
|
8
|
+
* (missing labels/assignees, first-sight timestamps burying enriched items,
|
|
9
|
+
* per-character card collapse) was one architecture mistake surfacing three
|
|
10
|
+
* ways: a log projection serving state queries. The connector log remains the
|
|
11
|
+
* delta/trigger source; these tools are the truth reads, the same pattern as
|
|
12
|
+
* kagemusha_* for the kagemusha DB.
|
|
13
|
+
*
|
|
14
|
+
* Read-only: no mutation endpoint is ever called. Card text is untrusted
|
|
15
|
+
* external data — tool descriptions instruct the model to treat it as data.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.resolveTrelloQueryAuth = resolveTrelloQueryAuth;
|
|
19
|
+
exports.searchTrelloCards = searchTrelloCards;
|
|
20
|
+
exports.getTrelloCard = getTrelloCard;
|
|
21
|
+
const config_loader_js_1 = require("../config-loader.js");
|
|
22
|
+
const BASE_URL = 'https://api.trello.com/1';
|
|
23
|
+
const FETCH_TIMEOUT_MS = 15_000;
|
|
24
|
+
/** Loud, no-fallback auth resolution via the connector contract:
|
|
25
|
+
* config.auth.token ?? env[tokenName ?? 'TRELLO_TOKEN'], "apiKey:token". */
|
|
26
|
+
function resolveTrelloQueryAuth(deps = {}) {
|
|
27
|
+
const env = deps.env ?? process.env;
|
|
28
|
+
const loaded = (0, config_loader_js_1.loadConnectorConfig)(deps.configPath);
|
|
29
|
+
if (!loaded.ok) {
|
|
30
|
+
throw new Error(`trello query tools: connector configuration unreadable (${loaded.error.code})`);
|
|
31
|
+
}
|
|
32
|
+
const trello = loaded.config['trello'];
|
|
33
|
+
if (!trello?.enabled) {
|
|
34
|
+
throw new Error('trello query tools: the trello connector is not enabled in connectors.json');
|
|
35
|
+
}
|
|
36
|
+
const rawToken = trello.auth?.token ?? env[trello.auth?.tokenName ?? 'TRELLO_TOKEN'];
|
|
37
|
+
if (!rawToken) {
|
|
38
|
+
throw new Error('trello query tools: no credentials (set the connector token, format "apiKey:token")');
|
|
39
|
+
}
|
|
40
|
+
const sep = rawToken.indexOf(':');
|
|
41
|
+
if (sep <= 0) {
|
|
42
|
+
throw new Error('trello query tools: credential format invalid, expected "apiKey:token"');
|
|
43
|
+
}
|
|
44
|
+
const boardNames = new Map();
|
|
45
|
+
for (const [key, ch] of Object.entries(trello.channels ?? {})) {
|
|
46
|
+
if (ch?.role !== 'ignore' && ch?.boardId)
|
|
47
|
+
boardNames.set(ch.boardId, ch.name ?? key);
|
|
48
|
+
}
|
|
49
|
+
return { apiKey: rawToken.slice(0, sep), token: rawToken.slice(sep + 1), boardNames };
|
|
50
|
+
}
|
|
51
|
+
async function trelloGet(path, params, auth, fetchFn) {
|
|
52
|
+
const search = new URLSearchParams({ ...params, key: auth.apiKey, token: auth.token });
|
|
53
|
+
const controller = new AbortController();
|
|
54
|
+
const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
55
|
+
let res;
|
|
56
|
+
try {
|
|
57
|
+
res = await fetchFn(`${BASE_URL}${path}?${search.toString()}`, { signal: controller.signal });
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
clearTimeout(timeout);
|
|
61
|
+
}
|
|
62
|
+
if (!res.ok) {
|
|
63
|
+
throw new Error(`trello API ${path}: HTTP ${res.status}`);
|
|
64
|
+
}
|
|
65
|
+
return (await res.json());
|
|
66
|
+
}
|
|
67
|
+
function summarize(card, boardNames) {
|
|
68
|
+
return {
|
|
69
|
+
cardId: card.id,
|
|
70
|
+
name: card.name,
|
|
71
|
+
board: card.board?.name ?? (card.board?.id ? (boardNames.get(card.board.id) ?? card.board.id) : ''),
|
|
72
|
+
list: card.list?.name ?? '',
|
|
73
|
+
labels: (card.labels ?? []).map((l) => l.name).filter(Boolean),
|
|
74
|
+
assignees: (card.members ?? []).map((m) => m.fullName || m.username || '').filter(Boolean),
|
|
75
|
+
due: card.due,
|
|
76
|
+
lastActivity: card.dateLastActivity,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Search cards across the configured boards, LIVE. Returns current list,
|
|
81
|
+
* labels (revision round / artist), and assignee names per card.
|
|
82
|
+
*/
|
|
83
|
+
async function searchTrelloCards(input, deps = {}) {
|
|
84
|
+
const query = (input.query ?? '').trim();
|
|
85
|
+
if (!query) {
|
|
86
|
+
throw new Error('trello_search requires a non-empty query');
|
|
87
|
+
}
|
|
88
|
+
const limit = Math.max(1, Math.min(20, Math.floor(input.limit ?? 10)));
|
|
89
|
+
const auth = resolveTrelloQueryAuth(deps);
|
|
90
|
+
const fetchFn = deps.fetchFn ?? fetch;
|
|
91
|
+
const result = await trelloGet('/search', {
|
|
92
|
+
query,
|
|
93
|
+
modelTypes: 'cards',
|
|
94
|
+
cards_limit: String(limit),
|
|
95
|
+
card_fields: 'name,due,dateLastActivity,labels',
|
|
96
|
+
card_list: 'true',
|
|
97
|
+
card_members: 'true',
|
|
98
|
+
card_board: 'true',
|
|
99
|
+
...(auth.boardNames.size > 0 ? { idBoards: [...auth.boardNames.keys()].join(',') } : {}),
|
|
100
|
+
}, auth, fetchFn);
|
|
101
|
+
return (result.cards ?? []).map((card) => summarize(card, auth.boardNames));
|
|
102
|
+
}
|
|
103
|
+
/** Full card detail, LIVE: description head, members, labels, checklists. */
|
|
104
|
+
async function getTrelloCard(input, deps = {}) {
|
|
105
|
+
const cardId = (input.cardId ?? '').trim();
|
|
106
|
+
if (!cardId || !/^[A-Za-z0-9]+$/.test(cardId)) {
|
|
107
|
+
throw new Error('trello_card requires a cardId (from trello_search results)');
|
|
108
|
+
}
|
|
109
|
+
const auth = resolveTrelloQueryAuth(deps);
|
|
110
|
+
const fetchFn = deps.fetchFn ?? fetch;
|
|
111
|
+
const card = await trelloGet(`/cards/${cardId}`, {
|
|
112
|
+
fields: 'name,desc,due,dateLastActivity,labels',
|
|
113
|
+
members: 'true',
|
|
114
|
+
member_fields: 'fullName,username',
|
|
115
|
+
list: 'true',
|
|
116
|
+
board: 'true',
|
|
117
|
+
checklists: 'all',
|
|
118
|
+
checkItem_fields: 'name,state',
|
|
119
|
+
}, auth, fetchFn);
|
|
120
|
+
return {
|
|
121
|
+
...summarize(card, auth.boardNames),
|
|
122
|
+
description: (card.desc ?? '').slice(0, 1000),
|
|
123
|
+
checklists: (card.checklists ?? []).slice(0, 10).map((cl) => ({
|
|
124
|
+
name: cl.name,
|
|
125
|
+
items: (cl.checkItems ?? [])
|
|
126
|
+
.slice(0, 30)
|
|
127
|
+
.map((it) => ({ name: it.name, complete: it.state === 'complete' })),
|
|
128
|
+
})),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=query-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-tools.js","sourceRoot":"","sources":["../../../src/connectors/trello/query-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
/** Full-replace ceiling. Kagemusha's mature manual is ~24KB; leave headroom
|
|
2
2
|
* while keeping a runaway self-edit from bloating every future prompt. */
|
|
3
3
|
export declare const CONSOLE_BRIEF_MAX_CHARS = 32000;
|
|
4
|
-
export declare const CONSOLE_BRIEF_DEFAULT = "# Owner Console Operating Brief\n\nThis file is YOURS. It is seeded once and never overwritten by upgrades.\nWhen the owner corrects how you work, or a procedure fails and you learn the\nfix, record
|
|
4
|
+
export declare const CONSOLE_BRIEF_DEFAULT = "# Owner Console Operating Brief\n\nThis file is YOURS. It is seeded once and never overwritten by upgrades.\nWhen the owner corrects how you work, or a procedure fails and you learn the\nfix, record it with console_brief_update({lesson}) - one durable lesson per\ncall, appended below with today's date while everything above is preserved.\nThis is how your operating manual grows; losing a lesson means repeating the\nfailure.\n\n## Reporting philosophy\n\n- A report is analysis, not a listing. Cross-check at least two sources\n (board/tasks vs channel messages) before stating a situation.\n- Cite where each claim came from, with the source timestamp. An uncited\n claim is a guess.\n- Quote the key channel line when it drives a conclusion; name the room and\n sender exactly as the source shows them.\n- Lead with what changed and what needs the owner; keep the quiet parts to\n one line.\n\n## Procedure recipes (grow this section from experience)\n\n- Status questions: artifacts first (board_read, workorder_status,\n audit_findings_read), then live queries; memory recall last and cited.\n- Business data: progressive exploration - kagemusha_overview() then\n kagemusha_entities({activeOnly:true}) then kagemusha_tasks({...}) then\n kagemusha_messages({channelId, since}) on the busiest channels. Never\n widen a since window you were given.\n- Cross-channel synthesis: anchor items on their task id (relatedTaskId)\n so the same work seen in two rooms stays one item.\n\n## Situational awareness\n\n- Delta events name what changed since your last look; answer against the\n delta first, then the wider window.\n- After a context gap (compaction, restart), rebuild from storage - recall\n and artifacts - never from what you assume you remember.\n\n## Self-update rule\n\n- When the owner corrects your working style, or a recipe above proves\n wrong, call console_brief_update({lesson}) in the same turn and say you\n did. One concrete lesson per call; the file itself is curated by the\n owner - you only ever add.\n\n## Lessons\n";
|
|
5
5
|
export declare function consoleBriefPath(homeDir?: string): string;
|
|
6
6
|
/** Boot seeding - write the packaged default ONLY when missing (agent/user
|
|
7
7
|
* edits always win; deliberate no-auto-upgrade, mirroring ensureBriefs). */
|
|
8
8
|
export declare function ensureConsoleBrief(homeDir?: string): boolean;
|
|
9
9
|
/** Read the current brief; empty string when absent (caller seeds on boot). */
|
|
10
10
|
export declare function loadConsoleBrief(homeDir?: string): string;
|
|
11
|
-
/**
|
|
12
|
-
*
|
|
13
|
-
|
|
11
|
+
/**
|
|
12
|
+
* Append one dated lesson for the agent's self-update tool. APPEND, never
|
|
13
|
+
* replace: on the loop's first live fire (2026-07-24) the model answered a
|
|
14
|
+
* full-replace contract with just its new lesson, wiping the seeded manual
|
|
15
|
+
* including the self-update rule itself. Accretion is the mechanism Kagemusha
|
|
16
|
+
* actually validated - the agent only ever adds; reorganizing the file is the
|
|
17
|
+
* owner's (or an owner-directed session's) manual edit.
|
|
18
|
+
*
|
|
19
|
+
* Loud validation, no fallback: an empty lesson is refused, and a brief that
|
|
20
|
+
* would exceed the ceiling is refused (the manual needs owner curation),
|
|
21
|
+
* never truncated.
|
|
22
|
+
*/
|
|
23
|
+
export declare function appendConsoleBriefLesson(lesson: string, homeDir?: string): string;
|
|
14
24
|
//# sourceMappingURL=console-brief.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console-brief.d.ts","sourceRoot":"","sources":["../../src/operator/console-brief.ts"],"names":[],"mappings":"AAqBA;2EAC2E;AAC3E,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAE9C,eAAO,MAAM,qBAAqB,
|
|
1
|
+
{"version":3,"file":"console-brief.d.ts","sourceRoot":"","sources":["../../src/operator/console-brief.ts"],"names":[],"mappings":"AAqBA;2EAC2E;AAC3E,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAE9C,eAAO,MAAM,qBAAqB,+gEA8CjC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,MAAkB,GAAG,MAAM,CAEpE;AAED;6EAC6E;AAC7E,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,MAAkB,GAAG,OAAO,CAQvE;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,MAAkB,GAAG,MAAM,CAIpE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAkB,GAAG,MAAM,CA4B5F"}
|
|
@@ -4,7 +4,7 @@ exports.CONSOLE_BRIEF_DEFAULT = exports.CONSOLE_BRIEF_MAX_CHARS = void 0;
|
|
|
4
4
|
exports.consoleBriefPath = consoleBriefPath;
|
|
5
5
|
exports.ensureConsoleBrief = ensureConsoleBrief;
|
|
6
6
|
exports.loadConsoleBrief = loadConsoleBrief;
|
|
7
|
-
exports.
|
|
7
|
+
exports.appendConsoleBriefLesson = appendConsoleBriefLesson;
|
|
8
8
|
/**
|
|
9
9
|
* Owner-console operating brief - the agent-owned operations manual.
|
|
10
10
|
*
|
|
@@ -32,9 +32,10 @@ exports.CONSOLE_BRIEF_DEFAULT = `# Owner Console Operating Brief
|
|
|
32
32
|
|
|
33
33
|
This file is YOURS. It is seeded once and never overwritten by upgrades.
|
|
34
34
|
When the owner corrects how you work, or a procedure fails and you learn the
|
|
35
|
-
fix, record
|
|
36
|
-
|
|
37
|
-
repeating the
|
|
35
|
+
fix, record it with console_brief_update({lesson}) - one durable lesson per
|
|
36
|
+
call, appended below with today's date while everything above is preserved.
|
|
37
|
+
This is how your operating manual grows; losing a lesson means repeating the
|
|
38
|
+
failure.
|
|
38
39
|
|
|
39
40
|
## Reporting philosophy
|
|
40
41
|
|
|
@@ -68,8 +69,11 @@ repeating the failure.
|
|
|
68
69
|
## Self-update rule
|
|
69
70
|
|
|
70
71
|
- When the owner corrects your working style, or a recipe above proves
|
|
71
|
-
wrong,
|
|
72
|
-
|
|
72
|
+
wrong, call console_brief_update({lesson}) in the same turn and say you
|
|
73
|
+
did. One concrete lesson per call; the file itself is curated by the
|
|
74
|
+
owner - you only ever add.
|
|
75
|
+
|
|
76
|
+
## Lessons
|
|
73
77
|
`;
|
|
74
78
|
function consoleBriefPath(homeDir = (0, node_os_1.homedir)()) {
|
|
75
79
|
return (0, node_path_1.join)(homeDir, '.mama', 'briefs', 'brief-owner-console.md');
|
|
@@ -93,19 +97,43 @@ function loadConsoleBrief(homeDir = (0, node_os_1.homedir)()) {
|
|
|
93
97
|
return '';
|
|
94
98
|
return (0, node_fs_1.readFileSync)(path, 'utf-8');
|
|
95
99
|
}
|
|
96
|
-
/**
|
|
97
|
-
*
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
100
|
+
/**
|
|
101
|
+
* Append one dated lesson for the agent's self-update tool. APPEND, never
|
|
102
|
+
* replace: on the loop's first live fire (2026-07-24) the model answered a
|
|
103
|
+
* full-replace contract with just its new lesson, wiping the seeded manual
|
|
104
|
+
* including the self-update rule itself. Accretion is the mechanism Kagemusha
|
|
105
|
+
* actually validated - the agent only ever adds; reorganizing the file is the
|
|
106
|
+
* owner's (or an owner-directed session's) manual edit.
|
|
107
|
+
*
|
|
108
|
+
* Loud validation, no fallback: an empty lesson is refused, and a brief that
|
|
109
|
+
* would exceed the ceiling is refused (the manual needs owner curation),
|
|
110
|
+
* never truncated.
|
|
111
|
+
*/
|
|
112
|
+
function appendConsoleBriefLesson(lesson, homeDir = (0, node_os_1.homedir)()) {
|
|
113
|
+
const trimmed = lesson.trim();
|
|
114
|
+
if (!trimmed) {
|
|
115
|
+
throw new Error('console brief update refused: empty lesson');
|
|
116
|
+
}
|
|
117
|
+
// A brief absent at call time (deleted, first run) is re-seeded so the
|
|
118
|
+
// lesson lands inside the full manual, not alone in an empty file.
|
|
119
|
+
let existing = loadConsoleBrief(homeDir);
|
|
120
|
+
if (!existing.trim()) {
|
|
121
|
+
ensureConsoleBrief(homeDir);
|
|
122
|
+
existing = loadConsoleBrief(homeDir);
|
|
101
123
|
}
|
|
102
|
-
|
|
103
|
-
|
|
124
|
+
const date = new Date().toISOString().slice(0, 10);
|
|
125
|
+
const entry = `- ${date}: ${trimmed.replace(/\s*\n\s*/g, ' ')}`;
|
|
126
|
+
const base = existing.replace(/\s+$/, '');
|
|
127
|
+
const next = `${base}\n${base.includes('\n## Lessons') ? '' : '\n## Lessons\n'}${entry}\n`;
|
|
128
|
+
if (next.length > exports.CONSOLE_BRIEF_MAX_CHARS) {
|
|
129
|
+
throw new Error(`console brief update refused: ${next.length} chars exceeds ${exports.CONSOLE_BRIEF_MAX_CHARS} - ` +
|
|
130
|
+
'ask the owner to curate the brief before recording more lessons');
|
|
104
131
|
}
|
|
105
132
|
const path = consoleBriefPath(homeDir);
|
|
106
133
|
(0, node_fs_1.mkdirSync)((0, node_path_1.join)(homeDir, '.mama', 'briefs'), { recursive: true });
|
|
107
134
|
const tmpPath = `${path}.tmp`;
|
|
108
|
-
(0, node_fs_1.writeFileSync)(tmpPath,
|
|
135
|
+
(0, node_fs_1.writeFileSync)(tmpPath, next, 'utf-8');
|
|
109
136
|
(0, node_fs_1.renameSync)(tmpPath, path);
|
|
137
|
+
return next;
|
|
110
138
|
}
|
|
111
139
|
//# sourceMappingURL=console-brief.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console-brief.js","sourceRoot":"","sources":["../../src/operator/console-brief.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"console-brief.js","sourceRoot":"","sources":["../../src/operator/console-brief.ts"],"names":[],"mappings":"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"}
|