@shivaedev/work-board 0.9.1 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +29 -0
- package/README.md +49 -1
- package/assets/native.js +35 -29
- package/dist/board.d.ts.map +1 -1
- package/dist/board.js +20 -1
- package/dist/board.js.map +1 -1
- package/dist/browser/client.d.ts +2 -0
- package/dist/browser/client.d.ts.map +1 -1
- package/dist/browser/client.js +2 -1
- package/dist/browser/client.js.map +1 -1
- package/dist/browser/entry.d.ts.map +1 -1
- package/dist/browser/entry.js +2 -0
- package/dist/browser/entry.js.map +1 -1
- package/dist/browser/handoffs/copy.d.ts +3 -0
- package/dist/browser/handoffs/copy.d.ts.map +1 -0
- package/dist/browser/handoffs/copy.js +47 -0
- package/dist/browser/handoffs/copy.js.map +1 -0
- package/dist/browser/handoffs/fields.d.ts +11 -0
- package/dist/browser/handoffs/fields.d.ts.map +1 -0
- package/dist/browser/handoffs/fields.js +45 -0
- package/dist/browser/handoffs/fields.js.map +1 -0
- package/dist/browser/handoffs/schema.d.ts +89 -0
- package/dist/browser/handoffs/schema.d.ts.map +1 -0
- package/dist/browser/handoffs/schema.js +38 -0
- package/dist/browser/handoffs/schema.js.map +1 -0
- package/dist/browser/handoffs/setup.d.ts +2 -0
- package/dist/browser/handoffs/setup.d.ts.map +1 -0
- package/dist/browser/handoffs/setup.js +108 -0
- package/dist/browser/handoffs/setup.js.map +1 -0
- package/dist/browser/responses/draftSession.d.ts +1 -1
- package/dist/browser/responses/draftSession.d.ts.map +1 -1
- package/dist/browser/responses/draftSession.js +4 -4
- package/dist/browser/responses/draftSession.js.map +1 -1
- package/dist/browser/responses/preview.js.map +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/files/list.d.ts.map +1 -1
- package/dist/handoffs/html.d.ts +37 -0
- package/dist/handoffs/html.d.ts.map +1 -0
- package/dist/handoffs/html.js +31 -0
- package/dist/handoffs/html.js.map +1 -0
- package/dist/handoffs/page.d.ts +7 -0
- package/dist/handoffs/page.d.ts.map +1 -0
- package/dist/handoffs/page.js +31 -0
- package/dist/handoffs/page.js.map +1 -0
- package/dist/handoffs/records.d.ts +7 -0
- package/dist/handoffs/records.d.ts.map +1 -0
- package/dist/handoffs/records.js +30 -0
- package/dist/handoffs/records.js.map +1 -0
- package/dist/handoffs/service.d.ts +55 -0
- package/dist/handoffs/service.d.ts.map +1 -0
- package/dist/handoffs/service.js +82 -0
- package/dist/handoffs/service.js.map +1 -0
- package/dist/handoffs/source.d.ts +11 -0
- package/dist/handoffs/source.d.ts.map +1 -0
- package/dist/handoffs/source.js +31 -0
- package/dist/handoffs/source.js.map +1 -0
- package/dist/http/assets.d.ts.map +1 -1
- package/dist/http/assets.js.map +1 -1
- package/dist/http/events.d.ts.map +1 -1
- package/dist/http/loopback.d.ts.map +1 -1
- package/dist/http/page.d.ts.map +1 -1
- package/dist/http/respond.d.ts.map +1 -1
- package/dist/metadata/backlinks.d.ts.map +1 -1
- package/dist/metadata/backlinks.js +1 -0
- package/dist/metadata/backlinks.js.map +1 -1
- package/dist/metadata/fields.d.ts +14 -1
- package/dist/metadata/fields.d.ts.map +1 -1
- package/dist/metadata/model.js.map +1 -1
- package/dist/metadata/problems.d.ts.map +1 -1
- package/dist/metadata/problems.js +1 -0
- package/dist/metadata/problems.js.map +1 -1
- package/dist/metadata/schema.d.ts +18 -1
- package/dist/metadata/schema.d.ts.map +1 -1
- package/dist/metadata/schema.js +3 -1
- package/dist/metadata/schema.js.map +1 -1
- package/dist/page/escape.d.ts.map +1 -1
- package/dist/page/metadata.d.ts.map +1 -1
- package/dist/page/metadata.js +12 -4
- package/dist/page/metadata.js.map +1 -1
- package/dist/page/metadataDetails.d.ts.map +1 -1
- package/dist/page/metadataDetails.js +3 -0
- package/dist/page/metadataDetails.js.map +1 -1
- package/dist/page/nav.d.ts.map +1 -1
- package/dist/page/navigationScript.js +1 -1
- package/dist/page/shell.d.ts +1 -1
- package/dist/page/shell.d.ts.map +1 -1
- package/dist/page/shell.js.map +1 -1
- package/dist/page/startTemplates.d.ts +109 -3
- package/dist/page/startTemplates.d.ts.map +1 -1
- package/dist/page/startTemplates.js +20 -0
- package/dist/page/startTemplates.js.map +1 -1
- package/dist/page/style.d.ts.map +1 -1
- package/dist/page/style.js +6 -5
- package/dist/page/style.js.map +1 -1
- package/dist/page/swap.d.ts +1 -1
- package/dist/page/swap.d.ts.map +1 -1
- package/dist/page/swap.js +2 -2
- package/dist/page/updated.d.ts.map +1 -1
- package/dist/render/board.d.ts.map +1 -1
- package/dist/render/callouts.d.ts.map +1 -1
- package/dist/render/code.d.ts.map +1 -1
- package/dist/render/documentHeadings.d.ts.map +1 -1
- package/dist/render/documentLinks.d.ts.map +1 -1
- package/dist/render/footnotes.d.ts.map +1 -1
- package/dist/render/highlighter.d.ts.map +1 -1
- package/dist/render/highlighter.js.map +1 -1
- package/dist/render/markdown.js.map +1 -1
- package/dist/render/questionnaireDocuments.d.ts.map +1 -1
- package/dist/render/visualDocuments.d.ts.map +1 -1
- package/dist/responses/agent.d.ts +8 -8
- package/dist/responses/agent.js.map +1 -1
- package/dist/responses/flags.d.ts.map +1 -1
- package/dist/responses/outcome.d.ts.map +1 -1
- package/dist/responses/publish.d.ts +1 -1
- package/dist/responses/publish.d.ts.map +1 -1
- package/dist/responses/publish.js +7 -7
- package/dist/responses/publish.js.map +1 -1
- package/dist/responses/publishIn.d.ts +1 -1
- package/dist/responses/publishIn.d.ts.map +1 -1
- package/dist/responses/publishIn.js +3 -3
- package/dist/responses/publishIn.js.map +1 -1
- package/dist/responses/waitFor.d.ts.map +1 -1
- package/dist/results/criteria.d.ts +3 -0
- package/dist/results/criteria.d.ts.map +1 -0
- package/dist/results/criteria.js +34 -0
- package/dist/results/criteria.js.map +1 -0
- package/dist/results/feedback.d.ts +7 -0
- package/dist/results/feedback.d.ts.map +1 -0
- package/dist/results/feedback.js +32 -0
- package/dist/results/feedback.js.map +1 -0
- package/dist/results/page.d.ts +7 -0
- package/dist/results/page.d.ts.map +1 -0
- package/dist/results/page.js +40 -0
- package/dist/results/page.js.map +1 -0
- package/dist/rpc/contract.d.ts +67 -1
- package/dist/rpc/contract.d.ts.map +1 -1
- package/dist/rpc/contract.js +3 -2
- package/dist/rpc/contract.js.map +1 -1
- package/dist/rpc/handoffContract.d.ts +142 -0
- package/dist/rpc/handoffContract.d.ts.map +1 -0
- package/dist/rpc/handoffContract.js +26 -0
- package/dist/rpc/handoffContract.js.map +1 -0
- package/dist/rpc/server.d.ts +2 -0
- package/dist/rpc/server.d.ts.map +1 -1
- package/dist/rpc/server.js +4 -1
- package/dist/rpc/server.js.map +1 -1
- package/dist/search/collector.d.ts.map +1 -1
- package/dist/search/entries.js.map +1 -1
- package/dist/search/linkCollector.d.ts.map +1 -1
- package/dist/serve-cli.js +2 -2
- package/dist/serve-cli.js.map +1 -1
- package/dist/serve.d.ts.map +1 -1
- package/dist/views/state.js.map +1 -1
- package/package.json +3 -3
- package/src/board.ts +20 -1
- package/src/browser/client.ts +3 -1
- package/src/browser/entry.ts +2 -0
- package/src/browser/handoffs/copy.ts +45 -0
- package/src/browser/handoffs/fields.ts +50 -0
- package/src/browser/handoffs/schema.ts +44 -0
- package/src/browser/handoffs/setup.ts +113 -0
- package/src/browser/responses/draftSession.ts +11 -4
- package/src/handoffs/html.ts +42 -0
- package/src/handoffs/page.ts +45 -0
- package/src/handoffs/records.ts +34 -0
- package/src/handoffs/service.ts +103 -0
- package/src/handoffs/source.ts +35 -0
- package/src/metadata/backlinks.ts +1 -0
- package/src/metadata/problems.ts +1 -0
- package/src/metadata/schema.ts +3 -1
- package/src/page/metadata.ts +14 -4
- package/src/page/metadataDetails.ts +3 -0
- package/src/page/navigationScript.ts +1 -1
- package/src/page/shell.ts +1 -1
- package/src/page/startTemplates.ts +20 -0
- package/src/page/style.ts +6 -5
- package/src/page/swap.ts +2 -2
- package/src/responses/publish.ts +7 -7
- package/src/responses/publishIn.ts +10 -3
- package/src/results/criteria.ts +37 -0
- package/src/results/feedback.ts +44 -0
- package/src/results/page.ts +58 -0
- package/src/rpc/contract.ts +5 -2
- package/src/rpc/handoffContract.ts +26 -0
- package/src/rpc/server.ts +6 -1
- package/src/serve-cli.ts +2 -2
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
import { ResponseFailed } from "#browser/responses/schema.ts";
|
|
3
|
+
export declare const handoffContract: import("@shivaedev/effect-contract/contract.ts").Contract<"work-board", readonly [import("@shivaedev/effect-contract/operation.ts").Query<"handoffSource", Schema.Struct<{
|
|
4
|
+
item: Schema.String;
|
|
5
|
+
}>, Schema.Struct<{
|
|
6
|
+
readonly context: Schema.String;
|
|
7
|
+
readonly id: Schema.String;
|
|
8
|
+
readonly item: Schema.String;
|
|
9
|
+
readonly reviewedRevision: Schema.String;
|
|
10
|
+
readonly source: Schema.String;
|
|
11
|
+
}>, {
|
|
12
|
+
readonly ResponseFailed: typeof ResponseFailed;
|
|
13
|
+
}>, import("@shivaedev/effect-contract/operation.ts").Query<"handoffs", Schema.Struct<{
|
|
14
|
+
item: Schema.String;
|
|
15
|
+
}>, Schema.Struct<{
|
|
16
|
+
readonly records: Schema.$Array<Schema.Struct<{
|
|
17
|
+
readonly context: Schema.String;
|
|
18
|
+
readonly file: Schema.String;
|
|
19
|
+
readonly handoff: Schema.encodeKeys<Schema.Struct<{
|
|
20
|
+
readonly by: Schema.optional<Schema.String>;
|
|
21
|
+
readonly constraints: Schema.String;
|
|
22
|
+
readonly goal: Schema.String;
|
|
23
|
+
readonly item: Schema.String;
|
|
24
|
+
readonly nextAction: Schema.String;
|
|
25
|
+
readonly note: Schema.optional<Schema.String>;
|
|
26
|
+
readonly preparedAt: Schema.Number;
|
|
27
|
+
readonly recipient: Schema.String;
|
|
28
|
+
readonly reviewedRevision: Schema.String;
|
|
29
|
+
readonly source: Schema.String;
|
|
30
|
+
readonly state: Schema.Literals<readonly ["requested", "acknowledged", "rejected", "unavailable"]>;
|
|
31
|
+
}>, {
|
|
32
|
+
readonly nextAction: "next_action";
|
|
33
|
+
readonly preparedAt: "prepared_at";
|
|
34
|
+
readonly reviewedRevision: "reviewed_revision";
|
|
35
|
+
}>;
|
|
36
|
+
readonly id: Schema.String;
|
|
37
|
+
readonly prompt: Schema.String;
|
|
38
|
+
}>>;
|
|
39
|
+
readonly unknown: Schema.$Array<Schema.String>;
|
|
40
|
+
}>, {
|
|
41
|
+
readonly ResponseFailed: typeof ResponseFailed;
|
|
42
|
+
}>], readonly [import("@shivaedev/effect-contract/operation.ts").Command<"prepareHandoff", Schema.Struct<{
|
|
43
|
+
readonly constraints: Schema.String;
|
|
44
|
+
readonly goal: Schema.String;
|
|
45
|
+
readonly id: Schema.String;
|
|
46
|
+
readonly item: Schema.String;
|
|
47
|
+
readonly nextAction: Schema.String;
|
|
48
|
+
readonly recipient: Schema.String;
|
|
49
|
+
readonly revision: Schema.String;
|
|
50
|
+
readonly source: Schema.String;
|
|
51
|
+
}>, Schema.Struct<{
|
|
52
|
+
readonly context: Schema.String;
|
|
53
|
+
readonly file: Schema.String;
|
|
54
|
+
readonly handoff: Schema.encodeKeys<Schema.Struct<{
|
|
55
|
+
readonly by: Schema.optional<Schema.String>;
|
|
56
|
+
readonly constraints: Schema.String;
|
|
57
|
+
readonly goal: Schema.String;
|
|
58
|
+
readonly item: Schema.String;
|
|
59
|
+
readonly nextAction: Schema.String;
|
|
60
|
+
readonly note: Schema.optional<Schema.String>;
|
|
61
|
+
readonly preparedAt: Schema.Number;
|
|
62
|
+
readonly recipient: Schema.String;
|
|
63
|
+
readonly reviewedRevision: Schema.String;
|
|
64
|
+
readonly source: Schema.String;
|
|
65
|
+
readonly state: Schema.Literals<readonly ["requested", "acknowledged", "rejected", "unavailable"]>;
|
|
66
|
+
}>, {
|
|
67
|
+
readonly nextAction: "next_action";
|
|
68
|
+
readonly preparedAt: "prepared_at";
|
|
69
|
+
readonly reviewedRevision: "reviewed_revision";
|
|
70
|
+
}>;
|
|
71
|
+
readonly id: Schema.String;
|
|
72
|
+
readonly prompt: Schema.String;
|
|
73
|
+
}>, {
|
|
74
|
+
readonly ResponseFailed: typeof ResponseFailed;
|
|
75
|
+
}>], import("effect/unstable/rpc/Rpc").Rpc<"work-board.prepareHandoff", Schema.Struct<{
|
|
76
|
+
readonly constraints: Schema.String;
|
|
77
|
+
readonly goal: Schema.String;
|
|
78
|
+
readonly id: Schema.String;
|
|
79
|
+
readonly item: Schema.String;
|
|
80
|
+
readonly nextAction: Schema.String;
|
|
81
|
+
readonly recipient: Schema.String;
|
|
82
|
+
readonly revision: Schema.String;
|
|
83
|
+
readonly source: Schema.String;
|
|
84
|
+
}>, Schema.Struct<{
|
|
85
|
+
readonly context: Schema.String;
|
|
86
|
+
readonly file: Schema.String;
|
|
87
|
+
readonly handoff: Schema.encodeKeys<Schema.Struct<{
|
|
88
|
+
readonly by: Schema.optional<Schema.String>;
|
|
89
|
+
readonly constraints: Schema.String;
|
|
90
|
+
readonly goal: Schema.String;
|
|
91
|
+
readonly item: Schema.String;
|
|
92
|
+
readonly nextAction: Schema.String;
|
|
93
|
+
readonly note: Schema.optional<Schema.String>;
|
|
94
|
+
readonly preparedAt: Schema.Number;
|
|
95
|
+
readonly recipient: Schema.String;
|
|
96
|
+
readonly reviewedRevision: Schema.String;
|
|
97
|
+
readonly source: Schema.String;
|
|
98
|
+
readonly state: Schema.Literals<readonly ["requested", "acknowledged", "rejected", "unavailable"]>;
|
|
99
|
+
}>, {
|
|
100
|
+
readonly nextAction: "next_action";
|
|
101
|
+
readonly preparedAt: "prepared_at";
|
|
102
|
+
readonly reviewedRevision: "reviewed_revision";
|
|
103
|
+
}>;
|
|
104
|
+
readonly id: Schema.String;
|
|
105
|
+
readonly prompt: Schema.String;
|
|
106
|
+
}>, Schema.Union<readonly (typeof ResponseFailed)[]>, never, never> | import("effect/unstable/rpc/Rpc").Rpc<"work-board.handoffSource", Schema.Struct<{
|
|
107
|
+
item: Schema.String;
|
|
108
|
+
}>, Schema.Struct<{
|
|
109
|
+
readonly context: Schema.String;
|
|
110
|
+
readonly id: Schema.String;
|
|
111
|
+
readonly item: Schema.String;
|
|
112
|
+
readonly reviewedRevision: Schema.String;
|
|
113
|
+
readonly source: Schema.String;
|
|
114
|
+
}>, Schema.Union<readonly (typeof ResponseFailed)[]>, never, never> | import("effect/unstable/rpc/Rpc").Rpc<"work-board.handoffs", Schema.Struct<{
|
|
115
|
+
item: Schema.String;
|
|
116
|
+
}>, Schema.Struct<{
|
|
117
|
+
readonly records: Schema.$Array<Schema.Struct<{
|
|
118
|
+
readonly context: Schema.String;
|
|
119
|
+
readonly file: Schema.String;
|
|
120
|
+
readonly handoff: Schema.encodeKeys<Schema.Struct<{
|
|
121
|
+
readonly by: Schema.optional<Schema.String>;
|
|
122
|
+
readonly constraints: Schema.String;
|
|
123
|
+
readonly goal: Schema.String;
|
|
124
|
+
readonly item: Schema.String;
|
|
125
|
+
readonly nextAction: Schema.String;
|
|
126
|
+
readonly note: Schema.optional<Schema.String>;
|
|
127
|
+
readonly preparedAt: Schema.Number;
|
|
128
|
+
readonly recipient: Schema.String;
|
|
129
|
+
readonly reviewedRevision: Schema.String;
|
|
130
|
+
readonly source: Schema.String;
|
|
131
|
+
readonly state: Schema.Literals<readonly ["requested", "acknowledged", "rejected", "unavailable"]>;
|
|
132
|
+
}>, {
|
|
133
|
+
readonly nextAction: "next_action";
|
|
134
|
+
readonly preparedAt: "prepared_at";
|
|
135
|
+
readonly reviewedRevision: "reviewed_revision";
|
|
136
|
+
}>;
|
|
137
|
+
readonly id: Schema.String;
|
|
138
|
+
readonly prompt: Schema.String;
|
|
139
|
+
}>>;
|
|
140
|
+
readonly unknown: Schema.$Array<Schema.String>;
|
|
141
|
+
}>, Schema.Union<readonly (typeof ResponseFailed)[]>, never, never>>;
|
|
142
|
+
//# sourceMappingURL=handoffContract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoffContract.d.ts","sourceRoot":"","sources":["../../src/rpc/handoffContract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAIhC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAqB9D,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oEAA2E,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
import { contract } from "@shivaedev/effect-contract/contract.ts";
|
|
3
|
+
import { command, query } from "@shivaedev/effect-contract/operation.ts";
|
|
4
|
+
import { Handoff, HandoffInput, HandoffPreview, HandoffReading } from "#browser/handoffs/schema.ts";
|
|
5
|
+
import { ResponseFailed } from "#browser/responses/schema.ts";
|
|
6
|
+
import { index, workspace } from "#rpc/keys.ts";
|
|
7
|
+
const locate = query("handoffSource", {
|
|
8
|
+
payload: { item: Schema.String },
|
|
9
|
+
reads: () => [workspace.list, index.list],
|
|
10
|
+
rejections: { ResponseFailed },
|
|
11
|
+
success: HandoffPreview,
|
|
12
|
+
});
|
|
13
|
+
const read = query("handoffs", {
|
|
14
|
+
payload: { item: Schema.String },
|
|
15
|
+
reads: () => [workspace.list, index.list],
|
|
16
|
+
rejections: { ResponseFailed },
|
|
17
|
+
success: HandoffReading,
|
|
18
|
+
});
|
|
19
|
+
const prepare = command("prepareHandoff", {
|
|
20
|
+
invalidates: () => [workspace.list, index.list],
|
|
21
|
+
payload: HandoffInput,
|
|
22
|
+
rejections: { ResponseFailed },
|
|
23
|
+
success: Handoff,
|
|
24
|
+
});
|
|
25
|
+
export const handoffContract = contract("work-board", { commands: [prepare], queries: [locate, read] });
|
|
26
|
+
//# sourceMappingURL=handoffContract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handoffContract.js","sourceRoot":"","sources":["../../src/rpc/handoffContract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AACpG,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,MAAM,GAAG,KAAK,CAAC,eAAe,EAAE;IACrC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;IAChC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;IACzC,UAAU,EAAE,EAAE,cAAc,EAAE;IAC9B,OAAO,EAAE,cAAc;CACvB,CAAC,CAAC;AACH,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,EAAE;IAC9B,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE;IAChC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;IACzC,UAAU,EAAE,EAAE,cAAc,EAAE;IAC9B,OAAO,EAAE,cAAc;CACvB,CAAC,CAAC;AACH,MAAM,OAAO,GAAG,OAAO,CAAC,gBAAgB,EAAE;IACzC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;IAC/C,OAAO,EAAE,YAAY;IACrB,UAAU,EAAE,EAAE,cAAc,EAAE;IAC9B,OAAO,EAAE,OAAO;CAChB,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC"}
|
package/dist/rpc/server.d.ts
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
2
|
import { HttpServerResponse } from "effect/unstable/http";
|
|
3
3
|
import type { Changes } from "#files/changes.ts";
|
|
4
|
+
import type { handoffService } from "#handoffs/service.ts";
|
|
4
5
|
import type { responseService } from "#responses/service.ts";
|
|
5
6
|
import type { Snapshot } from "#search/snapshot.ts";
|
|
6
7
|
export interface ServerOptions {
|
|
7
8
|
readonly changes: Changes;
|
|
9
|
+
readonly handoffs: Effect.Success<ReturnType<typeof handoffService>>;
|
|
8
10
|
readonly home: string | undefined;
|
|
9
11
|
readonly index: Effect.Effect<Snapshot, unknown>;
|
|
10
12
|
readonly page: (url: string) => Effect.Effect<HttpServerResponse.HttpServerResponse, unknown>;
|
package/dist/rpc/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/rpc/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAc,MAAM,QAAQ,CAAC;AACnD,OAAO,EAAuB,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/rpc/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAc,MAAM,QAAQ,CAAC;AACnD,OAAO,EAAuB,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAK3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAIpD,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC;IACrE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC9F,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC;CACvE;AAED,eAAO,MAAM,MAAM,qTA0CjB,CAAC"}
|
package/dist/rpc/server.js
CHANGED
|
@@ -8,9 +8,11 @@ import { navHtml } from "#page/nav.ts";
|
|
|
8
8
|
import { searchMatch } from "#search/match.ts";
|
|
9
9
|
import { ReadFailed, workRpcs } from "./contract.js";
|
|
10
10
|
import { hints } from "./hints.js";
|
|
11
|
-
export const server = Effect.fn("WorkBoard.server")(function* ({ changes, home, index, page, responses }) {
|
|
11
|
+
export const server = Effect.fn("WorkBoard.server")(function* ({ changes, handoffs, home, index, page, responses }) {
|
|
12
12
|
const handlers = workRpcs.toLayer({
|
|
13
13
|
"work-board.awaitResponse": responses.awaitResponse,
|
|
14
|
+
"work-board.handoffSource": ({ item }) => handoffs.locate(item),
|
|
15
|
+
"work-board.handoffs": ({ item }) => handoffs.read(item),
|
|
14
16
|
"work-board.history": ({ action, baseline }) => Effect.gen(function* () {
|
|
15
17
|
const now = yield* Clock.currentTimeMillis;
|
|
16
18
|
const snapshot = action === "check" ? undefined : yield* index;
|
|
@@ -23,6 +25,7 @@ export const server = Effect.fn("WorkBoard.server")(function* ({ changes, home,
|
|
|
23
25
|
}
|
|
24
26
|
return Effect.succeed({ html: new TextDecoder().decode(response.body.body), status: response.status });
|
|
25
27
|
}), Effect.catch((error) => Effect.fail(error instanceof ReadFailed ? error : new ReadFailed({ operation: "page", status: 500 })))),
|
|
28
|
+
"work-board.prepareHandoff": handoffs.prepare,
|
|
26
29
|
"work-board.question": ({ item, request }) => responses.locate(item, request),
|
|
27
30
|
"work-board.recordResponse": responses.record,
|
|
28
31
|
"work-board.registerQuestion": responses.register,
|
package/dist/rpc/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/rpc/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/rpc/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/search/collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AAI1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAS1C,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,MAAM;;
|
|
1
|
+
{"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/search/collector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAC;AAI1C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAS1C,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,MAAM;;yBAwBrE,IAAI;EASrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entries.js","sourceRoot":"","sources":["../../src/search/entries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,eAAe,MAAM,kBAAkB,CAAC;AAC/C,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAWnD,SAAS,gBAAgB,CAAC,MAAc,EAAE,QAAgB,EAAE,QAAgB,EAAE,IAAyB;IACtG,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAChE,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc,EAAE,IAAY,EAAE,IAAa,EAAE,QAAQ,GAAG,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"entries.js","sourceRoot":"","sources":["../../src/search/entries.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linkCollector.d.ts","sourceRoot":"","sources":["../../src/search/linkCollector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"linkCollector.d.ts","sourceRoot":"","sources":["../../src/search/linkCollector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,gBAC3B,IAAI,UAWxB"}
|
package/dist/serve-cli.js
CHANGED
|
@@ -3,7 +3,7 @@ import { NodeRuntime, NodeServices } from "@effect/platform-node";
|
|
|
3
3
|
import { Effect, Layer, Option, Path } from "effect";
|
|
4
4
|
import { Argument, Command, Flag } from "effect/unstable/cli";
|
|
5
5
|
import { HOST, serveBoard } from "./serve.js";
|
|
6
|
-
const VERSION = "0.
|
|
6
|
+
const VERSION = "0.11.0";
|
|
7
7
|
const serve = Effect.fn("WorkBoard.serve")(function* (input) {
|
|
8
8
|
const path = yield* Path.Path;
|
|
9
9
|
return yield* Layer.launch(serveBoard({ home: Option.getOrUndefined(input.home), port: input.port, responses: input.responses, root: path.resolve(input.dir) }));
|
|
@@ -12,7 +12,7 @@ const workBoard = Command.make("work-board", {
|
|
|
12
12
|
dir: Argument.directory("dir", { mustExist: true }).pipe(Argument.withDescription("The folder of markdown files to serve")),
|
|
13
13
|
home: Flag.string("home").pipe(Flag.optional, Flag.withDescription("The file shown as a board at /, relative to the folder")),
|
|
14
14
|
port: Flag.integer("port").pipe(Flag.withDefault(4747), Flag.withDescription(`The port to listen on at ${HOST}`)),
|
|
15
|
-
responses: Flag.boolean("responses").pipe(Flag.withDefault(false), Flag.withDescription("Explicitly enable local durable question and
|
|
15
|
+
responses: Flag.boolean("responses").pipe(Flag.withDefault(false), Flag.withDescription("Explicitly enable local durable question, response and handoff writes (Linux)")),
|
|
16
16
|
}, serve).pipe(Command.withDescription("Serve a folder of markdown files as a live page that updates in place when a file changes."));
|
|
17
17
|
export function runServe() {
|
|
18
18
|
Command.run(workBoard, { version: VERSION }).pipe(Effect.provide(NodeServices.layer), NodeRuntime.runMain);
|
package/dist/serve-cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve-cli.js","sourceRoot":"","sources":["../src/serve-cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,OAAO,GAAG,
|
|
1
|
+
{"version":3,"file":"serve-cli.js","sourceRoot":"","sources":["../src/serve-cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,OAAO,GAAG,QAAQ,CAAC;AAEzB,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,EAAE,KAKrD;IACA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B,OAAO,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM,CACzB,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CACpI,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAC7B,YAAY,EACZ;IACC,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,uCAAuC,CAAC,CAAC;IAC3H,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,wDAAwD,CAAC,CAAC;IAC7H,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;IACjH,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CACxC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EACvB,IAAI,CAAC,eAAe,CAAC,+EAA+E,CAAC,CACrG;CACD,EACD,KAAK,CACL,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,4FAA4F,CAAC,CAAC,CAAC;AAE9H,MAAM,UAAU,QAAQ;IACvB,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;AAC5G,CAAC"}
|
package/dist/serve.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/B,OAAO,EAAE,KAAK,YAAY,EAAc,MAAM,YAAY,CAAC;AAE3D,eAAO,MAAM,IAAI,cAAc,CAAC;AAEhC,MAAM,WAAW,YAAa,SAAQ,YAAY;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/B,OAAO,EAAE,KAAK,YAAY,EAAc,MAAM,YAAY,CAAC;AAE3D,eAAO,MAAM,IAAI,cAAc,CAAC;AAEhC,MAAM,WAAW,YAAa,SAAQ,YAAY;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,QAAQ,SAAU,MAAM,+SAA8F,CAAC;AAEpI,eAAO,MAAM,UAAU,YAAa,YAAY,geACgE,CAAC"}
|
package/dist/views/state.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/views/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAExC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AACjD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC3D,MAAM,CAAC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,KAAK,EAAE,MAAM,CAAC,MAAM;IACpB,IAAI,EAAE,IAAI;IACV,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,IAAI,EAAE,IAAI;CACV,CAAC,CAAC;AAGH,MAAM,UAAU,OAAO,CAAC,GAAW;IAClC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,YAAY,CAAC;IAC7D,OAAO;QACN,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;QAChC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;QAC9B,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;QAChC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QAC5C,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC;QAC3F,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE;QAClC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC;KAC3F,CAAC;AACH,CAAC;AACD,MAAM,UAAU,OAAO,CAAC,KAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/views/state.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shivaedev/work-board",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Serve a folder of markdown files as a live local page that updates in place when a file changes",
|
|
5
5
|
"homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/work-board#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"devDependencies": {
|
|
64
64
|
"@effect/platform-node": "4.0.0-rc.112",
|
|
65
65
|
"@effect/platform-node-shared": "4.0.0-rc.112",
|
|
66
|
-
"@shivaedev/quality": "0.
|
|
66
|
+
"@shivaedev/quality": "0.18.0",
|
|
67
67
|
"@types/hast": "3.0.5",
|
|
68
68
|
"@types/mdast": "4.0.4",
|
|
69
69
|
"@types/node": "24.10.1",
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
"provenance": true
|
|
90
90
|
},
|
|
91
91
|
"scripts": {
|
|
92
|
-
"build": "node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { force: true, recursive: true }))\" &&
|
|
92
|
+
"build": "node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { force: true, recursive: true }))\" && tsc --project tsconfig.build.json && pnpm build:browser",
|
|
93
93
|
"build:browser": "esbuild src/browser/entry.ts --bundle --platform=browser --format=esm --conditions=source --minify --outfile=assets/native.js && esbuild src/responses/agent-cli.ts --bundle --platform=node --format=esm --conditions=source --minify --outfile=assets/agent.js",
|
|
94
94
|
"ready": "pnpm typecheck && pnpm test && pnpm build",
|
|
95
95
|
"test": "pnpm test:prepare && vitest run",
|
package/src/board.ts
CHANGED
|
@@ -2,6 +2,8 @@ import { Context, Effect, FileSystem, Layer, Path, type PlatformError, type Scop
|
|
|
2
2
|
import { HttpRouter, HttpServerRequest, type HttpServerResponse } from "effect/unstable/http";
|
|
3
3
|
import { watchChanges } from "#files/changes.ts";
|
|
4
4
|
import { type HomeMissing, homeIn } from "#files/home.ts";
|
|
5
|
+
import { handoffPage } from "#handoffs/page.ts";
|
|
6
|
+
import { handoffService } from "#handoffs/service.ts";
|
|
5
7
|
import { ASSETS, MERMAID_ROUTE, type MermaidMissing, mermaidFile, mermaidRoot, NATIVE_ROUTE, nativeAsset } from "#http/assets.ts";
|
|
6
8
|
import { attachment } from "#http/attachment.ts";
|
|
7
9
|
import { events } from "#http/events.ts";
|
|
@@ -19,6 +21,7 @@ import type { RenderFailed } from "#render/failed.ts";
|
|
|
19
21
|
import { Highlighter } from "#render/highlighter.ts";
|
|
20
22
|
import { responsePage } from "#responses/page.ts";
|
|
21
23
|
import { responseService } from "#responses/service.ts";
|
|
24
|
+
import { resultPage } from "#results/page.ts";
|
|
22
25
|
import { server } from "#rpc/server.ts";
|
|
23
26
|
import { searchSnapshot } from "#search/snapshot.ts";
|
|
24
27
|
|
|
@@ -51,6 +54,8 @@ const routes = (options: BoardOptions) =>
|
|
|
51
54
|
const startPage = start(changes, home);
|
|
52
55
|
yield* serve("/_board/start", startPage);
|
|
53
56
|
const workPage = work(index, changes, home);
|
|
57
|
+
const result = resultPage(index, changes, home);
|
|
58
|
+
yield* serve("/_board/result", result);
|
|
54
59
|
const overviewPage = overview(index, changes, home);
|
|
55
60
|
const historyPage = changesPage(changes, home);
|
|
56
61
|
yield* serve("/_board/work", workPage);
|
|
@@ -70,6 +75,14 @@ const routes = (options: BoardOptions) =>
|
|
|
70
75
|
});
|
|
71
76
|
const replyPage = responsePage(responses, changes, home, options.responses === true);
|
|
72
77
|
yield* serve("/_board/respond", replyPage);
|
|
78
|
+
const handoffs = yield* handoffService({
|
|
79
|
+
changes,
|
|
80
|
+
enabled: options.responses === true,
|
|
81
|
+
index: Effect.provideContext(index, context),
|
|
82
|
+
root: options.root,
|
|
83
|
+
});
|
|
84
|
+
const handoff = handoffPage(handoffs, changes, home, options.responses === true);
|
|
85
|
+
yield* serve("/_board/handoff", handoff);
|
|
73
86
|
const pages = page({ home, root: options.root }, changes, index);
|
|
74
87
|
const items = identity(index, pages, changes, home);
|
|
75
88
|
yield* serve("/_board/item/*", items);
|
|
@@ -78,6 +91,12 @@ const routes = (options: BoardOptions) =>
|
|
|
78
91
|
const pathname = new URL(url, "http://127.0.0.1").pathname;
|
|
79
92
|
let selected: ReturnType<typeof pages>;
|
|
80
93
|
switch (pathname) {
|
|
94
|
+
case "/_board/result":
|
|
95
|
+
selected = result(request);
|
|
96
|
+
break;
|
|
97
|
+
case "/_board/handoff":
|
|
98
|
+
selected = handoff(request);
|
|
99
|
+
break;
|
|
81
100
|
case "/_board/respond":
|
|
82
101
|
selected = replyPage(request);
|
|
83
102
|
break;
|
|
@@ -98,7 +117,7 @@ const routes = (options: BoardOptions) =>
|
|
|
98
117
|
}
|
|
99
118
|
return Effect.provideContext(selected, context);
|
|
100
119
|
}
|
|
101
|
-
const rpc = yield* server({ changes, home, index: Effect.provideContext(index, context), page: readPage, responses });
|
|
120
|
+
const rpc = yield* server({ changes, handoffs, home, index: Effect.provideContext(index, context), page: readPage, responses });
|
|
102
121
|
yield* serve(
|
|
103
122
|
"/_board/rpc",
|
|
104
123
|
(request) =>
|
package/src/browser/client.ts
CHANGED
|
@@ -12,6 +12,7 @@ import type { Contract } from "@shivaedev/effect-contract/contract.ts";
|
|
|
12
12
|
import { live } from "@shivaedev/effect-contract/live.ts";
|
|
13
13
|
import { type ResumeOptions, resumeSignal } from "@shivaedev/effect-contract/resume.ts";
|
|
14
14
|
import { type ReadFailed, workContract, workRpcs } from "#rpc/contract.ts";
|
|
15
|
+
import { handoffContract } from "#rpc/handoffContract.ts";
|
|
15
16
|
import { workspace } from "#rpc/keys.ts";
|
|
16
17
|
import { responseContract } from "#rpc/responseContract.ts";
|
|
17
18
|
|
|
@@ -23,6 +24,7 @@ type BoundContract<TContract> =
|
|
|
23
24
|
TContract extends Contract<infer TName, infer TQueries, infer TCommands, infer TRpcs> ? Bound<TName, TQueries, TCommands, TRpcs, Reader> : never;
|
|
24
25
|
export interface BrowserClient {
|
|
25
26
|
readonly api: BoundContract<typeof workContract>;
|
|
27
|
+
readonly handoffs: BoundContract<typeof handoffContract>;
|
|
26
28
|
readonly mutate: <A, E>(effect: Effect.Effect<A, E, Reader | Reactivity.Reactivity>, signal?: AbortSignal) => Promise<A>;
|
|
27
29
|
readonly read: <A, E>(atom: Atom.Atom<AsyncResult.AsyncResult<A, E>>, signal?: AbortSignal) => Promise<A>;
|
|
28
30
|
readonly registry: AtomRegistry.AtomRegistry;
|
|
@@ -81,5 +83,5 @@ export function browserClient(url: string, options: ResumeOptions = {}): Browser
|
|
|
81
83
|
return result.success;
|
|
82
84
|
}
|
|
83
85
|
const responses = bind(responseContract, Client);
|
|
84
|
-
return { api, mutate, read, registry, responses, run, updates };
|
|
86
|
+
return { api, handoffs: bind(handoffContract, Client), mutate, read, registry, responses, run, updates };
|
|
85
87
|
}
|
package/src/browser/entry.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { setupHandoffs } from "#browser/handoffs/setup.ts";
|
|
1
2
|
import { setupResponses } from "#browser/responses/setup.ts";
|
|
2
3
|
|
|
3
4
|
if (typeof window !== "undefined" && typeof document !== "undefined") {
|
|
4
5
|
setupResponses();
|
|
6
|
+
setupHandoffs();
|
|
5
7
|
}
|
|
6
8
|
|
|
7
9
|
import { session as ownedSession } from "./session.ts";
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
const bound = new WeakSet<HTMLButtonElement>();
|
|
2
|
+
export function copyPrompts(root: ParentNode) {
|
|
3
|
+
for (const button of root.querySelectorAll<HTMLButtonElement>("[data-handoff-copy]")) {
|
|
4
|
+
if (bound.has(button)) {
|
|
5
|
+
continue;
|
|
6
|
+
}
|
|
7
|
+
bound.add(button);
|
|
8
|
+
button.addEventListener("click", async () => {
|
|
9
|
+
const field = document.getElementById(button.dataset.handoffCopy ?? "");
|
|
10
|
+
const status = button.parentElement?.querySelector("[data-copy-status]");
|
|
11
|
+
if (!(field instanceof HTMLTextAreaElement && status)) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
await navigator.clipboard.writeText(field.value);
|
|
16
|
+
status.textContent = "Prompt copied. Paste it into your existing agent session.";
|
|
17
|
+
} catch {
|
|
18
|
+
field.focus();
|
|
19
|
+
field.select();
|
|
20
|
+
status.textContent = "Clipboard unavailable. The prompt is selected; copy it manually.";
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export function preparedPrompt(container: HTMLElement, id: string, prompt: string) {
|
|
26
|
+
const label = document.createElement("label");
|
|
27
|
+
label.textContent = "Prompt for your existing agent session";
|
|
28
|
+
const field = document.createElement("textarea");
|
|
29
|
+
field.id = `handoff-prompt-${id}`;
|
|
30
|
+
field.readOnly = true;
|
|
31
|
+
field.rows = 3;
|
|
32
|
+
field.value = prompt;
|
|
33
|
+
label.append(field);
|
|
34
|
+
const button = document.createElement("button");
|
|
35
|
+
button.type = "button";
|
|
36
|
+
button.dataset.handoffCopy = field.id;
|
|
37
|
+
button.textContent = "Copy tiny prompt";
|
|
38
|
+
const status = document.createElement("p");
|
|
39
|
+
status.dataset.copyStatus = "";
|
|
40
|
+
status.setAttribute("role", "status");
|
|
41
|
+
status.textContent = "Prepared; receipt not confirmed. Copy the prompt to your agent.";
|
|
42
|
+
container.replaceChildren(label, button, status);
|
|
43
|
+
container.hidden = false;
|
|
44
|
+
copyPrompts(container);
|
|
45
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Option, Schema } from "effect";
|
|
2
|
+
import type { HandoffInput } from "#browser/handoffs/schema.ts";
|
|
3
|
+
import type { Draft } from "#browser/responses/drafts.ts";
|
|
4
|
+
|
|
5
|
+
const TextFields = Schema.Struct({ constraints: Schema.String, goal: Schema.String, nextAction: Schema.String });
|
|
6
|
+
export function handoffFields(form: HTMLFormElement) {
|
|
7
|
+
const recipient = form.elements.namedItem("recipient");
|
|
8
|
+
const goal = form.elements.namedItem("goal");
|
|
9
|
+
const constraints = form.elements.namedItem("constraints");
|
|
10
|
+
const nextAction = form.elements.namedItem("nextAction");
|
|
11
|
+
if (
|
|
12
|
+
!(
|
|
13
|
+
recipient instanceof HTMLInputElement
|
|
14
|
+
&& goal instanceof HTMLTextAreaElement
|
|
15
|
+
&& constraints instanceof HTMLTextAreaElement
|
|
16
|
+
&& nextAction instanceof HTMLTextAreaElement
|
|
17
|
+
)
|
|
18
|
+
) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
return { constraints, goal, nextAction, recipient };
|
|
22
|
+
}
|
|
23
|
+
export function restoreFields(fields: NonNullable<ReturnType<typeof handoffFields>>, draft: Draft) {
|
|
24
|
+
if (!draft.body) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const saved = Schema.decodeUnknownOption(TextFields)(JSON.parse(draft.body));
|
|
29
|
+
if (Option.isSome(saved)) {
|
|
30
|
+
fields.constraints.value = saved.value.constraints;
|
|
31
|
+
fields.goal.value = saved.value.goal;
|
|
32
|
+
fields.nextAction.value = saved.value.nextAction;
|
|
33
|
+
fields.recipient.value = draft.author;
|
|
34
|
+
}
|
|
35
|
+
} catch {
|
|
36
|
+
fields.goal.value = draft.body;
|
|
37
|
+
fields.recipient.value = draft.author;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function inputFrom(form: HTMLFormElement, draft: Draft): HandoffInput {
|
|
41
|
+
const fields = Schema.decodeUnknownSync(TextFields)(JSON.parse(draft.body));
|
|
42
|
+
return {
|
|
43
|
+
...fields,
|
|
44
|
+
id: draft.id,
|
|
45
|
+
item: form.dataset.item ?? "",
|
|
46
|
+
recipient: draft.author,
|
|
47
|
+
revision: draft.revision,
|
|
48
|
+
source: form.dataset.source ?? "",
|
|
49
|
+
};
|
|
50
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
import { Revision } from "#browser/responses/schema.ts";
|
|
3
|
+
import { Identity } from "#path/Identity.ts";
|
|
4
|
+
|
|
5
|
+
const Text = Schema.String.check(Schema.isPattern(/\S/u), Schema.isMaxLength(8192));
|
|
6
|
+
const HandoffFields = Schema.Struct({
|
|
7
|
+
by: Schema.optional(Text),
|
|
8
|
+
constraints: Schema.String.check(Schema.isMaxLength(8192)),
|
|
9
|
+
goal: Text,
|
|
10
|
+
item: Identity,
|
|
11
|
+
nextAction: Text,
|
|
12
|
+
note: Schema.optional(Text),
|
|
13
|
+
preparedAt: Schema.Number.check(Schema.isFinite(), Schema.isGreaterThanOrEqualTo(0), Schema.isLessThanOrEqualTo(8_640_000_000_000_000)),
|
|
14
|
+
recipient: Text.check(Schema.isMaxLength(200)),
|
|
15
|
+
reviewedRevision: Revision,
|
|
16
|
+
source: Schema.String,
|
|
17
|
+
state: Schema.Literals(["requested", "acknowledged", "rejected", "unavailable"]),
|
|
18
|
+
});
|
|
19
|
+
export const HandoffRecord = HandoffFields.pipe(
|
|
20
|
+
Schema.encodeKeys({ nextAction: "next_action", preparedAt: "prepared_at", reviewedRevision: "reviewed_revision" }),
|
|
21
|
+
);
|
|
22
|
+
export type HandoffRecord = typeof HandoffRecord.Type;
|
|
23
|
+
export const HandoffInput = Schema.Struct({
|
|
24
|
+
constraints: HandoffFields.fields.constraints,
|
|
25
|
+
goal: HandoffFields.fields.goal,
|
|
26
|
+
id: Identity,
|
|
27
|
+
item: Identity,
|
|
28
|
+
nextAction: HandoffFields.fields.nextAction,
|
|
29
|
+
recipient: HandoffFields.fields.recipient,
|
|
30
|
+
revision: Revision,
|
|
31
|
+
source: Schema.String,
|
|
32
|
+
});
|
|
33
|
+
export type HandoffInput = typeof HandoffInput.Type;
|
|
34
|
+
export const Handoff = Schema.Struct({ context: Schema.String, file: Schema.String, handoff: HandoffRecord, id: Identity, prompt: Schema.String });
|
|
35
|
+
export type Handoff = typeof Handoff.Type;
|
|
36
|
+
export const HandoffReading = Schema.Struct({ records: Schema.Array(Handoff), unknown: Schema.Array(Schema.String) });
|
|
37
|
+
export const HandoffPreview = Schema.Struct({
|
|
38
|
+
context: Schema.String,
|
|
39
|
+
id: Identity,
|
|
40
|
+
item: Identity,
|
|
41
|
+
reviewedRevision: Revision,
|
|
42
|
+
source: Schema.String,
|
|
43
|
+
});
|
|
44
|
+
export type HandoffPreview = typeof HandoffPreview.Type;
|