@wirecat/cli-core 0.294.0 → 0.296.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/README.md +1 -0
- package/dist/cli/bot/mcp.js +1 -1
- package/dist/cli/bot/mcp.js.map +1 -1
- package/dist/cli/bot/watch.js +1 -1
- package/dist/cli/bot/watch.js.map +1 -1
- package/dist/cli/messenger/backfill-command.js +1 -1
- package/dist/cli/messenger/backfill-command.js.map +1 -1
- package/dist/cli/messenger/mcp-command.js +1 -1
- package/dist/cli/messenger/mcp-command.js.map +1 -1
- package/dist/cli/messenger/serve-command.js +1 -1
- package/dist/cli/messenger/serve-command.js.map +1 -1
- package/dist/cli/messenger/store-maintenance-command.d.ts +1 -1
- package/dist/cli/messenger/tasks-command.d.ts.map +1 -1
- package/dist/cli/messenger/tasks-command.js +75 -13
- package/dist/cli/messenger/tasks-command.js.map +1 -1
- package/dist/cli/messenger/watch-command.js +1 -1
- package/dist/cli/messenger/watch-command.js.map +1 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +4 -5
- package/dist/cli/program.js.map +1 -1
- package/dist/cli/store-settings.d.ts +13 -0
- package/dist/cli/store-settings.d.ts.map +1 -1
- package/dist/cli/store-settings.js +76 -8
- package/dist/cli/store-settings.js.map +1 -1
- package/dist/documents/catalog.d.ts +3 -0
- package/dist/documents/catalog.d.ts.map +1 -0
- package/dist/documents/catalog.js +18 -0
- package/dist/documents/catalog.js.map +1 -0
- package/dist/documents/index.d.ts +10 -0
- package/dist/documents/index.d.ts.map +1 -0
- package/dist/documents/index.js +8 -0
- package/dist/documents/index.js.map +1 -0
- package/dist/documents/model.d.ts +117 -0
- package/dist/documents/model.d.ts.map +1 -0
- package/dist/documents/model.js +2 -0
- package/dist/documents/model.js.map +1 -0
- package/dist/documents/scope.d.ts +3 -0
- package/dist/documents/scope.d.ts.map +1 -0
- package/dist/documents/scope.js +15 -0
- package/dist/documents/scope.js.map +1 -0
- package/dist/documents.d.ts +1 -0
- package/dist/documents.d.ts.map +1 -1
- package/dist/documents.js +1 -0
- package/dist/documents.js.map +1 -1
- package/dist/domain/task-categories.d.ts +15 -2
- package/dist/domain/task-categories.d.ts.map +1 -1
- package/dist/domain/task-categories.js +649 -26
- package/dist/domain/task-categories.js.map +1 -1
- package/dist/entities/agenda.d.ts +14 -1
- package/dist/entities/agenda.d.ts.map +1 -1
- package/dist/entities/agenda.js +6 -1
- package/dist/entities/agenda.js.map +1 -1
- package/dist/entities/index.d.ts +19 -1
- package/dist/entities/index.d.ts.map +1 -1
- package/dist/entities/task.d.ts +19 -0
- package/dist/entities/task.d.ts.map +1 -1
- package/dist/entities/task.js +11 -0
- package/dist/entities/task.js.map +1 -1
- package/dist/errors/reasons.d.ts +1 -1
- package/dist/errors/reasons.d.ts.map +1 -1
- package/dist/errors/reasons.js +12 -1
- package/dist/errors/reasons.js.map +1 -1
- package/dist/mcp/tools/tasks.d.ts.map +1 -1
- package/dist/mcp/tools/tasks.js +46 -18
- package/dist/mcp/tools/tasks.js.map +1 -1
- package/dist/search/task-signature.d.ts.map +1 -1
- package/dist/search/task-signature.js +32 -6
- package/dist/search/task-signature.js.map +1 -1
- package/dist/search/task-similarity.d.ts +15 -2
- package/dist/search/task-similarity.d.ts.map +1 -1
- package/dist/search/task-similarity.js +29 -10
- package/dist/search/task-similarity.js.map +1 -1
- package/dist/services/agenda.d.ts +7 -2
- package/dist/services/agenda.d.ts.map +1 -1
- package/dist/services/agenda.js +11 -0
- package/dist/services/agenda.js.map +1 -1
- package/dist/services/documents/extraction.d.ts +13 -0
- package/dist/services/documents/extraction.d.ts.map +1 -0
- package/dist/services/documents/extraction.js +37 -0
- package/dist/services/documents/extraction.js.map +1 -0
- package/dist/services/documents/ingestion.d.ts +29 -0
- package/dist/services/documents/ingestion.d.ts.map +1 -0
- package/dist/services/documents/ingestion.js +125 -0
- package/dist/services/documents/ingestion.js.map +1 -0
- package/dist/services/documents/knowledge.d.ts +58 -0
- package/dist/services/documents/knowledge.d.ts.map +1 -0
- package/dist/services/documents/knowledge.js +143 -0
- package/dist/services/documents/knowledge.js.map +1 -0
- package/dist/services/documents/plan.d.ts +11 -0
- package/dist/services/documents/plan.d.ts.map +1 -0
- package/dist/services/documents/plan.js +200 -0
- package/dist/services/documents/plan.js.map +1 -0
- package/dist/services/documents/ports.d.ts +24 -0
- package/dist/services/documents/ports.d.ts.map +1 -0
- package/dist/services/documents/ports.js +2 -0
- package/dist/services/documents/ports.js.map +1 -0
- package/dist/services/documents/proposals.d.ts +38 -0
- package/dist/services/documents/proposals.d.ts.map +1 -0
- package/dist/services/documents/proposals.js +52 -0
- package/dist/services/documents/proposals.js.map +1 -0
- package/dist/services/documents/sync.d.ts +24 -0
- package/dist/services/documents/sync.d.ts.map +1 -0
- package/dist/services/documents/sync.js +217 -0
- package/dist/services/documents/sync.js.map +1 -0
- package/dist/services/task-categories.d.ts +5 -2
- package/dist/services/task-categories.d.ts.map +1 -1
- package/dist/services/task-categories.js +37 -14
- package/dist/services/task-categories.js.map +1 -1
- package/dist/services/tasks.d.ts +38 -12
- package/dist/services/tasks.d.ts.map +1 -1
- package/dist/services/tasks.js +83 -17
- package/dist/services/tasks.js.map +1 -1
- package/dist/store/index.d.ts +1 -0
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +1 -0
- package/dist/store/index.js.map +1 -1
- package/dist/store/sqlite/lucene.d.ts.map +1 -1
- package/dist/store/sqlite/lucene.js +5 -2
- package/dist/store/sqlite/lucene.js.map +1 -1
- package/dist/store/sqlite/manifest.d.ts.map +1 -1
- package/dist/store/sqlite/manifest.js +1 -0
- package/dist/store/sqlite/manifest.js.map +1 -1
- package/dist/store/sqlite/migrations.generated.d.ts.map +1 -1
- package/dist/store/sqlite/migrations.generated.js +13 -0
- package/dist/store/sqlite/migrations.generated.js.map +1 -1
- package/dist/store/sqlite/schema.d.ts +112 -0
- package/dist/store/sqlite/schema.d.ts.map +1 -1
- package/dist/store/sqlite/schema.js +8 -0
- package/dist/store/sqlite/schema.js.map +1 -1
- package/dist/store/sqlite/task-candidates.d.ts +2 -0
- package/dist/store/sqlite/task-candidates.d.ts.map +1 -1
- package/dist/store/sqlite/task-candidates.js +76 -32
- package/dist/store/sqlite/task-candidates.js.map +1 -1
- package/dist/store/sqlite/task-category-settings.d.ts +3 -1
- package/dist/store/sqlite/task-category-settings.d.ts.map +1 -1
- package/dist/store/sqlite/task-category-settings.js +11 -1
- package/dist/store/sqlite/task-category-settings.js.map +1 -1
- package/dist/store/sqlite/task-close-store.d.ts +24 -0
- package/dist/store/sqlite/task-close-store.d.ts.map +1 -0
- package/dist/store/sqlite/task-close-store.js +57 -0
- package/dist/store/sqlite/task-close-store.js.map +1 -0
- package/dist/store/sqlite/task-close.d.ts +35 -0
- package/dist/store/sqlite/task-close.d.ts.map +1 -0
- package/dist/store/sqlite/task-close.js +68 -0
- package/dist/store/sqlite/task-close.js.map +1 -0
- package/dist/store/sqlite/task-pairs.d.ts +14 -4
- package/dist/store/sqlite/task-pairs.d.ts.map +1 -1
- package/dist/store/sqlite/task-pairs.js +31 -5
- package/dist/store/sqlite/task-pairs.js.map +1 -1
- package/dist/store/sqlite/task-relations.d.ts.map +1 -1
- package/dist/store/sqlite/task-relations.js +4 -1
- package/dist/store/sqlite/task-relations.js.map +1 -1
- package/dist/store/sqlite/tasks.d.ts +7 -2
- package/dist/store/sqlite/tasks.d.ts.map +1 -1
- package/dist/store/sqlite/tasks.js +18 -5
- package/dist/store/sqlite/tasks.js.map +1 -1
- package/dist/store/sqlite/work-tasks.d.ts +6 -1
- package/dist/store/sqlite/work-tasks.d.ts.map +1 -1
- package/dist/store/sqlite/work-tasks.js +8 -0
- package/dist/store/sqlite/work-tasks.js.map +1 -1
- package/dist/store/store.d.ts +1 -0
- package/dist/store/store.d.ts.map +1 -1
- package/dist/store/store.js +1 -0
- package/dist/store/store.js.map +1 -1
- package/package.json +3 -3
- package/parity.json +34 -0
- package/skills/follow-ups/SKILL.md +2 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { SourceContent } from "../../documents/model.js";
|
|
2
|
+
import type { Fact, Memory } from "../../store/index.js";
|
|
3
|
+
import { type Complete } from "./extraction.js";
|
|
4
|
+
import type { DocumentKnowledge } from "./knowledge.js";
|
|
5
|
+
export interface ImportedSource {
|
|
6
|
+
id: string;
|
|
7
|
+
ref: string;
|
|
8
|
+
hash: string;
|
|
9
|
+
snapshot: SourceContent;
|
|
10
|
+
}
|
|
11
|
+
export interface ProposalOptions {
|
|
12
|
+
read(): ImportedSource;
|
|
13
|
+
complete: Complete;
|
|
14
|
+
scope: Memory["scope"];
|
|
15
|
+
author: string;
|
|
16
|
+
tab?: string;
|
|
17
|
+
save?: boolean;
|
|
18
|
+
withWrite<T>(fn: (knowledge: DocumentKnowledge, principal: string, ref: string) => Promise<T>): Promise<T>;
|
|
19
|
+
}
|
|
20
|
+
export declare const extractDocumentMemories: (options: ProposalOptions) => Promise<{
|
|
21
|
+
items: {
|
|
22
|
+
kind: "digest" | "fact" | "preference" | "summary";
|
|
23
|
+
body: string;
|
|
24
|
+
quote: string;
|
|
25
|
+
}[];
|
|
26
|
+
provider: string;
|
|
27
|
+
model: string;
|
|
28
|
+
tokens: number;
|
|
29
|
+
provenance: {
|
|
30
|
+
document: string;
|
|
31
|
+
file_id: string;
|
|
32
|
+
hash: string;
|
|
33
|
+
url: string;
|
|
34
|
+
tab: string | null;
|
|
35
|
+
};
|
|
36
|
+
saved: (Fact | Memory)[];
|
|
37
|
+
}>;
|
|
38
|
+
//# sourceMappingURL=proposals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposals.d.ts","sourceRoot":"","sources":["../../../src/services/documents/proposals.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,EAAE,KAAK,QAAQ,EAAmB,MAAM,iBAAiB,CAAA;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEvD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,aAAa,CAAA;CACxB;AACD,MAAM,WAAW,eAAe;IAC9B,IAAI,IAAI,cAAc,CAAA;IACtB,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAC3G;AACD,eAAO,MAAM,uBAAuB,YAAmB,eAAe;;;;;;;;;;QAyChE,QAAQ;QACR,OAAO;QACP,IAAI;QACJ,GAAG;QACH,GAAG;;;EAIR,CAAA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-base";
|
|
2
|
+
import { extractMemories } from "./extraction.js";
|
|
3
|
+
export const extractDocumentMemories = async (options) => {
|
|
4
|
+
const source = options.read();
|
|
5
|
+
const text = options.tab ? source.snapshot.tabs.find((tab) => tab.id === options.tab)?.text : source.snapshot.text;
|
|
6
|
+
if (text === undefined)
|
|
7
|
+
throw new CliError("not_found", "tab was not found in this imported document");
|
|
8
|
+
const result = await extractMemories(text, options.complete);
|
|
9
|
+
const assertCurrent = () => {
|
|
10
|
+
if (options.read().hash !== source.hash)
|
|
11
|
+
throw new CliError("validation_error", "source changed during extraction; no memories were saved", {
|
|
12
|
+
reason: "document.changed",
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
assertCurrent();
|
|
16
|
+
const saved = options.save
|
|
17
|
+
? await options.withWrite(async (knowledge, principal, ref) => {
|
|
18
|
+
assertCurrent();
|
|
19
|
+
if (ref !== source.ref)
|
|
20
|
+
throw new CliError("validation_error", "source changed during extraction; no memories were saved", {
|
|
21
|
+
reason: "document.changed",
|
|
22
|
+
});
|
|
23
|
+
const items = [];
|
|
24
|
+
const by = { bot: options.author, model: result.model };
|
|
25
|
+
for (const item of result.items) {
|
|
26
|
+
const body = `${item.body}\n\nSource quote: ${item.quote}\nSnapshot: ${source.hash}`;
|
|
27
|
+
items.push(item.kind === "fact"
|
|
28
|
+
? await knowledge.addFact(principal, ref, { statement: body, type: "fact", scope: options.scope, by })
|
|
29
|
+
: await knowledge.addMemory(principal, ref, {
|
|
30
|
+
kind: item.kind,
|
|
31
|
+
body,
|
|
32
|
+
scope: options.scope,
|
|
33
|
+
status: "proposed",
|
|
34
|
+
author: by,
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
return items;
|
|
38
|
+
})
|
|
39
|
+
: [];
|
|
40
|
+
return {
|
|
41
|
+
...result,
|
|
42
|
+
provenance: {
|
|
43
|
+
document: source.ref,
|
|
44
|
+
file_id: source.id,
|
|
45
|
+
hash: source.hash,
|
|
46
|
+
url: source.snapshot.metadata.url,
|
|
47
|
+
tab: options.tab ?? null,
|
|
48
|
+
},
|
|
49
|
+
saved,
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=proposals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proposals.js","sourceRoot":"","sources":["../../../src/services/documents/proposals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { SourceFile } from "../../documents/model.js";
|
|
2
|
+
import type { SyncOptions } from "./ports.js";
|
|
3
|
+
export interface SyncResult {
|
|
4
|
+
saved: number;
|
|
5
|
+
names_only: number;
|
|
6
|
+
removed: number;
|
|
7
|
+
unchanged: number;
|
|
8
|
+
pictures?: number;
|
|
9
|
+
pictures_too_large?: number;
|
|
10
|
+
pictures_skipped?: string;
|
|
11
|
+
pending: number;
|
|
12
|
+
skipped: {
|
|
13
|
+
id: string;
|
|
14
|
+
reason: string;
|
|
15
|
+
}[];
|
|
16
|
+
errors: {
|
|
17
|
+
id: string;
|
|
18
|
+
code: string;
|
|
19
|
+
message: string;
|
|
20
|
+
}[];
|
|
21
|
+
coverage: string;
|
|
22
|
+
}
|
|
23
|
+
export declare const syncDocuments: <M extends SourceFile>(options: SyncOptions<M>) => Promise<SyncResult>;
|
|
24
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/services/documents/sync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA+C,UAAU,EAAc,MAAM,0BAA0B,CAAA;AAGnH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAO7C,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACzC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IACvD,QAAQ,EAAE,MAAM,CAAA;CACjB;AACD,eAAO,MAAM,aAAa,GAAU,CAAC,SAAS,UAAU,WAAW,WAAW,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,UAAU,CA6MrG,CAAA"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { CliError, isCliError } from "@wirecat/cli-base";
|
|
3
|
+
import { catalogFiles } from "../../documents/catalog.js";
|
|
4
|
+
import { within } from "../../documents/scope.js";
|
|
5
|
+
import { changedSince, planDocuments, scopeHash } from "./plan.js";
|
|
6
|
+
const MAX_PICTURE_BYTES = 25 * 1024 * 1024;
|
|
7
|
+
const SAVE_EVERY_MS = 2000;
|
|
8
|
+
const SAVE_EVERY_ITEMS = 25;
|
|
9
|
+
const isPicture = (file) => file.mime.startsWith("image/") && file.canDownload;
|
|
10
|
+
const hashText = (text) => createHash("sha256").update(text).digest("hex");
|
|
11
|
+
export const syncDocuments = async (options) => {
|
|
12
|
+
const { source, index, state: statePort, principal, roots, textLimit: limit, max, signal, rescan = false, pictures = false, assertHeld, errorOf, skipReason, storeVersion: VERSION, } = options;
|
|
13
|
+
if (![max, limit, options.maxEntries].every((value) => Number.isSafeInteger(value) && value > 0))
|
|
14
|
+
throw new CliError("validation_error", "sync limits must be positive whole numbers");
|
|
15
|
+
const profile = { principal, roots, picture_search: pictures };
|
|
16
|
+
const now = options.now ?? Date.now;
|
|
17
|
+
const lock = { assertHeld };
|
|
18
|
+
if (signal?.aborted)
|
|
19
|
+
throw new CliError("cancelled", "sync was cancelled");
|
|
20
|
+
const result = {
|
|
21
|
+
saved: 0,
|
|
22
|
+
names_only: 0,
|
|
23
|
+
removed: 0,
|
|
24
|
+
unchanged: 0,
|
|
25
|
+
pending: 0,
|
|
26
|
+
skipped: [],
|
|
27
|
+
errors: [],
|
|
28
|
+
coverage: "selected folders only; unsupported files are reported",
|
|
29
|
+
...(profile.picture_search ? { pictures: 0 } : {}),
|
|
30
|
+
};
|
|
31
|
+
let writer;
|
|
32
|
+
let flush;
|
|
33
|
+
try {
|
|
34
|
+
if (profile.roots.length && (!source || (await source.identity()) !== profile.principal))
|
|
35
|
+
throw new CliError("authentication_error", "signed-in source account does not match this profile", {
|
|
36
|
+
reason: "profile.wrong-account",
|
|
37
|
+
});
|
|
38
|
+
const state = statePort.read();
|
|
39
|
+
if (state.principal !== principal)
|
|
40
|
+
throw new CliError("configuration_error", "sync state belongs to another source account");
|
|
41
|
+
const currentScope = scopeHash(profile.roots);
|
|
42
|
+
const abandoned = state.pending && (state.pending.scope !== currentScope || rescan) ? state.pending.jobs.map((job) => job.id) : [];
|
|
43
|
+
if (state.pending?.scope !== currentScope || rescan)
|
|
44
|
+
delete state.pending;
|
|
45
|
+
if (rescan) {
|
|
46
|
+
delete state.cursor;
|
|
47
|
+
statePort.removeWalk();
|
|
48
|
+
}
|
|
49
|
+
if (!state.pending) {
|
|
50
|
+
state.pending = await planDocuments(options, source, state, profile.roots, limit, profile.picture_search ?? false, abandoned, {
|
|
51
|
+
read: (scope) => statePort.readWalk(scope),
|
|
52
|
+
save: (walk) => statePort.saveWalk(walk),
|
|
53
|
+
});
|
|
54
|
+
state.skipped = state.pending.skipped;
|
|
55
|
+
statePort.save(state);
|
|
56
|
+
statePort.removeWalk();
|
|
57
|
+
}
|
|
58
|
+
const pending = state.pending;
|
|
59
|
+
if (!pending)
|
|
60
|
+
throw new CliError("invalid_response", "could not prepare a sync batch");
|
|
61
|
+
if (index.catalog)
|
|
62
|
+
await index.catalog.import(profile.principal, catalogFiles(state, profile.roots));
|
|
63
|
+
result.skipped = state.skipped.map(({ id, reason }) => ({ id, reason }));
|
|
64
|
+
const saveNamesOnly = async (file, reason) => {
|
|
65
|
+
const doc = { metadata: file, markdown: "", text: "", tabs: [], notRead: reason };
|
|
66
|
+
const hash = hashText("");
|
|
67
|
+
const previous = state.documents[file.id];
|
|
68
|
+
const reference = await index.save(profile.principal, doc, hash);
|
|
69
|
+
statePort.saveSnapshot(doc);
|
|
70
|
+
state.documents[file.id] = { metadata: file, hash, reference, tabs: 0, notRead: reason };
|
|
71
|
+
if (previous?.notRead === reason && !changedSince(previous.metadata, file))
|
|
72
|
+
result.unchanged++;
|
|
73
|
+
else
|
|
74
|
+
result.names_only++;
|
|
75
|
+
};
|
|
76
|
+
let modelMissing = false;
|
|
77
|
+
const savePictureOf = async (file) => {
|
|
78
|
+
const entry = state.documents[file.id];
|
|
79
|
+
if (!profile.picture_search || !isPicture(file) || modelMissing)
|
|
80
|
+
return;
|
|
81
|
+
if ((file.size ?? 0) > MAX_PICTURE_BYTES) {
|
|
82
|
+
entry.picture = "too-large";
|
|
83
|
+
result.pictures_too_large = (result.pictures_too_large ?? 0) + 1;
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (!source)
|
|
87
|
+
throw new CliError("configuration_error", "a pending picture requires source sign-in");
|
|
88
|
+
if (!writer) {
|
|
89
|
+
try {
|
|
90
|
+
writer = await index.openPictures();
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
if (!isCliError(error) || error.code !== "not_found")
|
|
94
|
+
throw error;
|
|
95
|
+
modelMissing = true;
|
|
96
|
+
result.pictures_skipped = error.message;
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const bytes = await source.bytes(file.id);
|
|
101
|
+
if (bytes.length > MAX_PICTURE_BYTES) {
|
|
102
|
+
entry.picture = "too-large";
|
|
103
|
+
result.pictures_too_large = (result.pictures_too_large ?? 0) + 1;
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if ((await writer.save(entry.reference, bytes)) === "saved")
|
|
107
|
+
result.pictures = (result.pictures ?? 0) + 1;
|
|
108
|
+
entry.picture = "saved";
|
|
109
|
+
};
|
|
110
|
+
// Saving the whole state after every file grows with the profile; a batch at a time keeps it bounded.
|
|
111
|
+
let unsaved = 0;
|
|
112
|
+
let savedAt = now();
|
|
113
|
+
flush = () => {
|
|
114
|
+
if (unsaved)
|
|
115
|
+
statePort.save(state);
|
|
116
|
+
unsaved = 0;
|
|
117
|
+
savedAt = now();
|
|
118
|
+
};
|
|
119
|
+
const progress = () => {
|
|
120
|
+
if (++unsaved >= SAVE_EVERY_ITEMS || now() - savedAt >= SAVE_EVERY_MS)
|
|
121
|
+
flush?.();
|
|
122
|
+
};
|
|
123
|
+
const jobs = [...pending.jobs].slice(0, max);
|
|
124
|
+
for (const job of jobs) {
|
|
125
|
+
if (signal?.aborted)
|
|
126
|
+
throw new CliError("cancelled", "sync was cancelled; pending operations are retained");
|
|
127
|
+
lock.assertHeld();
|
|
128
|
+
try {
|
|
129
|
+
if (job.kind === "remove") {
|
|
130
|
+
await index.remove(profile.principal, job.id);
|
|
131
|
+
statePort.removeSnapshot(job.id);
|
|
132
|
+
delete state.documents[job.id];
|
|
133
|
+
result.removed++;
|
|
134
|
+
}
|
|
135
|
+
else if (job.file && skipReason(job.file)) {
|
|
136
|
+
await saveNamesOnly(job.file, skipReason(job.file));
|
|
137
|
+
await savePictureOf(job.file);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
if (!source)
|
|
141
|
+
throw new CliError("configuration_error", "a pending save requires source sign-in");
|
|
142
|
+
const content = await source.content(job.id, limit);
|
|
143
|
+
if (!within(content.metadata, profile.roots, pending.folders)) {
|
|
144
|
+
await index.remove(profile.principal, job.id);
|
|
145
|
+
statePort.removeSnapshot(job.id);
|
|
146
|
+
delete state.documents[job.id];
|
|
147
|
+
result.removed++;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
const hash = hashText(content.text);
|
|
151
|
+
const previous = state.documents[job.id];
|
|
152
|
+
const reference = await index.save(profile.principal, content, hash).catch((error) => {
|
|
153
|
+
if (!isCliError(error) || error.code !== "validation_error")
|
|
154
|
+
throw error;
|
|
155
|
+
throw new CliError("validation_error", `the local store refused this text: ${error.message}`, {
|
|
156
|
+
reason: "store.refused",
|
|
157
|
+
store_refused_in: VERSION,
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
statePort.saveSnapshot(content);
|
|
161
|
+
state.documents[job.id] = { metadata: content.metadata, hash, reference, tabs: content.tabs.length };
|
|
162
|
+
if (previous?.hash === hash)
|
|
163
|
+
result.unchanged++;
|
|
164
|
+
else
|
|
165
|
+
result.saved++;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
pending.jobs = pending.jobs.filter((item) => item !== job);
|
|
169
|
+
progress();
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
const safe = errorOf(error);
|
|
173
|
+
if (safe.code === "cancelled")
|
|
174
|
+
throw safe;
|
|
175
|
+
if (job.kind === "save" && (safe.code === "not_found" || safe.code === "validation_error")) {
|
|
176
|
+
const skipped = {
|
|
177
|
+
id: job.id,
|
|
178
|
+
reason: safe.message,
|
|
179
|
+
...(job.file ? { file: job.file } : {}),
|
|
180
|
+
...(safe.details.text_limit ? { textLimit: limit } : {}),
|
|
181
|
+
...(safe.details.store_refused_in ? { storeRefusedIn: VERSION } : {}),
|
|
182
|
+
};
|
|
183
|
+
if (job.file && safe.code === "validation_error")
|
|
184
|
+
await saveNamesOnly(job.file, skipped.reason);
|
|
185
|
+
else {
|
|
186
|
+
await index.remove(profile.principal, job.id);
|
|
187
|
+
statePort.removeSnapshot(job.id);
|
|
188
|
+
delete state.documents[job.id];
|
|
189
|
+
}
|
|
190
|
+
state.skipped = state.skipped.filter((item) => item.id !== job.id);
|
|
191
|
+
state.skipped.push(skipped);
|
|
192
|
+
result.skipped.push({ id: skipped.id, reason: skipped.reason });
|
|
193
|
+
pending.jobs = pending.jobs.filter((item) => item !== job);
|
|
194
|
+
progress();
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
result.errors.push({ id: job.id, code: safe.code, message: safe.message });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
flush();
|
|
201
|
+
result.pending = pending.jobs.length;
|
|
202
|
+
if (!pending.jobs.length) {
|
|
203
|
+
state.cursor = pending.cursor;
|
|
204
|
+
state.scope = pending.scope;
|
|
205
|
+
state.folders = pending.folders;
|
|
206
|
+
delete state.pending;
|
|
207
|
+
state.lastSync = new Date(now()).toISOString();
|
|
208
|
+
statePort.save(state);
|
|
209
|
+
}
|
|
210
|
+
return result;
|
|
211
|
+
}
|
|
212
|
+
finally {
|
|
213
|
+
flush?.();
|
|
214
|
+
await writer?.close();
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/services/documents/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { type TaskCategory } from "../domain/task-categories.js";
|
|
2
|
-
export { DEFAULT_TASK_CATEGORIES, FALLBACK_CATEGORY, parseTaskCategory, type TaskCategory, withTaskCategory, } from "../domain/task-categories.js";
|
|
2
|
+
export { DEFAULT_TASK_CATEGORIES, FALLBACK_CATEGORY, parseTaskCategory, type TaskCategory, type UnlistedCategory, unlistedNote, withTaskCategory, } from "../domain/task-categories.js";
|
|
3
3
|
/** A category the list holds, or a refusal that names the list. */
|
|
4
4
|
export declare const taskCategoryOf: (categories?: readonly TaskCategory[], flag?: string) => (typed: string) => string;
|
|
5
|
-
/**
|
|
5
|
+
/**
|
|
6
|
+
* The category with the most distinct trigger stems in the text; none is `other`, a tie goes to the earlier one.
|
|
7
|
+
* A word hits by its English stem first, so a cognate (`hospital`) counts once, not twice.
|
|
8
|
+
*/
|
|
6
9
|
export declare const categorize: (text: string, categories?: readonly TaskCategory[]) => string;
|
|
7
10
|
//# sourceMappingURL=task-categories.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-categories.d.ts","sourceRoot":"","sources":["../../src/services/task-categories.ts"],"names":[],"mappings":"AACA,OAAO,EAA8C,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAG5G,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,YAAY,EACjB,gBAAgB,GACjB,MAAM,8BAA8B,CAAA;AAIrC,mEAAmE;AACnE,eAAO,MAAM,cAAc,gBACZ,SAAS,YAAY,EAAE,4BAC5B,MAAM,KAAG,MAQhB,CAAA;
|
|
1
|
+
{"version":3,"file":"task-categories.d.ts","sourceRoot":"","sources":["../../src/services/task-categories.ts"],"names":[],"mappings":"AACA,OAAO,EAA8C,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAG5G,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,YAAY,EACZ,gBAAgB,GACjB,MAAM,8BAA8B,CAAA;AAIrC,mEAAmE;AACnE,eAAO,MAAM,cAAc,gBACZ,SAAS,YAAY,EAAE,4BAC5B,MAAM,KAAG,MAQhB,CAAA;AAoCH;;;GAGG;AACH,eAAO,MAAM,UAAU,SAAU,MAAM,eAAc,SAAS,YAAY,EAAE,KAA6B,MAexG,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CliError, singleLine } from "@wirecat/cli-base";
|
|
2
2
|
import { DEFAULT_TASK_CATEGORIES, FALLBACK_CATEGORY } from "../domain/task-categories.js";
|
|
3
3
|
import { createStemmer } from "../search/stem.js";
|
|
4
|
-
export { DEFAULT_TASK_CATEGORIES, FALLBACK_CATEGORY, parseTaskCategory, withTaskCategory, } from "../domain/task-categories.js";
|
|
4
|
+
export { DEFAULT_TASK_CATEGORIES, FALLBACK_CATEGORY, parseTaskCategory, unlistedNote, withTaskCategory, } from "../domain/task-categories.js";
|
|
5
5
|
const names = (categories) => categories.map(({ name }) => name).join(", ");
|
|
6
6
|
/** A category the list holds, or a refusal that names the list. */
|
|
7
7
|
export const taskCategoryOf = (categories = DEFAULT_TASK_CATEGORIES, flag = "--category") => (typed) => {
|
|
@@ -10,31 +10,54 @@ export const taskCategoryOf = (categories = DEFAULT_TASK_CATEGORIES, flag = "--c
|
|
|
10
10
|
return name;
|
|
11
11
|
throw new CliError("validation_error", `${flag} takes ${names(categories)} — not "${singleLine(typed)}"; tasks categories says what each means`, { reason: "task.category-unknown" });
|
|
12
12
|
};
|
|
13
|
-
|
|
13
|
+
/**
|
|
14
|
+
* A Latin word may be English or Spanish. Every trigger meets the message's English stems, as it always has; Spanish
|
|
15
|
+
* triggers also meet its Spanish stems, but only in a message that reads as Spanish: Spanish stems are short and
|
|
16
|
+
* English words land on them (`page` → `pag`, the stem of `pagar`).
|
|
17
|
+
*/
|
|
18
|
+
let stemmers;
|
|
19
|
+
const stemmersOf = () => (stemmers ??= {
|
|
20
|
+
english: createStemmer({ cyrillic: "russian", latin: "english" }),
|
|
21
|
+
spanish: createStemmer({ cyrillic: "russian", latin: "spanish" }),
|
|
22
|
+
});
|
|
23
|
+
const SPANISH_LETTERS = /[ñáéíóú¿¡]/u;
|
|
24
|
+
const SPANISH_WORDS = new Set("de del la las el los que por para una unos unas hay tengo hola gracias".split(" "));
|
|
25
|
+
const readsSpanish = (text) => SPANISH_LETTERS.test(text.toLowerCase()) ||
|
|
26
|
+
(text.toLowerCase().match(/\p{L}+/gu) ?? []).some((word) => SPANISH_WORDS.has(word));
|
|
14
27
|
const stemsByList = new WeakMap();
|
|
15
|
-
const triggerStems = (categories
|
|
28
|
+
const triggerStems = (categories) => {
|
|
16
29
|
const known = stemsByList.get(categories);
|
|
17
30
|
if (known)
|
|
18
31
|
return known;
|
|
32
|
+
const { english, spanish } = stemmersOf();
|
|
19
33
|
const built = categories.map(({ name, triggers }) => ({
|
|
20
34
|
name,
|
|
21
|
-
|
|
35
|
+
english: new Set(Object.values(triggers).flatMap((words) => words.flatMap((word) => english.stemTokens(word)))),
|
|
36
|
+
spanish: new Set(triggers.es.flatMap((word) => spanish.stemTokens(word))),
|
|
22
37
|
}));
|
|
23
38
|
stemsByList.set(categories, built);
|
|
24
39
|
return built;
|
|
25
40
|
};
|
|
26
|
-
/**
|
|
41
|
+
/**
|
|
42
|
+
* The category with the most distinct trigger stems in the text; none is `other`, a tie goes to the earlier one.
|
|
43
|
+
* A word hits by its English stem first, so a cognate (`hospital`) counts once, not twice.
|
|
44
|
+
*/
|
|
27
45
|
export const categorize = (text, categories = DEFAULT_TASK_CATEGORIES) => {
|
|
28
|
-
|
|
29
|
-
const
|
|
46
|
+
const stem = stemmersOf();
|
|
47
|
+
const english = stem.english.stemTokens(text);
|
|
48
|
+
const spanish = readsSpanish(text) ? stem.spanish.stemTokens(text) : [];
|
|
30
49
|
let best = { name: FALLBACK_CATEGORY, hits: 0 };
|
|
31
|
-
for (const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
50
|
+
for (const triggers of triggerStems(categories)) {
|
|
51
|
+
const hit = new Set();
|
|
52
|
+
english.forEach((word, at) => {
|
|
53
|
+
const other = spanish[at];
|
|
54
|
+
if (triggers.english.has(word))
|
|
55
|
+
hit.add(word);
|
|
56
|
+
else if (other !== undefined && triggers.spanish.has(other))
|
|
57
|
+
hit.add(other);
|
|
58
|
+
});
|
|
59
|
+
if (hit.size > best.hits)
|
|
60
|
+
best = { name: triggers.name, hits: hit.size };
|
|
38
61
|
}
|
|
39
62
|
return best.name;
|
|
40
63
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-categories.js","sourceRoot":"","sources":["../../src/services/task-categories.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAqB,MAAM,8BAA8B,CAAA;AAC5G,OAAO,EAAE,aAAa,EAAgB,MAAM,mBAAmB,CAAA;AAE/D,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"task-categories.js","sourceRoot":"","sources":["../../src/services/task-categories.ts"],"names":[],"mappings":"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"}
|
package/dist/services/tasks.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { type QueryAst } from "@wirecat/cli-base/query";
|
|
2
2
|
import type * as v from "valibot";
|
|
3
3
|
import { task as taskEntity } from "../entities/task.js";
|
|
4
|
-
import { type SimilarTask, type TaskDraft, type TaskPair, type TaskRelation } from "../store/index.js";
|
|
4
|
+
import { type CloseSuggestion, type SimilarTask, type TaskDraft, type TaskPair, type TaskPairSide, type TaskRelation } from "../store/index.js";
|
|
5
5
|
import type { AccountKey, MessageStore, TaskDetails, ThingLink } from "../store/store.js";
|
|
6
6
|
import { type ClosedState, type GroupStats, TASK_KINDS, TASK_STATES, type Task, type TaskKind, type TaskOrigin } from "../tasks/index.js";
|
|
7
7
|
import type { ServiceDeps } from "./deps.js";
|
|
8
|
-
import { type TaskCategory } from "./task-categories.js";
|
|
8
|
+
import { type TaskCategory, type UnlistedCategory } from "./task-categories.js";
|
|
9
9
|
export { TASK_KINDS, TASK_STATES };
|
|
10
10
|
/** Source previews are read on demand; task records never retain source text. */
|
|
11
11
|
export interface TaskView extends Task {
|
|
@@ -84,6 +84,19 @@ export interface DuplicateChoice {
|
|
|
84
84
|
/** How many candidates a refused `tasks add` lists. */
|
|
85
85
|
export declare const REFUSAL_CANDIDATES = 5;
|
|
86
86
|
export type DuplicateCandidate = Pick<SimilarTask, "ref" | "key" | "title" | "status" | "score" | "band" | "reasons">;
|
|
87
|
+
export interface CloseRequest {
|
|
88
|
+
as?: ClosedState;
|
|
89
|
+
reason?: string;
|
|
90
|
+
by: TaskOrigin;
|
|
91
|
+
/** The agent's name, recorded with its suggestion. */
|
|
92
|
+
agent?: string;
|
|
93
|
+
/** 0–1: how sure the agent is that the task needs nothing more. */
|
|
94
|
+
certainty?: number;
|
|
95
|
+
}
|
|
96
|
+
export interface ClosedTask extends TaskView {
|
|
97
|
+
closeCertainty: number | null;
|
|
98
|
+
closeSuggestion: CloseSuggestion | null;
|
|
99
|
+
}
|
|
87
100
|
export interface TaskCard extends TaskDetails {
|
|
88
101
|
links: ThingLink[];
|
|
89
102
|
}
|
|
@@ -98,13 +111,17 @@ export interface TasksService {
|
|
|
98
111
|
limit?: number;
|
|
99
112
|
}): Promise<SimilarTask[]>;
|
|
100
113
|
/**
|
|
101
|
-
* Refused (`task.duplicate-candidates`, with the candidates) while an open
|
|
102
|
-
*
|
|
114
|
+
* Refused (`task.duplicate-candidates`, with the candidates) while an open task is likely or maybe the same job,
|
|
115
|
+
* unless `choice` says to attach the message to one of them or to open the task anyway. A task opened while one
|
|
116
|
+
* closed in the last 14 days is likely or maybe the same job follows it up (`followUpOf`); that one stays closed.
|
|
103
117
|
*/
|
|
104
118
|
add(message: string, type: TaskKind, origin: TaskOrigin, plan?: TaskPlan, choice?: DuplicateChoice): Promise<{
|
|
105
119
|
task: TaskView;
|
|
106
120
|
created: boolean;
|
|
107
121
|
attached?: boolean;
|
|
122
|
+
review?: number;
|
|
123
|
+
/** The task closed in the last 14 days this one follows up; it stays closed. */
|
|
124
|
+
followUpOf?: TaskPairSide;
|
|
108
125
|
card?: TaskCard;
|
|
109
126
|
}>;
|
|
110
127
|
/** Pairs a rule left for review — or, with `unsure`, the ones the reviewing agent passed to the owner — newest first. */
|
|
@@ -119,17 +136,20 @@ export interface TasksService {
|
|
|
119
136
|
merge(dup: string, into: string, by: TaskOrigin): Promise<{
|
|
120
137
|
pair: TaskPair;
|
|
121
138
|
linked: number;
|
|
139
|
+
review: number;
|
|
122
140
|
task: TaskCard;
|
|
123
141
|
}>;
|
|
124
142
|
unmerge(dup: string, by: TaskOrigin): Promise<{
|
|
125
143
|
pair: TaskPair;
|
|
126
144
|
task: TaskCard;
|
|
127
145
|
}>;
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
146
|
+
/**
|
|
147
|
+
* An agent states its `certainty`; below the store's threshold, or while agent closes are off, the task stays open
|
|
148
|
+
* with the close waiting on the owner. The owner always closes; `as` left out takes the agent's suggestion.
|
|
149
|
+
*/
|
|
150
|
+
close(id: string, options: CloseRequest): Promise<ClosedTask>;
|
|
151
|
+
/** The owner refuses an agent's close: the task stays open and the suggestion goes. */
|
|
152
|
+
reject(id: string, by: TaskOrigin): Promise<TaskCard>;
|
|
133
153
|
stats(filter?: {
|
|
134
154
|
chat?: string;
|
|
135
155
|
type?: TaskKind;
|
|
@@ -138,7 +158,8 @@ export interface TasksService {
|
|
|
138
158
|
plan(id: string, plan: TaskPlan, by: TaskOrigin): Promise<TaskCard>;
|
|
139
159
|
/**
|
|
140
160
|
* Links a task to stored things (`msg:`, `chat:`, `person:`, `document:`…) or, for what the store does
|
|
141
|
-
* not hold, to the text as written — a URL, a message not saved yet.
|
|
161
|
+
* not hold, to the text as written — a URL, a message not saved yet. After a `msg:` target, `review` counts the
|
|
162
|
+
* pairs the duplicate check sent to `tasks duplicates`.
|
|
142
163
|
*/
|
|
143
164
|
link(id: string, targets: {
|
|
144
165
|
references?: readonly string[];
|
|
@@ -146,12 +167,16 @@ export interface TasksService {
|
|
|
146
167
|
}, options: {
|
|
147
168
|
kind: TaskLinkOptionKind;
|
|
148
169
|
by: TaskOrigin;
|
|
149
|
-
}): Promise<TaskCard
|
|
170
|
+
}): Promise<(TaskCard & {
|
|
171
|
+
review?: number;
|
|
172
|
+
}) | {
|
|
150
173
|
relations: TaskRelation[];
|
|
151
174
|
}>;
|
|
152
175
|
show(id: string): Promise<TaskCard>;
|
|
153
176
|
/** The list a task's category comes from, with what each one means. */
|
|
154
177
|
categories(): Promise<readonly TaskCategory[]>;
|
|
178
|
+
/** Categories tasks still carry that the list no longer holds, across the store, with open and total counts. */
|
|
179
|
+
unlistedCategories(): Promise<UnlistedCategory[]>;
|
|
155
180
|
/** Takes an open task for `holder` for `forMs`; refused, naming the holder, while someone else holds it. */
|
|
156
181
|
claim(id: string, holder: string, forMs: number): Promise<TaskCard>;
|
|
157
182
|
/** Gives a task back; only its holder or the owner may. */
|
|
@@ -168,10 +193,11 @@ export declare const taskTypesOf: (typed: string) => TaskKind[];
|
|
|
168
193
|
/** `categories` fixes the list; left out, each call reads the store's (`config set task_categories.*`). */
|
|
169
194
|
export declare const tasksService: (deps: ServiceDeps, categories?: readonly TaskCategory[]) => TasksService;
|
|
170
195
|
/** A stored task as the `task` entity: its chat as a `chat:` reference, its times in ISO 8601. */
|
|
171
|
-
export declare const taskItem: (account: AccountKey, { task, title, updatedAt }: {
|
|
196
|
+
export declare const taskItem: (account: AccountKey, { task, title, updatedAt, closeSuggestion, }: {
|
|
172
197
|
task: Task;
|
|
173
198
|
title: string;
|
|
174
199
|
updatedAt: Date;
|
|
200
|
+
closeSuggestion?: CloseSuggestion | null;
|
|
175
201
|
}) => TaskItem;
|
|
176
202
|
export declare const taskView: (store: MessageStore, account: AccountKey, task: Task) => Promise<TaskView>;
|
|
177
203
|
//# sourceMappingURL=tasks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/services/tasks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,QAAQ,EAAgD,MAAM,yBAAyB,CAAA;AACrG,OAAO,KAAK,KAAK,CAAC,MAAM,SAAS,CAAA;AAGjC,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,YAAY,EAElB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAEzF,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,UAAU,EACf,UAAU,EACV,WAAW,EACX,KAAK,IAAI,EACT,KAAK,QAAQ,EACb,KAAK,UAAU,EAChB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAE5C,OAAO,EAAc,KAAK,YAAY,EAAkB,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/services/tasks.ts"],"names":[],"mappings":"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"}
|