@songsid/agend 2.3.2-beta.4 → 2.3.2-beta.6
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/THIRD_PARTY_NOTICES.md +40 -0
- package/dist/antigravity-usage-scan.d.ts +58 -0
- package/dist/antigravity-usage-scan.js +257 -0
- package/dist/antigravity-usage-scan.js.map +1 -0
- package/dist/antigravity-usage-worker.d.ts +1 -0
- package/dist/antigravity-usage-worker.js +10 -0
- package/dist/antigravity-usage-worker.js.map +1 -0
- package/dist/backend/kiro-identity.d.ts +45 -0
- package/dist/backend/kiro-identity.js +74 -0
- package/dist/backend/kiro-identity.js.map +1 -1
- package/dist/backend/kiro.d.ts +15 -0
- package/dist/backend/kiro.js +42 -5
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/types.d.ts +6 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/backend-signin-guide.d.ts +1 -0
- package/dist/backend-signin-guide.js +9 -0
- package/dist/backend-signin-guide.js.map +1 -0
- package/dist/backend-signin-pending.d.ts +10 -0
- package/dist/backend-signin-pending.js +44 -0
- package/dist/backend-signin-pending.js.map +1 -0
- package/dist/browser-backend-signins.d.ts +56 -0
- package/dist/browser-backend-signins.js +189 -0
- package/dist/browser-backend-signins.js.map +1 -0
- package/dist/cache-ledger.d.ts +38 -2
- package/dist/cache-ledger.js +133 -8
- package/dist/cache-ledger.js.map +1 -1
- package/dist/cache-prices.d.ts +2 -1
- package/dist/cache-prices.js +5 -2
- package/dist/cache-prices.js.map +1 -1
- package/dist/cache-service.d.ts +68 -0
- package/dist/cache-service.js +355 -13
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/adapters/discord.d.ts +11 -0
- package/dist/channel/adapters/discord.js +50 -8
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/mcp-tools.js +3 -1
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/cli.js +21 -2
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +25 -3
- package/dist/config-validator.js.map +1 -1
- package/dist/config.d.ts +19 -0
- package/dist/config.js +25 -0
- package/dist/config.js.map +1 -1
- package/dist/cpu-quota.d.ts +23 -0
- package/dist/cpu-quota.js +86 -0
- package/dist/cpu-quota.js.map +1 -0
- package/dist/daemon.js +6 -3
- package/dist/daemon.js.map +1 -1
- package/dist/fleet-manager.d.ts +56 -5
- package/dist/fleet-manager.js +387 -144
- package/dist/fleet-manager.js.map +1 -1
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +5 -2
- package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +14 -1
- package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +20 -4
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +20 -4
- package/dist/instance-lifecycle.d.ts +9 -0
- package/dist/instance-lifecycle.js +27 -1
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/kiro-db-reader.d.ts +5 -0
- package/dist/kiro-db-reader.js +18 -0
- package/dist/kiro-db-reader.js.map +1 -1
- package/dist/kiro-engine-status.d.ts +2 -0
- package/dist/kiro-engine-status.js +9 -0
- package/dist/kiro-engine-status.js.map +1 -1
- package/dist/kiro-migrate.d.ts +49 -0
- package/dist/kiro-migrate.js +105 -0
- package/dist/kiro-migrate.js.map +1 -0
- package/dist/kiro-transcript-lane.d.ts +2 -0
- package/dist/kiro-transcript-lane.js.map +1 -1
- package/dist/kiro-transcript-worker.js +1 -0
- package/dist/kiro-transcript-worker.js.map +1 -1
- package/dist/kiro-usage-run.d.ts +7 -0
- package/dist/kiro-usage-run.js +39 -0
- package/dist/kiro-usage-run.js.map +1 -0
- package/dist/kiro-usage-scan.d.ts +49 -0
- package/dist/kiro-usage-scan.js +223 -0
- package/dist/kiro-usage-scan.js.map +1 -0
- package/dist/kiro-usage-worker.d.ts +1 -0
- package/dist/kiro-usage-worker.js +10 -0
- package/dist/kiro-usage-worker.js.map +1 -0
- package/dist/kiro-usage.d.ts +58 -0
- package/dist/kiro-usage.js +310 -0
- package/dist/kiro-usage.js.map +1 -0
- package/dist/locale.js +78 -2
- package/dist/locale.js.map +1 -1
- package/dist/log-service.js +1 -1
- package/dist/log-service.js.map +1 -1
- package/dist/login-url.d.ts +4 -0
- package/dist/login-url.js +22 -0
- package/dist/login-url.js.map +1 -0
- package/dist/needs-you-hub.d.ts +2 -1
- package/dist/needs-you-hub.js +1 -1
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +8 -2
- package/dist/needs-you.js +6 -0
- package/dist/needs-you.js.map +1 -1
- package/dist/notice-delivery.d.ts +7 -6
- package/dist/notice-delivery.js +16 -18
- package/dist/notice-delivery.js.map +1 -1
- package/dist/office-share-page.d.ts +13 -0
- package/dist/office-share-page.js +82 -0
- package/dist/office-share-page.js.map +1 -0
- package/dist/office-share-service.d.ts +89 -0
- package/dist/office-share-service.js +172 -0
- package/dist/office-share-service.js.map +1 -0
- package/dist/office-share.d.ts +228 -0
- package/dist/office-share.js +489 -0
- package/dist/office-share.js.map +1 -0
- package/dist/opencode-usage-scan.d.ts +28 -0
- package/dist/opencode-usage-scan.js +92 -0
- package/dist/opencode-usage-scan.js.map +1 -0
- package/dist/opencode-usage-worker.d.ts +1 -0
- package/dist/opencode-usage-worker.js +10 -0
- package/dist/opencode-usage-worker.js.map +1 -0
- package/dist/outbound-handlers.js +22 -2
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +4 -0
- package/dist/outbound-schemas.js +4 -0
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-web-gateway.js +6 -0
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/quickstart-api.js +13 -2
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.js +2 -3
- package/dist/quickstart.js.map +1 -1
- package/dist/settings-api.js +1 -1
- package/dist/settings-api.js.map +1 -1
- package/dist/setup-form.d.ts +1 -1
- package/dist/setup-form.js +7 -1
- package/dist/setup-form.js.map +1 -1
- package/dist/setup-host.d.ts +9 -0
- package/dist/setup-host.js +125 -7
- package/dist/setup-host.js.map +1 -1
- package/dist/setup-signin-assets.d.ts +2 -0
- package/dist/setup-signin-assets.js +6 -0
- package/dist/setup-signin-assets.js.map +1 -0
- package/dist/setup-wizard.js +2 -2
- package/dist/setup-wizard.js.map +1 -1
- package/dist/structured-signin-transport.d.ts +8 -0
- package/dist/structured-signin-transport.js +79 -0
- package/dist/structured-signin-transport.js.map +1 -0
- package/dist/structured-signin.d.ts +131 -0
- package/dist/structured-signin.js +388 -0
- package/dist/structured-signin.js.map +1 -0
- package/dist/tool-permissions.js +2 -0
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.js +4 -1
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-sources.d.ts +26 -2
- package/dist/transcript-sources.js +87 -40
- package/dist/transcript-sources.js.map +1 -1
- package/dist/types.d.ts +15 -5
- package/dist/ui/backend-signin.js +63 -10
- package/dist/ui/fleet-office-pack.js +7 -2
- package/dist/ui/fleet-office-skin.js +5 -4
- package/dist/ui/fleet-office-zones.js +17 -6
- package/dist/ui/fleet-office.js +20 -10
- package/dist/ui/fleet-usage.js +19 -15
- package/dist/ui/office-share-dialog.js +145 -0
- package/dist/ui/office-share-page.js +116 -0
- package/dist/ui/panel-log.js +2 -2
- package/dist/ui/panel-needs.js +4 -4
- package/dist/ui/panel-settings.js +12 -8
- package/dist/ui/settings-registry.js +2 -2
- package/dist/ui/settings-strings.js +6 -6
- package/dist/ui/shared/app-i18n.js +2 -2
- package/dist/ui/shared/app.css +29 -0
- package/dist/ui/structured-signin.js +115 -0
- package/dist/usage-report.d.ts +20 -0
- package/dist/usage-report.js +54 -17
- package/dist/usage-report.js.map +1 -1
- package/dist/usage-rollup.d.ts +9 -1
- package/dist/usage-rollup.js +20 -4
- package/dist/usage-rollup.js.map +1 -1
- package/dist/web-api.d.ts +15 -0
- package/dist/web-api.js +190 -0
- package/dist/web-api.js.map +1 -1
- package/dist/web-auth.js +1 -1
- package/dist/web-auth.js.map +1 -1
- package/dist/web-backend-login.d.ts +1 -7
- package/dist/web-backend-login.js +2 -24
- package/dist/web-backend-login.js.map +1 -1
- package/dist/web-office-skins.d.ts +2 -1
- package/dist/web-office-skins.js +2 -1
- package/dist/web-office-skins.js.map +1 -1
- package/dist/web-settings-patch.js +1 -1
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/working-recovery.d.ts +2 -2
- package/dist/working-recovery.js +43 -8
- package/dist/working-recovery.js.map +1 -1
- package/dist/working-state-journal.d.ts +2 -0
- package/dist/working-state-journal.js +16 -1
- package/dist/working-state-journal.js.map +1 -1
- package/package.json +2 -1
- package/templates/windows-shortcuts.ps1 +7 -5
package/dist/needs-you.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* rendered list is (its signature), and the live chat message's text and links. Nothing here touches a socket,
|
|
7
7
|
* a file or a clock of its own.
|
|
8
8
|
*/
|
|
9
|
-
export type NeedsYouType = "prompt" | "awaiting_input" | "instance" | "delivery" | "task";
|
|
9
|
+
export type NeedsYouType = "prompt" | "awaiting_input" | "instance" | "delivery" | "task" | "backend";
|
|
10
10
|
export interface NeedsYouItem {
|
|
11
11
|
/** Stable per occurrence: a new episode, crash or delivery is a new id (§3). */
|
|
12
12
|
id: string;
|
|
@@ -60,7 +60,7 @@ export interface NeedsYouItem {
|
|
|
60
60
|
*/
|
|
61
61
|
lane?: string;
|
|
62
62
|
}
|
|
63
|
-
export type NeedsYouReason = "hang" | "exited" | "assist" | "permission" | "dangerous_command" | "login" | "dialog" | "terminal_input" | "auth_paused" | "crashed" | "delivery_uncertain" | "delivery_failed" | "task_review" | "task_blocked";
|
|
63
|
+
export type NeedsYouReason = "hang" | "exited" | "assist" | "permission" | "dangerous_command" | "login" | "dialog" | "terminal_input" | "auth_paused" | "crashed" | "delivery_uncertain" | "delivery_failed" | "task_review" | "task_blocked" | "backend_signin";
|
|
64
64
|
/** A fleet prompt offered on the dashboard (hang / exit-restart / interactive-assist), as the fleet holds it. */
|
|
65
65
|
export interface PromptInput {
|
|
66
66
|
nonce: string;
|
|
@@ -136,11 +136,17 @@ export interface TaskInput {
|
|
|
136
136
|
/** Epoch ms since it has waited (its move to review or to blocked). */
|
|
137
137
|
since: number;
|
|
138
138
|
}
|
|
139
|
+
export interface BackendSignInInput {
|
|
140
|
+
backend: string;
|
|
141
|
+
since: number;
|
|
142
|
+
browser: boolean;
|
|
143
|
+
}
|
|
139
144
|
export interface NeedsYouInputs {
|
|
140
145
|
prompts: PromptInput[];
|
|
141
146
|
instances: InstanceInput[];
|
|
142
147
|
deliveries: DeliveryInput[];
|
|
143
148
|
tasks?: TaskInput[];
|
|
149
|
+
backendSignIns?: BackendSignInInput[];
|
|
144
150
|
/** The live world that owns an instance, or undefined (no channel, or its world is gone). */
|
|
145
151
|
ownerOf: (instance: string) => string | undefined;
|
|
146
152
|
}
|
package/dist/needs-you.js
CHANGED
|
@@ -69,6 +69,12 @@ export function deriveNeedsYou(inputs) {
|
|
|
69
69
|
detail: oneLine(`${d.source} → ${d.target} · ${d.kind}`), since: d.finishedAt, deliveryId: d.deliveryId,
|
|
70
70
|
});
|
|
71
71
|
}
|
|
72
|
+
// Installer-selected backends are fleet-level web items, including when no agent uses them.
|
|
73
|
+
for (const b of inputs.backendSignIns ?? [])
|
|
74
|
+
items.push({
|
|
75
|
+
id: `backend-signin:${b.backend}:${b.since}`, type: "backend", instance: "", reason: "backend_signin", detail: b.backend, since: b.since,
|
|
76
|
+
...(b.browser ? { signIn: { backend: b.backend } } : {}),
|
|
77
|
+
});
|
|
72
78
|
// Task board cards waiting for the person (#2246 step 3), under their assignee.
|
|
73
79
|
for (const c of inputs.tasks ?? []) {
|
|
74
80
|
items.push({
|
package/dist/needs-you.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"needs-you.js","sourceRoot":"","sources":["../src/needs-you.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"needs-you.js","sourceRoot":"","sources":["../src/needs-you.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import type { FleetDefaults, WebConfig } from "./types.js";
|
|
2
|
+
/** A legacy "dm" (#2581) is still accepted as input and means true: notices are never sent by DM (hmsg-d1809f2a, hmsg-3b8ac2af). */
|
|
2
3
|
export type NoticeMode = boolean | "dm";
|
|
3
4
|
type NoticeConfig = {
|
|
4
5
|
defaults: FleetDefaults;
|
|
5
6
|
web?: WebConfig;
|
|
6
7
|
};
|
|
7
|
-
/**
|
|
8
|
-
export declare
|
|
9
|
-
|
|
10
|
-
export declare function tipNoticeMode(config: NoticeConfig):
|
|
11
|
-
/**
|
|
8
|
+
/** Sign-in notices post in the topic unless turned off; a legacy "dm" or `notice_delivery.login` route reads as on. */
|
|
9
|
+
export declare function loginNoticeMode(web?: WebConfig): boolean;
|
|
10
|
+
/** Daily tips always post in the General topic; an old "dm" reads as on. */
|
|
11
|
+
export declare function tipNoticeMode(config: NoticeConfig): boolean;
|
|
12
|
+
/** Disk keeps only the boolean field; setting it clears the stale `notice_delivery` route #2591 stored beside it. */
|
|
12
13
|
export declare function setNoticeMode(config: NoticeConfig, kind: "login" | "tips", mode: NoticeMode): void;
|
|
13
|
-
/** Accept the short-lived #2581 string form, but
|
|
14
|
+
/** Accept the short-lived #2581 string form and #2591's routes, but write back only booleans. */
|
|
14
15
|
export declare function normalizeNoticeDelivery(config: NoticeConfig): void;
|
|
15
16
|
export {};
|
package/dist/notice-delivery.js
CHANGED
|
@@ -1,23 +1,16 @@
|
|
|
1
|
-
/**
|
|
2
|
-
export const NEW_FLEET_WEB = Object.freeze({
|
|
3
|
-
notify_login: true, notice_delivery: Object.freeze({ login: "dm" }),
|
|
4
|
-
});
|
|
1
|
+
/** Sign-in notices post in the topic unless turned off; a legacy "dm" or `notice_delivery.login` route reads as on. */
|
|
5
2
|
export function loginNoticeMode(web) {
|
|
6
|
-
|
|
7
|
-
return enabled === true && web?.notice_delivery?.login === "dm" ? "dm" : enabled;
|
|
3
|
+
return web?.notify_login !== false;
|
|
8
4
|
}
|
|
5
|
+
/** Daily tips always post in the General topic; an old "dm" reads as on. */
|
|
9
6
|
export function tipNoticeMode(config) {
|
|
10
|
-
|
|
11
|
-
return enabled === true && config.web?.notice_delivery?.tips === "dm" ? "dm" : enabled;
|
|
7
|
+
return config.defaults.tips !== false;
|
|
12
8
|
}
|
|
13
|
-
/**
|
|
9
|
+
/** Disk keeps only the boolean field; setting it clears the stale `notice_delivery` route #2591 stored beside it. */
|
|
14
10
|
export function setNoticeMode(config, kind, mode) {
|
|
15
11
|
const web = config.web = { ...config.web };
|
|
16
12
|
const delivery = { ...web.notice_delivery };
|
|
17
|
-
|
|
18
|
-
delivery[kind] = "dm";
|
|
19
|
-
else
|
|
20
|
-
delete delivery[kind];
|
|
13
|
+
delete delivery[kind];
|
|
21
14
|
if (Object.keys(delivery).length)
|
|
22
15
|
web.notice_delivery = delivery;
|
|
23
16
|
else
|
|
@@ -27,11 +20,16 @@ export function setNoticeMode(config, kind, mode) {
|
|
|
27
20
|
else
|
|
28
21
|
config.defaults.tips = mode !== false;
|
|
29
22
|
}
|
|
30
|
-
/** Accept the short-lived #2581 string form, but
|
|
23
|
+
/** Accept the short-lived #2581 string form and #2591's routes, but write back only booleans. */
|
|
31
24
|
export function normalizeNoticeDelivery(config) {
|
|
32
|
-
if (config.web?.notify_login === "dm")
|
|
33
|
-
setNoticeMode(config, "login",
|
|
34
|
-
if (config.defaults.tips === "dm")
|
|
35
|
-
setNoticeMode(config, "tips",
|
|
25
|
+
if (config.web?.notify_login === "dm" || config.web?.notice_delivery?.login)
|
|
26
|
+
setNoticeMode(config, "login", config.web.notify_login !== false);
|
|
27
|
+
if (config.defaults.tips === "dm" || config.web?.notice_delivery?.tips)
|
|
28
|
+
setNoticeMode(config, "tips", config.defaults.tips !== false);
|
|
29
|
+
// Even an empty `notice_delivery: {}` is dropped, or the startup migration would rewrite the file on every start.
|
|
30
|
+
if (config.web && Object.hasOwn(config.web, "notice_delivery")) {
|
|
31
|
+
config.web = { ...config.web };
|
|
32
|
+
delete config.web.notice_delivery;
|
|
33
|
+
}
|
|
36
34
|
}
|
|
37
35
|
//# sourceMappingURL=notice-delivery.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notice-delivery.js","sourceRoot":"","sources":["../src/notice-delivery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"notice-delivery.js","sourceRoot":"","sources":["../src/notice-delivery.ts"],"names":[],"mappings":"AAKA,uHAAuH;AACvH,MAAM,UAAU,eAAe,CAAC,GAAe;IAC7C,OAAO,GAAG,EAAE,YAAY,KAAK,KAAK,CAAC;AACrC,CAAC;AACD,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,MAAoB;IAChD,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC;AACxC,CAAC;AACD,qHAAqH;AACrH,MAAM,UAAU,aAAa,CAAC,MAAoB,EAAE,IAAsB,EAAE,IAAgB;IAC1F,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;IAC5C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM;QAAE,GAAG,CAAC,eAAe,GAAG,QAAQ,CAAC;;QAAM,OAAO,GAAG,CAAC,eAAe,CAAC;IAClG,IAAI,IAAI,KAAK,OAAO;QAAE,GAAG,CAAC,YAAY,GAAG,IAAI,KAAK,KAAK,CAAC;;QAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,KAAK,KAAK,CAAC;AACtG,CAAC;AACD,iGAAiG;AACjG,MAAM,UAAU,uBAAuB,CAAC,MAAoB;IAC1D,IAAI,MAAM,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK;QAAE,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,KAAK,KAAK,CAAC,CAAC;IAC/I,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI;QAAE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IACtI,kHAAkH;IAClH,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,iBAAiB,CAAC,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;QAAC,OAAO,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC;IAAC,CAAC;AACxI,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** `/assets/<name>` → src/ui/shared/<name>: the share page's closure there, its stylesheets and the font they name. */
|
|
2
|
+
export declare const SHARE_ASSETS: Readonly<Record<string, string>>;
|
|
3
|
+
/** `/ui/js/<name>` → src/ui/<name>: the share page's own module and the Office's. */
|
|
4
|
+
export declare const SHARE_MODULES: readonly string[];
|
|
5
|
+
/** A static file the share page loads, by its path on the share origin, or null (not one of them). */
|
|
6
|
+
export declare function officeShareStatic(path: string): {
|
|
7
|
+
body: Buffer;
|
|
8
|
+
type: string;
|
|
9
|
+
} | null;
|
|
10
|
+
/** The page's policy: its own scripts, styles, pictures and reads; nothing inline, nothing framed, no form. */
|
|
11
|
+
export declare const OFFICE_SHARE_PAGE_CSP: string;
|
|
12
|
+
/** The page itself: the same for every share (the module reads the token from the address). */
|
|
13
|
+
export declare const OFFICE_SHARE_PAGE = "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, viewport-fit=cover\">\n<meta name=\"referrer\" content=\"no-referrer\">\n<meta name=\"robots\" content=\"noindex, nofollow\">\n<title>AgEnD Office</title>\n<link rel=\"stylesheet\" href=\"/assets/tokens.css\">\n<link rel=\"stylesheet\" href=\"/assets/app.css\">\n<script type=\"module\" src=\"/ui/js/office-share-page.js\"></script>\n</head>\n<body>\n<div id=\"app\" class=\"app-root\" data-share=\"1\"></div>\n<noscript><p class=\"noscript\">This live Office view needs JavaScript.</p></noscript>\n</body>\n</html>\n";
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #2636: an Office share link's page and the static files it loads, as the share gateway serves them (office-share.ts).
|
|
3
|
+
*
|
|
4
|
+
* The page (`/o/<token>`) is a fixed document — no data in it, no inline script — that loads the share page's module
|
|
5
|
+
* (src/ui/office-share-page.js), which reads the share's own addresses. Its modules and stylesheets are served at the
|
|
6
|
+
* dashboard's own paths (`/assets/<name>`, `/ui/js/<name>`) so the Office's imports work unchanged, without a token:
|
|
7
|
+
* they are the app's static code (published with AgEnD), never data — and only the files named here, the page
|
|
8
|
+
* module's import closure (a test checks the list against the imports), not the directory.
|
|
9
|
+
*/
|
|
10
|
+
import { readFileSync } from "node:fs";
|
|
11
|
+
import { dirname, join } from "node:path";
|
|
12
|
+
import { fileURLToPath } from "node:url";
|
|
13
|
+
const UI_DIR = join(dirname(fileURLToPath(import.meta.url)), "ui");
|
|
14
|
+
const JS = "text/javascript; charset=utf-8";
|
|
15
|
+
/** `/assets/<name>` → src/ui/shared/<name>: the share page's closure there, its stylesheets and the font they name. */
|
|
16
|
+
export const SHARE_ASSETS = {
|
|
17
|
+
...Object.fromEntries([
|
|
18
|
+
"app-ctx.js", "app-html.js", "app-i18n.js", "app-nav.js", "app-prefs.js", "app-route.js", "app-store.js", "app-themes.js", "header-tools.js",
|
|
19
|
+
"htm.module.js", "identity-color.js", "instance-nav.js", "owner-css.js", "preact-hooks.module.js", "preact.module.js", "read-stream.js",
|
|
20
|
+
"side-panel.js", "text-undo.js", "ui-confirm.js", "ui-dialog.js", "ui-icons.js", "ui-states.js", "ui-toast.js", "usage-dialog.js",
|
|
21
|
+
"view-roster-store.js", "view-strings.js",
|
|
22
|
+
].map(name => [name, JS])),
|
|
23
|
+
"tokens.css": "text/css; charset=utf-8", "app.css": "text/css; charset=utf-8", "inter.woff2": "font/woff2",
|
|
24
|
+
};
|
|
25
|
+
/** `/ui/js/<name>` → src/ui/<name>: the share page's own module and the Office's. */
|
|
26
|
+
export const SHARE_MODULES = [
|
|
27
|
+
"office-share-page.js", "fleet-office.js", "fleet-office-model.js", "fleet-office-skin.js", "fleet-office-zones.js", "fleet-office-store.js",
|
|
28
|
+
"fleet-office-editor.js", "fleet-office-layout.js", "fleet-office-pack.js", "fleet-office-overview.js", "fleet-office-view.js",
|
|
29
|
+
"fleet-org.js", "fleet-canvas-layout.js", "fleet-canvas-view.js", "fleet-traffic.js", "office-share-dialog.js",
|
|
30
|
+
];
|
|
31
|
+
const cache = new Map();
|
|
32
|
+
const read = (file) => {
|
|
33
|
+
const hit = cache.get(file);
|
|
34
|
+
if (hit)
|
|
35
|
+
return hit;
|
|
36
|
+
try {
|
|
37
|
+
const b = readFileSync(file);
|
|
38
|
+
cache.set(file, b);
|
|
39
|
+
return b;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
/** A static file the share page loads, by its path on the share origin, or null (not one of them). */
|
|
46
|
+
export function officeShareStatic(path) {
|
|
47
|
+
const asset = /^\/assets\/([A-Za-z0-9_.-]+)$/.exec(path);
|
|
48
|
+
if (asset && Object.prototype.hasOwnProperty.call(SHARE_ASSETS, asset[1])) {
|
|
49
|
+
const name = asset[1];
|
|
50
|
+
const body = read(join(UI_DIR, "shared", name === "inter.woff2" ? join("fonts", name) : name));
|
|
51
|
+
return body ? { body, type: SHARE_ASSETS[name] } : null;
|
|
52
|
+
}
|
|
53
|
+
const mod = /^\/ui\/js\/([a-z0-9_-]+\.js)$/.exec(path);
|
|
54
|
+
if (mod && SHARE_MODULES.includes(mod[1])) {
|
|
55
|
+
const body = read(join(UI_DIR, mod[1]));
|
|
56
|
+
return body ? { body, type: JS } : null;
|
|
57
|
+
}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
/** The page's policy: its own scripts, styles, pictures and reads; nothing inline, nothing framed, no form. */
|
|
61
|
+
export const OFFICE_SHARE_PAGE_CSP = "default-src 'none'; script-src 'self'; style-src 'self'; img-src 'self' data: blob:; font-src 'self'; "
|
|
62
|
+
+ "connect-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'";
|
|
63
|
+
/** The page itself: the same for every share (the module reads the token from the address). */
|
|
64
|
+
export const OFFICE_SHARE_PAGE = `<!DOCTYPE html>
|
|
65
|
+
<html lang="en">
|
|
66
|
+
<head>
|
|
67
|
+
<meta charset="utf-8">
|
|
68
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
|
|
69
|
+
<meta name="referrer" content="no-referrer">
|
|
70
|
+
<meta name="robots" content="noindex, nofollow">
|
|
71
|
+
<title>AgEnD Office</title>
|
|
72
|
+
<link rel="stylesheet" href="/assets/tokens.css">
|
|
73
|
+
<link rel="stylesheet" href="/assets/app.css">
|
|
74
|
+
<script type="module" src="/ui/js/office-share-page.js"></script>
|
|
75
|
+
</head>
|
|
76
|
+
<body>
|
|
77
|
+
<div id="app" class="app-root" data-share="1"></div>
|
|
78
|
+
<noscript><p class="noscript">This live Office view needs JavaScript.</p></noscript>
|
|
79
|
+
</body>
|
|
80
|
+
</html>
|
|
81
|
+
`;
|
|
82
|
+
//# sourceMappingURL=office-share-page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"office-share-page.js","sourceRoot":"","sources":["../src/office-share-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #2636 part 3: Office share links, running — the shares (office-share.ts OfficeShares), their gateway, and the quick
|
|
3
|
+
* tunnel they share. Design: #2636, confirmed with the leader's two additions (2026-10-25):
|
|
4
|
+
*
|
|
5
|
+
* - The tunnel starts with the first share and stops when the last one ends (expired, revoked, its owner no longer an
|
|
6
|
+
* admin, the feature turned off). trycloudflare.com limits new quick tunnels: a start it refuses (429) fails that one
|
|
7
|
+
* share with "try again later" — nothing retries on its own. A share is only handed out once the tunnel is up.
|
|
8
|
+
* - No step beyond the admin check (decision a94a1bab): whoever may make one gets the link at once.
|
|
9
|
+
* - Its own manager and lease (OFFICE_SHARE_TUNNEL_DIR): never the fleet's one tunnel lane (/web, /login) nor the
|
|
10
|
+
* public link's preview tunnel. A tunnel that goes away unexpectedly ends every share (their address was its host).
|
|
11
|
+
*/
|
|
12
|
+
import { OfficeShares, createOfficeShareGateway, type OfficeShare, type OfficeShareSource } from "./office-share.js";
|
|
13
|
+
import { type PublicLinkFailure } from "./public-link-progress.js";
|
|
14
|
+
import { type ManagedTunnel } from "./tunnel/manager.js";
|
|
15
|
+
import type { TunnelProvider } from "./tunnel/types.js";
|
|
16
|
+
/** Where the share tunnel keeps its own lease (never the fleet's `tunnel.lease`). */
|
|
17
|
+
export declare const OFFICE_SHARE_TUNNEL_DIR = "office-share-tunnel";
|
|
18
|
+
/** How often open shares are checked against who may still have them. */
|
|
19
|
+
export declare const SWEEP_MS = 30000;
|
|
20
|
+
export type OfficeShareRefusal = "disabled" | "office" | "duration" | "too_many" | "tunnel";
|
|
21
|
+
export type OfficeShareMade = {
|
|
22
|
+
ok: true;
|
|
23
|
+
share: OfficeShare;
|
|
24
|
+
url: string;
|
|
25
|
+
} | {
|
|
26
|
+
ok: false;
|
|
27
|
+
error: OfficeShareRefusal;
|
|
28
|
+
reason?: PublicLinkFailure | "exited";
|
|
29
|
+
};
|
|
30
|
+
export interface OfficeShareServiceDeps {
|
|
31
|
+
source: OfficeShareSource;
|
|
32
|
+
manager: Pick<ManagedTunnel, "start" | "stop">;
|
|
33
|
+
/** cloudflared, installed (pinned) if need be. */
|
|
34
|
+
ensure(signal: AbortSignal): Promise<{
|
|
35
|
+
path: string;
|
|
36
|
+
}>;
|
|
37
|
+
provider(binary: string): TunnelProvider;
|
|
38
|
+
/** `web.office_share` as it is now. */
|
|
39
|
+
config(): {
|
|
40
|
+
enabled?: boolean;
|
|
41
|
+
max_hours?: number;
|
|
42
|
+
} | undefined;
|
|
43
|
+
/** A stored office by id. */
|
|
44
|
+
officeExists(id: string): boolean;
|
|
45
|
+
/** Whether a share's owner may still have it (a fleet admin of this fleet). */
|
|
46
|
+
ownerCurrent(owner: string): boolean;
|
|
47
|
+
/** Every change to the open shares (Settings' card, General's notices are the caller's). */
|
|
48
|
+
changed?(shares: OfficeShare[]): void;
|
|
49
|
+
/** `detail`: fit for daemon.log — never a token or a URL. */
|
|
50
|
+
log?(event: string, detail?: string): void;
|
|
51
|
+
createGateway?: typeof createOfficeShareGateway;
|
|
52
|
+
shares?: OfficeShares;
|
|
53
|
+
}
|
|
54
|
+
export declare class OfficeShareService {
|
|
55
|
+
private readonly deps;
|
|
56
|
+
readonly shares: OfficeShares;
|
|
57
|
+
private gateway;
|
|
58
|
+
private origin;
|
|
59
|
+
private starting;
|
|
60
|
+
private stopping;
|
|
61
|
+
private abort;
|
|
62
|
+
private unsubscribe;
|
|
63
|
+
private readonly limiter;
|
|
64
|
+
constructor(deps: OfficeShareServiceDeps);
|
|
65
|
+
enabled(): boolean;
|
|
66
|
+
list(): OfficeShare[];
|
|
67
|
+
/**
|
|
68
|
+
* A new share and its URL, once the tunnel is up. `minutes` 15–max_hours×60 (60 if not given); `office` ALL_OFFICES
|
|
69
|
+
* or a stored office's id. A tunnel that cannot start ends the share at once and says why.
|
|
70
|
+
*/
|
|
71
|
+
create(opts: {
|
|
72
|
+
office: string;
|
|
73
|
+
minutes?: number;
|
|
74
|
+
text?: boolean;
|
|
75
|
+
owner: string;
|
|
76
|
+
}): Promise<OfficeShareMade>;
|
|
77
|
+
revoke(id: string): number;
|
|
78
|
+
/** Shares no longer allowed: the feature off (all), an owner no longer an admin, an office deleted. */
|
|
79
|
+
sweep(): number;
|
|
80
|
+
/** The fleet is stopping: every share ends and the tunnel goes. */
|
|
81
|
+
close(): Promise<void>;
|
|
82
|
+
private onChanged;
|
|
83
|
+
private known;
|
|
84
|
+
private sweeper;
|
|
85
|
+
/** The tunnel, up or coming up (one start at a time; never retried here). */
|
|
86
|
+
private up;
|
|
87
|
+
private start;
|
|
88
|
+
private down;
|
|
89
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #2636 part 3: Office share links, running — the shares (office-share.ts OfficeShares), their gateway, and the quick
|
|
3
|
+
* tunnel they share. Design: #2636, confirmed with the leader's two additions (2026-10-25):
|
|
4
|
+
*
|
|
5
|
+
* - The tunnel starts with the first share and stops when the last one ends (expired, revoked, its owner no longer an
|
|
6
|
+
* admin, the feature turned off). trycloudflare.com limits new quick tunnels: a start it refuses (429) fails that one
|
|
7
|
+
* share with "try again later" — nothing retries on its own. A share is only handed out once the tunnel is up.
|
|
8
|
+
* - No step beyond the admin check (decision a94a1bab): whoever may make one gets the link at once.
|
|
9
|
+
* - Its own manager and lease (OFFICE_SHARE_TUNNEL_DIR): never the fleet's one tunnel lane (/web, /login) nor the
|
|
10
|
+
* public link's preview tunnel. A tunnel that goes away unexpectedly ends every share (their address was its host).
|
|
11
|
+
*/
|
|
12
|
+
import { ALL_OFFICES, OfficeShareLimiter, OfficeShares, createOfficeShareGateway, shareMaxMinutes } from "./office-share.js";
|
|
13
|
+
import { OFFICE_SHARE_PAGE, OFFICE_SHARE_PAGE_CSP, officeShareStatic } from "./office-share-page.js";
|
|
14
|
+
import { failureOf } from "./public-link-progress.js";
|
|
15
|
+
import { newTunnelSid } from "./tunnel/manager.js";
|
|
16
|
+
/** Where the share tunnel keeps its own lease (never the fleet's `tunnel.lease`). */
|
|
17
|
+
export const OFFICE_SHARE_TUNNEL_DIR = "office-share-tunnel";
|
|
18
|
+
const QUICK_TUNNEL_HOST = /^[a-z0-9-]+\.trycloudflare\.com$/;
|
|
19
|
+
/** The lease's own end: none — the tunnel ends with its last share, not on a clock. */
|
|
20
|
+
const NO_EXPIRY_WALL = Number.MAX_SAFE_INTEGER;
|
|
21
|
+
/** How often open shares are checked against who may still have them. */
|
|
22
|
+
export const SWEEP_MS = 30_000;
|
|
23
|
+
export class OfficeShareService {
|
|
24
|
+
deps;
|
|
25
|
+
shares;
|
|
26
|
+
gateway = null;
|
|
27
|
+
origin = null;
|
|
28
|
+
starting = null;
|
|
29
|
+
stopping = null;
|
|
30
|
+
abort = null;
|
|
31
|
+
unsubscribe;
|
|
32
|
+
limiter = new OfficeShareLimiter();
|
|
33
|
+
constructor(deps) {
|
|
34
|
+
this.deps = deps;
|
|
35
|
+
this.shares = deps.shares ?? new OfficeShares({ changed: list => this.onChanged(list) });
|
|
36
|
+
}
|
|
37
|
+
enabled() { return this.deps.config()?.enabled !== false; }
|
|
38
|
+
list() { return this.shares.list(); }
|
|
39
|
+
/**
|
|
40
|
+
* A new share and its URL, once the tunnel is up. `minutes` 15–max_hours×60 (60 if not given); `office` ALL_OFFICES
|
|
41
|
+
* or a stored office's id. A tunnel that cannot start ends the share at once and says why.
|
|
42
|
+
*/
|
|
43
|
+
async create(opts) {
|
|
44
|
+
if (!this.enabled())
|
|
45
|
+
return { ok: false, error: "disabled" };
|
|
46
|
+
const made = this.shares.create({ ...opts, maxMinutes: shareMaxMinutes(this.deps.config()?.max_hours), exists: id => this.deps.officeExists(id) });
|
|
47
|
+
if (!made.ok)
|
|
48
|
+
return { ok: false, error: made.error };
|
|
49
|
+
const up = await this.up();
|
|
50
|
+
if (!up.ok) {
|
|
51
|
+
this.shares.revoke(made.share.id);
|
|
52
|
+
return { ok: false, error: "tunnel", reason: up.reason };
|
|
53
|
+
}
|
|
54
|
+
// Ended while the tunnel came up (revoked, or the feature turned off meanwhile): not handed out.
|
|
55
|
+
if (!this.shares.find(made.token))
|
|
56
|
+
return { ok: false, error: "tunnel", reason: "closed" };
|
|
57
|
+
return { ok: true, share: made.share, url: `${up.origin}/o/${made.token}` };
|
|
58
|
+
}
|
|
59
|
+
revoke(id) { return this.shares.revoke(id); }
|
|
60
|
+
/** Shares no longer allowed: the feature off (all), an owner no longer an admin, an office deleted. */
|
|
61
|
+
sweep() {
|
|
62
|
+
if (!this.enabled())
|
|
63
|
+
return this.shares.revoke("all");
|
|
64
|
+
return this.shares.endWhere(s => !this.deps.ownerCurrent(s.owner) || (s.office !== ALL_OFFICES && !this.deps.officeExists(s.office)));
|
|
65
|
+
}
|
|
66
|
+
/** The fleet is stopping: every share ends and the tunnel goes. */
|
|
67
|
+
async close() {
|
|
68
|
+
this.shares.revoke("all");
|
|
69
|
+
await this.down("fleet stopping");
|
|
70
|
+
}
|
|
71
|
+
onChanged(list) {
|
|
72
|
+
const open = new Set(list.map(s => s.id));
|
|
73
|
+
for (const id of this.known)
|
|
74
|
+
if (!open.has(id))
|
|
75
|
+
this.limiter.forget(id);
|
|
76
|
+
this.known = open;
|
|
77
|
+
// While any is open, who may still have it is asked again every SWEEP_MS (an admin removed, the feature turned
|
|
78
|
+
// off, an office deleted end theirs without anyone looking).
|
|
79
|
+
if (list.length && !this.sweeper) {
|
|
80
|
+
this.sweeper = setInterval(() => this.sweep(), SWEEP_MS);
|
|
81
|
+
this.sweeper.unref?.();
|
|
82
|
+
}
|
|
83
|
+
if (!list.length && this.sweeper) {
|
|
84
|
+
clearInterval(this.sweeper);
|
|
85
|
+
this.sweeper = null;
|
|
86
|
+
}
|
|
87
|
+
if (!list.length)
|
|
88
|
+
void this.down("no shares");
|
|
89
|
+
try {
|
|
90
|
+
this.deps.changed?.(list);
|
|
91
|
+
}
|
|
92
|
+
catch { /* a listener never keeps a share or the tunnel */ }
|
|
93
|
+
}
|
|
94
|
+
known = new Set();
|
|
95
|
+
sweeper = null;
|
|
96
|
+
/** The tunnel, up or coming up (one start at a time; never retried here). */
|
|
97
|
+
up() {
|
|
98
|
+
if (this.origin)
|
|
99
|
+
return Promise.resolve({ ok: true, origin: this.origin });
|
|
100
|
+
return this.starting ??= this.start().finally(() => { this.starting = null; });
|
|
101
|
+
}
|
|
102
|
+
async start() {
|
|
103
|
+
await this.stopping?.catch(() => { });
|
|
104
|
+
const abort = this.abort = new AbortController();
|
|
105
|
+
const gateway = (this.deps.createGateway ?? createOfficeShareGateway)({
|
|
106
|
+
shares: this.shares, source: this.deps.source, limiter: this.limiter, statics: officeShareStatic,
|
|
107
|
+
page: () => ({ body: OFFICE_SHARE_PAGE, csp: OFFICE_SHARE_PAGE_CSP }),
|
|
108
|
+
});
|
|
109
|
+
this.gateway = gateway;
|
|
110
|
+
const fail = (reason, detail) => {
|
|
111
|
+
this.deps.log?.(`tunnel ${reason}`, detail);
|
|
112
|
+
if (this.gateway === gateway) {
|
|
113
|
+
gateway.close();
|
|
114
|
+
this.gateway = null;
|
|
115
|
+
}
|
|
116
|
+
void this.deps.manager.stop(`start failed: ${reason}`).catch(() => { });
|
|
117
|
+
return { ok: false, reason };
|
|
118
|
+
};
|
|
119
|
+
try {
|
|
120
|
+
const binary = await this.deps.ensure(abort.signal);
|
|
121
|
+
if (abort.signal.aborted)
|
|
122
|
+
return fail("closed");
|
|
123
|
+
const origin = await gateway.listen();
|
|
124
|
+
if (abort.signal.aborted)
|
|
125
|
+
return fail("closed");
|
|
126
|
+
const result = await this.deps.manager.start(this.deps.provider(binary.path), {
|
|
127
|
+
sid: newTunnelSid(), origin, pagePath: "/ready", readinessMarker: gateway.readinessMarker, expiresAt: NO_EXPIRY_WALL,
|
|
128
|
+
signal: abort.signal, onCandidateHost: host => { if (!abort.signal.aborted)
|
|
129
|
+
gateway.setHost(host); },
|
|
130
|
+
});
|
|
131
|
+
if (!result.ok)
|
|
132
|
+
return fail(failureOf(result.errorKind), result.message);
|
|
133
|
+
if (abort.signal.aborted)
|
|
134
|
+
return fail("closed");
|
|
135
|
+
const published = new URL(result.handle.pageUrl);
|
|
136
|
+
if (published.protocol !== "https:" || published.pathname !== "/ready" || !QUICK_TUNNEL_HOST.test(published.host))
|
|
137
|
+
return fail("bad-address");
|
|
138
|
+
gateway.setHost(published.host);
|
|
139
|
+
this.origin = published.origin;
|
|
140
|
+
// Gone by itself: every share's address was this host — they end, and the next share starts a new tunnel.
|
|
141
|
+
this.unsubscribe = result.handle.onUnexpectedExit(() => {
|
|
142
|
+
this.deps.log?.("tunnel exited");
|
|
143
|
+
this.origin = null;
|
|
144
|
+
this.shares.revoke("all");
|
|
145
|
+
});
|
|
146
|
+
this.deps.log?.("tunnel ready");
|
|
147
|
+
return { ok: true, origin: published.origin };
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
return fail(abort.signal.aborted ? "closed" : "unknown", err?.message);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
down(reason) {
|
|
154
|
+
if (!this.origin && !this.starting && !this.gateway)
|
|
155
|
+
return this.stopping ?? Promise.resolve();
|
|
156
|
+
this.origin = null;
|
|
157
|
+
this.abort?.abort();
|
|
158
|
+
this.abort = null;
|
|
159
|
+
this.unsubscribe?.();
|
|
160
|
+
this.unsubscribe = undefined;
|
|
161
|
+
this.gateway?.setHost(null);
|
|
162
|
+
this.gateway?.close();
|
|
163
|
+
this.gateway = null;
|
|
164
|
+
const stopping = this.stopping = (async () => {
|
|
165
|
+
await this.starting?.catch(() => { });
|
|
166
|
+
return this.deps.manager.stop(reason);
|
|
167
|
+
})().catch(() => { }).finally(() => { if (this.stopping === stopping)
|
|
168
|
+
this.stopping = null; });
|
|
169
|
+
return stopping;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=office-share-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"office-share-service.js","sourceRoot":"","sources":["../src/office-share-service.ts"],"names":[],"mappings":"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"}
|