@bongos/core 1.21.182 → 1.22.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.bongos-core.json +273 -248
- package/docs/copy-inventory.md +165 -165
- package/docs/copy-registry.json +184 -184
- package/docs/module-api-changelog.md +12 -0
- package/docs/page-inventory.json +35 -26
- package/docs/page-readings.json +389 -388
- package/modules/agents/lib/answer-hold.js +1 -1
- package/modules/agents/lib/fire-budget.js +1 -1
- package/modules/autonomy/cadence.js +3 -3
- package/modules/autonomy/config-idle.js +1 -1
- package/modules/autonomy/fence.js +1 -1
- package/modules/autonomy/gauge.js +2 -2
- package/modules/autonomy/governor-docket.js +0 -1
- package/modules/autonomy/server-schedule.js +1 -1
- package/modules/builder-settings/builder-needs.js +1 -3
- package/modules/builder-settings/event-sound-prefs.js +0 -1
- package/modules/builder-settings/law-locks.js +0 -1
- package/modules/builder-settings/model-alloc-prefs.js +0 -5
- package/modules/builder-settings/profile-nudge-prefs.js +0 -1
- package/modules/builder-settings/render-prefs.js +0 -1
- package/modules/builder-settings/skill-prefs.js +0 -2
- package/modules/builder-settings/sound-prefs.js +0 -3
- package/modules/builder-settings/wandering-prefs.js +0 -2
- package/modules/copy-desk/artist-stats.js +1 -1
- package/modules/copy-desk/flags.js +1 -1
- package/modules/copy-desk/guarded-lines.js +1 -1
- package/modules/copy-desk/page-status.js +0 -5
- package/modules/copy-desk/proposals.js +0 -2
- package/modules/copy-desk/registry.js +1 -1
- package/modules/copy-desk/stuck-tweaks.js +1 -1
- package/modules/economy/credits-by-craft.js +0 -2
- package/modules/economy/streak.js +0 -3
- package/modules/government/asks-db.js +1 -1
- package/modules/government/asks.js +0 -1
- package/modules/government/decision-board.js +0 -1
- package/modules/government/docket.js +0 -6
- package/modules/government/leads.js +0 -1
- package/modules/government/positions.js +1 -1
- package/modules/government/recommendations.js +0 -3
- package/modules/government/routing.js +1 -1
- package/modules/government/treasury-db.js +1 -1
- package/modules/government/treasury.js +2 -2
- package/modules/grading/grade-engine.js +0 -1
- package/modules/hall-ui/public/approval-queue.js +3 -3
- package/modules/hall-ui/public/atlas.html +2 -1
- package/modules/hall-ui/public/atlas.js +1 -1
- package/modules/hall-ui/public/blockers.html +3 -4
- package/modules/hall-ui/public/board-room.html +2 -2
- package/modules/hall-ui/public/brand-holes.js +3 -3
- package/modules/hall-ui/public/city.html +2 -1
- package/modules/hall-ui/public/collab.html +2 -2
- package/modules/hall-ui/public/commands.html +2 -2
- package/modules/hall-ui/public/commands.js +1 -2
- package/modules/hall-ui/public/copy-desk.html +2 -2
- package/modules/hall-ui/public/core-move-notice.js +1 -5
- package/modules/hall-ui/public/craft-mode.js +1 -5
- package/modules/hall-ui/public/criterion-uat-ui.js +3 -3
- package/modules/hall-ui/public/deploy.html +2 -2
- package/modules/hall-ui/public/diagrams.html +2 -1
- package/modules/hall-ui/public/dom-utils.js +15 -6
- package/modules/hall-ui/public/drachmae.html +2 -1
- package/modules/hall-ui/public/fleet-costs.js +3 -2
- package/modules/hall-ui/public/fleet.html +2 -2
- package/modules/hall-ui/public/founding-mark.js +1 -6
- package/modules/hall-ui/public/gate.html +2 -2
- package/modules/hall-ui/public/goal-map.html +2 -1
- package/modules/hall-ui/public/goals.html +2 -2
- package/modules/hall-ui/public/government.html +2 -2
- package/modules/hall-ui/public/hall-ask.js +3 -3
- package/modules/hall-ui/public/hall-kit.js +3 -5
- package/modules/hall-ui/public/hall-visual.js +3 -5
- package/modules/hall-ui/public/idea.html +2 -2
- package/modules/hall-ui/public/ideas.html +2 -2
- package/modules/hall-ui/public/index.html +2 -2
- package/modules/hall-ui/public/lightbulb.js +1 -5
- package/modules/hall-ui/public/md-reader.js +1 -8
- package/modules/hall-ui/public/modules.html +2 -2
- package/modules/hall-ui/public/my-agents.html +2 -2
- package/modules/hall-ui/public/my-agents.js +3 -1
- package/modules/hall-ui/public/page-notes.js +1 -5
- package/modules/hall-ui/public/paintbrush.js +1 -5
- package/modules/hall-ui/public/palette.js +1 -5
- package/modules/hall-ui/public/primer.html +2 -1
- package/modules/hall-ui/public/primer.js +1 -1
- package/modules/hall-ui/public/profile-crafts.js +3 -5
- package/modules/hall-ui/public/profile.html +2 -3
- package/modules/hall-ui/public/project-settings.html +2 -2
- package/modules/hall-ui/public/ranks.html +2 -3
- package/modules/hall-ui/public/roadmap.html +2 -2
- package/modules/hall-ui/public/roster.html +3 -4
- package/modules/hall-ui/public/sessions.html +2 -3
- package/modules/hall-ui/public/settings.html +2 -3
- package/modules/hall-ui/public/shell.js +1 -5
- package/modules/hall-ui/public/sky-data.js +1 -1
- package/modules/hall-ui/public/street.html +2 -1
- package/modules/hall-ui/public/studio.html +2 -2
- package/modules/hall-ui/public/task-detail.js +1 -6
- package/modules/hall-ui/public/task-lib.js +3 -8
- package/modules/hall-ui/public/task.html +2 -3
- package/modules/hall-ui/public/thinking.html +2 -1
- package/modules/hall-ui/public/tweak-editor.html +2 -2
- package/modules/hall-ui/public/vote-control.js +1 -1
- package/modules/hall-ui/public/watch.html +2 -3
- package/modules/hall-ui/public/welcome-boot.js +3 -5
- package/modules/hall-ui/public/work.html +2 -3
- package/modules/ideas/completeness.js +1 -1
- package/modules/ideas/descent.js +0 -1
- package/modules/ideas/governor-docket.js +0 -2
- package/modules/ideas/idea-state.js +0 -1
- package/modules/ideas/ideator-stats.js +1 -1
- package/modules/ideas/votes.js +1 -1
- package/modules/lifecycle/autopickup-files.js +0 -3
- package/modules/lifecycle/conflict-resolve.js +0 -1
- package/modules/lifecycle/criterion-uat-db.js +0 -4
- package/modules/lifecycle/dead-deps.js +2 -2
- package/modules/lifecycle/est-advisory.js +1 -1
- package/modules/lifecycle/goal-category.js +0 -3
- package/modules/lifecycle/goal-spec-task.js +1 -1
- package/modules/lifecycle/governor-docket.js +0 -1
- package/modules/lifecycle/kickoff-seed.js +1 -1
- package/modules/lifecycle/mingle.js +3 -3
- package/modules/lifecycle/page-tweak-claim.js +1 -1
- package/modules/lifecycle/rebase-gate.js +1 -1
- package/modules/lifecycle/removal-derivation.js +0 -1
- package/modules/lifecycle/routes/abandon-handler.js +1 -1
- package/modules/lifecycle/routes/version-route-authz.js +0 -1
- package/modules/lifecycle/ship-card.js +2 -5
- package/modules/lifecycle/ship-preflight.js +0 -1
- package/modules/lifecycle/sky.js +1 -1
- package/modules/lifecycle/task-classifier.js +0 -1
- package/modules/lifecycle/task-visuals.js +0 -2
- package/modules/lifecycle/version-close.js +0 -1
- package/modules/memory/memory.js +0 -1
- package/modules/memory/search-chunker.js +1 -1
- package/modules/memory/search.js +0 -3
- package/modules/npm-release/preview/divert.js +1 -1
- package/modules/npm-release/preview/proxy.js +2 -3
- package/modules/npm-release/preview/runtime.js +1 -1
- package/modules/npm-release/public/task-widget.js +1 -1
- package/modules/onboarding/founding-builders.js +1 -1
- package/modules/onboarding/founding-mode.js +1 -1
- package/modules/onboarding/howto-guide.js +1 -1
- package/modules/onboarding/howto-state.js +1 -1
- package/modules/onboarding/onboarding-state.js +0 -4
- package/modules/onboarding/onboarding.js +0 -6
- package/modules/page-notes/notes.js +0 -1
- package/modules/platform-identity/community-leaderboard.js +0 -1
- package/modules/platform-identity/hub-keys.js +0 -2
- package/modules/platform-identity/instance-feedback.js +0 -1
- package/modules/platform-identity/read-rate-limit.js +1 -1
- package/modules/platform-identity/routes/sso.js +1 -3
- package/modules/platform-identity/visibility-pull.js +0 -9
- package/modules/provisioning/app-status.js +1 -1
- package/modules/provisioning/catalog-bridge.js +0 -1
- package/modules/provisioning/core-upgrade.js +1 -1
- package/modules/provisioning/credential-preflight.js +1 -1
- package/modules/provisioning/demo.js +2 -2
- package/modules/provisioning/look.js +1 -1
- package/modules/provisioning/routes/callback-page.js +3 -7
- package/modules/public-landing/public/projects.html +3 -5
- package/modules/raise/raise.js +2 -2
- package/modules/render-deploy/deploys.js +1 -1
- package/modules/security/artifact-scan/aggregate.js +0 -4
- package/modules/security/artifact-scan/detectors/capabilities.js +1 -1
- package/modules/security/artifact-scan/detectors/config-obfuscation.js +1 -1
- package/modules/security/artifact-scan/detectors/credentials.js +1 -1
- package/modules/security/artifact-scan/detectors/dependencies.js +1 -1
- package/modules/security/artifact-scan/detectors/injection.js +1 -1
- package/modules/security/artifact-scan/detectors/network.js +1 -1
- package/modules/security/artifact-scan/detectors/npm-lifecycle.js +1 -1
- package/modules/security/artifact-scan/detectors/permissions.js +1 -1
- package/modules/security/artifact-scan/detectors/shared.js +0 -3
- package/modules/security/artifact-scan/floor.js +0 -3
- package/modules/security/artifact-scan/mirror.js +1 -1
- package/modules/security/artifact-scan/quarantine.js +0 -1
- package/modules/security/artifact-scan/rebuild-spec.js +0 -2
- package/modules/security/artifact-scan/report.js +1 -1
- package/modules/security/artifact-scan/sanitize.js +0 -2
- package/modules/security/secret-scrub.js +0 -4
- package/modules/security/security.js +0 -2
- package/modules/sessions/accessibility.js +0 -2
- package/modules/sessions/bfg.js +0 -4
- package/modules/sessions/upload-health.js +0 -3
- package/modules/specialities/db.js +1 -1
- package/modules/specialities/specialities.js +1 -1
- package/modules/ui-design/kit/lib.js +2 -2
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/release-notes.json +26 -12
- package/scripts/bongos/escape-helper-guard.js +147 -0
- package/scripts/bongos/fitness.js +3 -2
- package/scripts/bongos/key-card.js +1 -4
- package/scripts/bongos/review-sheet.js +1 -3
- package/scripts/bongos/start.js +1 -1
- package/scripts/bongos/status.js +1 -1
- package/scripts/gds/escape-helper-guard.js +6 -0
- package/scripts/status-mirror-sync.js +2 -3
- package/src/bongos/module-scope-map.js +1 -0
- package/src/bongos/platform-visibility-gate.js +2 -3
- package/src/bongos/prelaunch-gate.js +2 -3
- package/src/bongos/routes/auth.js +1 -5
- package/src/bongos/serve-internal.js +2 -6
- package/src/html-escape.js +26 -0
- package/src/module-api.js +9 -1
- package/tests/blockers_kit_pager.mjs +2 -2
- package/tests/blockers_page_ui.mjs +2 -2
- package/tests/core_move_notice.mjs +3 -1
- package/tests/core_update_banner.mjs +2 -0
- package/tests/core_upgrade_owner_door.mjs +2 -0
- package/tests/craft_mode.mjs +2 -0
- package/tests/craft_mode_nav.mjs +3 -0
- package/tests/craft_review_mode.mjs +3 -2
- package/tests/criterion_ref_status.mjs +7 -2
- package/tests/curve_kind_overlay.mjs +2 -1
- package/tests/founding_mode.mjs +10 -2
- package/tests/github_install_nudge.mjs +4 -1
- package/tests/goal_map_page.mjs +2 -2
- package/tests/hall_approval_queue.mjs +2 -2
- package/tests/hall_city.mjs +1 -1
- package/tests/hall_fullscreen.mjs +2 -0
- package/tests/hall_gov_real_site.mjs +2 -0
- package/tests/hall_kit_charts.mjs +2 -1
- package/tests/hall_my_agents.mjs +3 -2
- package/tests/hall_nav.mjs +2 -0
- package/tests/hall_palette.mjs +2 -2
- package/tests/hall_reading_world.mjs +3 -1
- package/tests/hall_reference_world.mjs +2 -1
- package/tests/hall_signout.mjs +2 -0
- package/tests/hall_street.mjs +1 -1
- package/tests/hall_studio_world.mjs +3 -1
- package/tests/hall_tweak_editor.mjs +2 -1
- package/tests/helpers.mjs +17 -2
- package/tests/html_escape.mjs +149 -0
- package/tests/lightbulb.mjs +2 -0
- package/tests/module_api.mjs +1 -0
- package/tests/module_store_howto.mjs +2 -1
- package/tests/modules_external_export_contract.mjs +48 -0
- package/tests/nav_permission_atoms.mjs +1 -1
- package/tests/npm_release_where.mjs +2 -1
- package/tests/page_notes_panel.mjs +4 -3
- package/tests/paintbrush.mjs +2 -1
- package/tests/profile_connections_ui.mjs +2 -1
- package/tests/profile_role_headline.mjs +2 -2
- package/tests/profile_role_tabs.mjs +2 -2
- package/tests/projects_hub_repo_private.mjs +4 -0
- package/tests/terms_acceptance.mjs +1 -0
- package/tests/welcome_boot_browser.mjs +1 -1
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
// public-builders/dom-utils.js — shared frontend toolkit for the builders' hall
|
|
2
2
|
// (GDS-V4 C4 / task 1088). Loaded as the FIRST hall <script> on each page so the
|
|
3
3
|
// per-page IIFEs can pull these from one place instead of redefining them.
|
|
4
|
-
// Attaches a single global, `window.OTB
|
|
4
|
+
// Attaches a single global, `window.OTB` (and is its module.exports under Node).
|
|
5
|
+
//
|
|
6
|
+
// escapeHtml here is THE browser HTML escaper (task 1004876): every hall script
|
|
7
|
+
// — and the landing's projects page — escapes user text through it, and the
|
|
8
|
+
// fitness check scripts/bongos/escape-helper-guard.js fails on a third copy and
|
|
9
|
+
// on any hall page that does not load this file first, without defer.
|
|
5
10
|
//
|
|
6
11
|
// NOT a consumer: modules/status-ui/public/ (the off-box status mirror) stays
|
|
7
12
|
// self-contained by design — do not wire this there. Network helpers
|
|
@@ -19,11 +24,11 @@
|
|
|
19
24
|
(() => {
|
|
20
25
|
'use strict';
|
|
21
26
|
|
|
22
|
-
// HTML-escape for text interpolated into innerHTML
|
|
27
|
+
// HTML-escape for text interpolated into innerHTML: & < > " ' ; null/undefined → ''.
|
|
28
|
+
// The server twin is src/html-escape.js; tests/html_escape.mjs holds them equal.
|
|
29
|
+
const ESCAPES = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' };
|
|
23
30
|
function escapeHtml(s) {
|
|
24
|
-
return String(s ?? '').replace(/[&<>"']/g, (c) =>
|
|
25
|
-
'&': '&', '<': '<', '>': '>', '"': '"', "'": ''',
|
|
26
|
-
}[c]));
|
|
31
|
+
return String(s ?? '').replace(/[&<>"']/g, (c) => ESCAPES[c]);
|
|
27
32
|
}
|
|
28
33
|
|
|
29
34
|
// querySelector shorthand. (7 copies; pair.js's single-arg form is a subset.)
|
|
@@ -460,7 +465,7 @@
|
|
|
460
465
|
} catch (err) { return null; }
|
|
461
466
|
}
|
|
462
467
|
|
|
463
|
-
|
|
468
|
+
const OTB = {
|
|
464
469
|
escapeHtml, $, fmtNum, num, fmtInt, fmtCompact, fmtDate, rankLabel, toast, moduleOn, disciplines,
|
|
465
470
|
// task 1003936 — ONE word for the role axis, all six surfaces
|
|
466
471
|
roleAxisLabel, roleLabel, roleWord, roleOptions, roleIsUnset, ROLE_UNSET,
|
|
@@ -472,4 +477,8 @@
|
|
|
472
477
|
categoryChip, // task 1003276 — shared by the Goals page, the Tasks board and the task page
|
|
473
478
|
hubOrigin, // task 1003485 — the hub account page's origin, for Settings and the profile nudge
|
|
474
479
|
};
|
|
480
|
+
if (typeof window !== 'undefined') window.OTB = OTB;
|
|
481
|
+
// Node: the hall libs that also load under require() (hall-kit.js, task-lib.js, …)
|
|
482
|
+
// escape through this same function there (task 1004876).
|
|
483
|
+
if (typeof module !== 'undefined' && module.exports) module.exports = OTB;
|
|
475
484
|
})();
|
|
@@ -94,9 +94,10 @@
|
|
|
94
94
|
|
|
95
95
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
96
96
|
|
|
97
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
97
98
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
98
99
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
99
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
100
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
100
101
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
101
102
|
<script src="/builders/palette.js" defer></script>
|
|
102
103
|
<script src="/builders/md-reader.js?v=2026-09-02-mdreader-2"></script>
|
|
@@ -20,8 +20,9 @@
|
|
|
20
20
|
'co-tenant': 'Shared server (retired)',
|
|
21
21
|
};
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
// The shared escaper: window.OTB in the page; under Node (this file is also require()d as a
|
|
24
|
+
// CommonJS lib — see its module.exports and its tests) dom-utils.js's own export (task 1004876).
|
|
25
|
+
const esc = (s) => (typeof window !== 'undefined' ? window.OTB : require('./dom-utils.js')).escapeHtml(s);
|
|
25
26
|
const isPriced = (v) => typeof v === 'number' && Number.isFinite(v);
|
|
26
27
|
const quiet = (text) => `<span class="ledger__est">${text}</span>`;
|
|
27
28
|
|
|
@@ -55,11 +55,11 @@
|
|
|
55
55
|
|
|
56
56
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
57
57
|
|
|
58
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
58
59
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
59
60
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
60
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
61
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
61
62
|
<script src="/builders/palette.js" defer></script>
|
|
62
|
-
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
63
63
|
<script src="/builders/hall-kit.js"></script>
|
|
64
64
|
<script src="/builders/fleet-costs.js"></script>
|
|
65
65
|
<script src="/builders/fleet.js"></script>
|
|
@@ -18,12 +18,7 @@
|
|
|
18
18
|
charter: 'charter', legalize: 'legalize', legislation: 'legislation',
|
|
19
19
|
};
|
|
20
20
|
|
|
21
|
-
function esc(s) {
|
|
22
|
-
if (window.OTB && typeof window.OTB.escapeHtml === 'function') return window.OTB.escapeHtml(s);
|
|
23
|
-
return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) {
|
|
24
|
-
return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c];
|
|
25
|
-
});
|
|
26
|
-
}
|
|
21
|
+
function esc(s) { return window.OTB.escapeHtml(s); }
|
|
27
22
|
|
|
28
23
|
// One request per page, shared by every surface on it. Any failure (signed out, the
|
|
29
24
|
// onboarding module off, a network blip) is an empty list: no marks, today's page.
|
|
@@ -62,12 +62,12 @@
|
|
|
62
62
|
|
|
63
63
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
64
64
|
|
|
65
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
65
66
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
66
67
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
67
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
68
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
68
69
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
69
70
|
<script src="/builders/palette.js" defer></script>
|
|
70
|
-
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
71
71
|
<script src="/builders/hall-kit.js"></script>
|
|
72
72
|
<script src="/builders/gate.js?v=2026-10-25-autobongos"></script>
|
|
73
73
|
</body>
|
|
@@ -137,9 +137,10 @@
|
|
|
137
137
|
</div>
|
|
138
138
|
</div>
|
|
139
139
|
|
|
140
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
140
141
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
141
142
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
142
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
143
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
143
144
|
<script src="/builders/palette.js" defer></script>
|
|
144
145
|
|
|
145
146
|
<script src="/builders/idea-objects.js?v=2026-09-27-split"></script>
|
|
@@ -234,12 +234,12 @@
|
|
|
234
234
|
|
|
235
235
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
236
236
|
|
|
237
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
237
238
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
238
239
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
239
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
240
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
240
241
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
241
242
|
<script src="/builders/palette.js" defer></script>
|
|
242
|
-
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
243
243
|
<!-- task 1004727: the ONE karma vote control every task/idea list renders -->
|
|
244
244
|
<script src="/builders/vote-control.js"></script>
|
|
245
245
|
<!-- shared component kit (window.OTBKit) — pager, filter bar, tabs, empty/skeleton (task 2166). -->
|
|
@@ -132,12 +132,12 @@
|
|
|
132
132
|
|
|
133
133
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
134
134
|
|
|
135
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
135
136
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
136
137
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
137
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
138
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
138
139
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
139
140
|
<script src="/builders/palette.js" defer></script>
|
|
140
|
-
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
141
141
|
<script src="/builders/hall-kit.js"></script>
|
|
142
142
|
<!-- task 1003761: the vocabulary this page and /board-room both speak. Must load
|
|
143
143
|
BEFORE government.js, which destructures window.OTBBoardLib at IIFE entry. -->
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
// Every string is escaped here; `saidHtml` is the one pre-built slot, for a
|
|
17
17
|
// caller whose facts are already escaped markup (blockerFacts).
|
|
18
18
|
(function () {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
// The shared escaper: window.OTB in the page; under Node (this file is also require()d as a
|
|
20
|
+
// CommonJS lib — see its module.exports and its tests) dom-utils.js's own export (task 1004876).
|
|
21
|
+
const esc = (s) => (typeof window !== 'undefined' ? window.OTB : require('./dom-utils.js')).escapeHtml(s);
|
|
22
22
|
const attrsOf = (a) => Object.keys(a || {})
|
|
23
23
|
.filter((k) => a[k] != null && a[k] !== false)
|
|
24
24
|
.map((k) => ` ${k}="${esc(a[k])}"`).join('');
|
|
@@ -27,11 +27,9 @@
|
|
|
27
27
|
'use strict';
|
|
28
28
|
|
|
29
29
|
// HTML-escape for text interpolated into innerHTML.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}[c]));
|
|
34
|
-
}
|
|
30
|
+
// The shared escaper: window.OTB in the page; under Node (this file is also require()d as a
|
|
31
|
+
// CommonJS lib — see its module.exports and its tests) dom-utils.js's own export (task 1004876).
|
|
32
|
+
function esc(s) { return (typeof window !== 'undefined' ? window.OTB : require('./dom-utils.js')).escapeHtml(s); }
|
|
35
33
|
const $id = (id) => document.getElementById(id);
|
|
36
34
|
|
|
37
35
|
// ---- pager ----------------------------------------------------------------
|
|
@@ -27,11 +27,9 @@
|
|
|
27
27
|
'use strict';
|
|
28
28
|
|
|
29
29
|
// HTML-escape for text interpolated into innerHTML.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}[c]));
|
|
34
|
-
}
|
|
30
|
+
// The shared escaper: window.OTB in the page; under Node (this file is also require()d as a
|
|
31
|
+
// CommonJS lib — see its module.exports and its tests) dom-utils.js's own export (task 1004876).
|
|
32
|
+
function esc(s) { return (typeof window !== 'undefined' ? window.OTB : require('./dom-utils.js')).escapeHtml(s); }
|
|
35
33
|
|
|
36
34
|
// Same-origin, SERVER-MINTED paths only. The URL arrives from our own API, but
|
|
37
35
|
// it lands in an href and a src, so it is matched literally against the shape
|
|
@@ -50,11 +50,11 @@
|
|
|
50
50
|
|
|
51
51
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
52
52
|
|
|
53
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
53
54
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
54
55
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
55
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
56
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
56
57
|
<script src="/builders/palette.js" defer></script>
|
|
57
|
-
<script src="/builders/dom-utils.js?v=2026-06-23-contrib" defer></script>
|
|
58
58
|
<!-- task-detail.js still owns the #/idea/N and #/blocker/N overlay, so a ref
|
|
59
59
|
written inside an idea's own prose keeps resolving from this page. -->
|
|
60
60
|
<script src="/builders/task-detail.js?v=2026-07-03-taskdetail2" defer></script>
|
|
@@ -225,11 +225,11 @@
|
|
|
225
225
|
|
|
226
226
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
227
227
|
|
|
228
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
228
229
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
229
230
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
230
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
231
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
231
232
|
<script src="/builders/palette.js" defer></script>
|
|
232
|
-
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
233
233
|
<!-- task 1004727: the ONE karma vote control every task/idea list renders -->
|
|
234
234
|
<script src="/builders/vote-control.js"></script>
|
|
235
235
|
<!-- task 1003069 (R08) — the quick-filing form's routed result links a task
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
/ ADR 0069 — no client lib to load (EventSource is built into the browser). -->
|
|
107
107
|
<!-- shared frontend toolkit (window.OTB) — loaded FIRST so every consuming
|
|
108
108
|
IIFE below can pull escapeHtml/$/fmtNum/... from one place. -->
|
|
109
|
-
<script src="/builders/dom-utils.js?v=2026-
|
|
109
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
110
110
|
<script src="/builders/task-detail.js?v=2026-07-03-taskdetail" defer></script>
|
|
111
111
|
<!-- R56 (task 1195): apply the instance currency label from window.__BRANDING__
|
|
112
112
|
to [data-currency-label]/[data-currency-tmpl] markup + expose OTBBranding.
|
|
@@ -119,7 +119,7 @@
|
|
|
119
119
|
<script src="/builders/welcome-boot.js?v=2026-10-23-city1" defer></script>
|
|
120
120
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab" defer></script>
|
|
121
121
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3" defer></script>
|
|
122
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
122
|
+
<script src="/builders/shell.js?v=2026-10-25-escape" defer></script>
|
|
123
123
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
124
124
|
<script src="/builders/palette.js" defer></script>
|
|
125
125
|
<!-- task 2166: the shared component kit (window.OTBKit) — pager/ledger/rail.
|
|
@@ -20,11 +20,7 @@
|
|
|
20
20
|
|
|
21
21
|
var sheet = null, returnFocus = null, saveTimer = null, busy = false;
|
|
22
22
|
|
|
23
|
-
function esc(s) {
|
|
24
|
-
return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) {
|
|
25
|
-
return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c];
|
|
26
|
-
});
|
|
27
|
-
}
|
|
23
|
+
function esc(s) { return window.OTB.escapeHtml(s); }
|
|
28
24
|
function plural(n, one, many) { return n + ' ' + (n === 1 ? one : many); }
|
|
29
25
|
function day(iso) {
|
|
30
26
|
var d = iso ? new Date(iso) : null;
|
|
@@ -21,14 +21,7 @@
|
|
|
21
21
|
(function () {
|
|
22
22
|
'use strict';
|
|
23
23
|
|
|
24
|
-
function escapeHtml(s) {
|
|
25
|
-
return String(s)
|
|
26
|
-
.replace(/&/g, '&')
|
|
27
|
-
.replace(/</g, '<')
|
|
28
|
-
.replace(/>/g, '>')
|
|
29
|
-
.replace(/"/g, '"')
|
|
30
|
-
.replace(/'/g, ''');
|
|
31
|
-
}
|
|
24
|
+
function escapeHtml(s) { return window.OTB.escapeHtml(s); }
|
|
32
25
|
|
|
33
26
|
// Stable slug for heading anchors — lowercase, strip punctuation, dash-join.
|
|
34
27
|
// Matches the primer's slugify so in-doc anchor links behave identically.
|
|
@@ -125,12 +125,12 @@
|
|
|
125
125
|
|
|
126
126
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
127
127
|
|
|
128
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
128
129
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
129
130
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
130
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
131
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
131
132
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
132
133
|
<script src="/builders/palette.js" defer></script>
|
|
133
|
-
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
134
134
|
<script src="/builders/brand-apply.js"></script>
|
|
135
135
|
<script src="/builders/hall-kit.js"></script>
|
|
136
136
|
<script src="/builders/md-reader.js"></script>
|
|
@@ -59,12 +59,12 @@
|
|
|
59
59
|
|
|
60
60
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
61
61
|
|
|
62
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
62
63
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
63
64
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
64
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
65
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
65
66
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
66
67
|
<script src="/builders/palette.js" defer></script>
|
|
67
|
-
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
68
68
|
<script src="/builders/gov-living.js?v=2026-10-10-real1"></script>
|
|
69
69
|
<script src="/builders/gov-positions.js?v=2026-10-09-positions1"></script>
|
|
70
70
|
<script src="/builders/my-agents.js?v=2026-10-17-tidy"></script>
|
|
@@ -310,7 +310,9 @@
|
|
|
310
310
|
const API = '/api/bongos';
|
|
311
311
|
const api = root.BongosClient.createClient({ baseUrl: '', credentials: 'same-origin', throwOnError: false });
|
|
312
312
|
const $ = (id) => document.getElementById(id);
|
|
313
|
-
|
|
313
|
+
// The shared escaper: window.OTB in the page; under Node (this file is also require()d as a
|
|
314
|
+
// CommonJS lib — see its module.exports and its tests) dom-utils.js's own export (task 1004876).
|
|
315
|
+
const esc = (s) => (typeof window !== 'undefined' ? window.OTB : require('./dom-utils.js')).escapeHtml(s);
|
|
314
316
|
const toast = (msg) => { if (root.OTB && root.OTB.toast) root.OTB.toast(msg); };
|
|
315
317
|
const brand = root.__BRANDING__ || {};
|
|
316
318
|
const PROJECT = (brand.identity && (brand.identity.productName || brand.identity.worldName)) || 'The project';
|
|
@@ -21,11 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
var sheet = null, returnFocus = null, state = null, saveTimer = null, pollTimer = null, docked = false;
|
|
23
23
|
|
|
24
|
-
function esc(s) {
|
|
25
|
-
return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) {
|
|
26
|
-
return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c];
|
|
27
|
-
});
|
|
28
|
-
}
|
|
24
|
+
function esc(s) { return window.OTB.escapeHtml(s); }
|
|
29
25
|
// Where the panel is open. The hall needs no setting; the public site's
|
|
30
26
|
// Artist review button (task 1004499, artist-review.js) calls
|
|
31
27
|
// configure({ surface: 'site', hall: <the hall's origin> }) before it opens.
|
|
@@ -43,11 +43,7 @@
|
|
|
43
43
|
|
|
44
44
|
var bar = null, st = null;
|
|
45
45
|
|
|
46
|
-
function esc(s) {
|
|
47
|
-
return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) {
|
|
48
|
-
return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c];
|
|
49
|
-
});
|
|
50
|
-
}
|
|
46
|
+
function esc(s) { return window.OTB.escapeHtml(s); }
|
|
51
47
|
function tidy(s) { return String(s == null ? '' : s).replace(/\s+/g, ' ').trim(); }
|
|
52
48
|
function plural(n, one, many) { return n + ' ' + (n === 1 ? one : many); }
|
|
53
49
|
function clip(s, n) { s = tidy(s); return s.length > n ? s.slice(0, n - 1) + '…' : s; }
|
|
@@ -105,11 +105,7 @@
|
|
|
105
105
|
var searchAbort = null; // the in-flight request's AbortController, if the runtime has one
|
|
106
106
|
var searchCache = {}; // query (trimmed+lowercased) -> raw hits[], this OPEN only
|
|
107
107
|
|
|
108
|
-
function esc(s) {
|
|
109
|
-
return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) {
|
|
110
|
-
return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c];
|
|
111
|
-
});
|
|
112
|
-
}
|
|
108
|
+
function esc(s) { return window.OTB.escapeHtml(s); }
|
|
113
109
|
function visible(id) {
|
|
114
110
|
var el = document.getElementById(id);
|
|
115
111
|
return !!(el && !el.hidden);
|
|
@@ -110,9 +110,10 @@
|
|
|
110
110
|
|
|
111
111
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
112
112
|
|
|
113
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
113
114
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
114
115
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
115
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
116
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
116
117
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
117
118
|
<script src="/builders/palette.js" defer></script>
|
|
118
119
|
<!-- the shared markdown reader (window.OTBMdReader) — primer.js renders through
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
function $(sel) { return document.querySelector(sel); }
|
|
56
56
|
|
|
57
57
|
const MD = window.OTBMdReader;
|
|
58
|
-
const escapeHtml = (
|
|
58
|
+
const escapeHtml = (s) => window.OTB.escapeHtml(s); // task 1004876: the old fallback escaped nothing
|
|
59
59
|
|
|
60
60
|
// The shared resolver, plus the one rewrite that is the primer's alone: the
|
|
61
61
|
// economy doc has an in-hall reader page (task 1472), so a link to it stays in
|
|
@@ -33,11 +33,9 @@
|
|
|
33
33
|
(function () {
|
|
34
34
|
'use strict';
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
}[c]));
|
|
40
|
-
}
|
|
36
|
+
// The shared escaper: window.OTB in the page; under Node (this file is also require()d as a
|
|
37
|
+
// CommonJS lib — see its module.exports and its tests) dom-utils.js's own export (task 1004876).
|
|
38
|
+
function esc(s) { return (typeof window !== 'undefined' ? window.OTB : require('./dom-utils.js')).escapeHtml(s); }
|
|
41
39
|
function objects() {
|
|
42
40
|
return (typeof window !== 'undefined' && window.OTBIdeaObjects) || null;
|
|
43
41
|
}
|
|
@@ -205,13 +205,12 @@
|
|
|
205
205
|
|
|
206
206
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
207
207
|
chrome exists before the page script runs. -->
|
|
208
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
208
209
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
209
210
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
210
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
211
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
211
212
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
212
213
|
<script src="/builders/palette.js" defer></script>
|
|
213
|
-
<!-- shared frontend toolkit (window.OTB) — loaded before profile.js, which pulls from it. -->
|
|
214
|
-
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
215
214
|
<!-- task 1004727: the ONE karma vote control every task/idea list renders -->
|
|
216
215
|
<script src="/builders/vote-control.js"></script>
|
|
217
216
|
<script src="/builders/brand-apply.js?v=2026-06-27-r75"></script>
|
|
@@ -69,12 +69,12 @@
|
|
|
69
69
|
|
|
70
70
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
71
71
|
|
|
72
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
72
73
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
73
74
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
74
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
75
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
75
76
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
76
77
|
<script src="/builders/palette.js" defer></script>
|
|
77
|
-
<script src="/builders/dom-utils.js?v=2026-06-16-gate"></script>
|
|
78
78
|
<script src="/builders/hall-kit.js"></script>
|
|
79
79
|
<script src="/builders/project-settings.js?v=2026-10-08-ship-mode"></script>
|
|
80
80
|
</body>
|
|
@@ -71,13 +71,12 @@
|
|
|
71
71
|
|
|
72
72
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
73
73
|
chrome exists before the page script runs. -->
|
|
74
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
74
75
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
75
76
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
76
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
77
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
77
78
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
78
79
|
<script src="/builders/palette.js" defer></script>
|
|
79
|
-
<!-- shared frontend toolkit (window.OTB) — loaded before ranks.js, which pulls from it. -->
|
|
80
|
-
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
81
80
|
<script src="/builders/founding-mark.js?v=2026-09-30-founding"></script>
|
|
82
81
|
<script src="/builders/ranks.js?v=2026-09-30-founding"></script>
|
|
83
82
|
</body>
|
|
@@ -41,12 +41,12 @@
|
|
|
41
41
|
|
|
42
42
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
43
43
|
|
|
44
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
44
45
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
45
46
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
46
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
47
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
47
48
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
48
49
|
<script src="/builders/palette.js" defer></script>
|
|
49
|
-
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
50
50
|
<!-- The chart kit and the timeline's series builders (task 1003447). Both MUST
|
|
51
51
|
precede roadmap.js: the page reads window.OTBKit / window.OTBRoadmapTimeline
|
|
52
52
|
at render time, so loading either after would be a blank section in
|
|
@@ -53,14 +53,13 @@
|
|
|
53
53
|
|
|
54
54
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
55
55
|
chrome exists before the page script runs. -->
|
|
56
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
56
57
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
57
58
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
58
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
59
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
59
60
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
60
61
|
<script src="/builders/palette.js" defer></script>
|
|
61
|
-
<!--
|
|
62
|
-
branding pack's currency label, loaded BEFORE roster.js. -->
|
|
63
|
-
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
62
|
+
<!-- the branding pack's currency label, loaded BEFORE roster.js. -->
|
|
64
63
|
<script src="/builders/brand-apply.js"></script>
|
|
65
64
|
<script src="/builders/hall-kit.js"></script>
|
|
66
65
|
<script src="/builders/founding-mark.js?v=2026-09-30-founding"></script>
|
|
@@ -109,13 +109,12 @@
|
|
|
109
109
|
|
|
110
110
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
111
111
|
chrome exists before the page script runs. -->
|
|
112
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
112
113
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
113
114
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
114
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
115
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
115
116
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
116
117
|
<script src="/builders/palette.js" defer></script>
|
|
117
|
-
<!-- shared frontend toolkit (window.OTB) — loaded BEFORE sessions.js so it can pull from it. -->
|
|
118
|
-
<script src="/builders/dom-utils.js?v=2026-06-14-domutils"></script>
|
|
119
118
|
<script src="/builders/task-detail.js?v=2026-07-03-taskdetail"></script>
|
|
120
119
|
<!-- The shared component kit — the pager contract this page now uses instead of
|
|
121
120
|
its own (task 1003279-sibling follow-up of 1003281). Must load BEFORE
|
|
@@ -470,13 +470,12 @@
|
|
|
470
470
|
|
|
471
471
|
<!-- The app shell (sidebar + top bar). Dependency-free; loaded FIRST so the
|
|
472
472
|
chrome exists before the page scripts run. -->
|
|
473
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
473
474
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
474
475
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
475
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
476
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
476
477
|
<!-- jump palette (Ctrl/Cmd-K). Optional by design: without it the shell's slot stays hidden. -->
|
|
477
478
|
<script src="/builders/palette.js" defer></script>
|
|
478
|
-
<!-- shared frontend toolkit (window.OTB) — loaded before consuming IIFEs. -->
|
|
479
|
-
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
480
479
|
<!-- shared component kit (window.OTBKit) — section rail (task 2166). -->
|
|
481
480
|
<script src="/builders/hall-kit.js"></script>
|
|
482
481
|
<!-- shared record overlay (#/idea|blocker/N) — every hall page carries it; this
|
|
@@ -64,11 +64,7 @@
|
|
|
64
64
|
// builders.js owns these hashes (deep-link overlay) — never route them.
|
|
65
65
|
var DEEPLINK_RE = /^#\/(task|idea|blocker)\/(\d+)$/;
|
|
66
66
|
|
|
67
|
-
function esc(s) {
|
|
68
|
-
return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) {
|
|
69
|
-
return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c];
|
|
70
|
-
});
|
|
71
|
-
}
|
|
67
|
+
function esc(s) { return window.OTB.escapeHtml(s); }
|
|
72
68
|
function moduleOn(name) {
|
|
73
69
|
var m = window.__MODULES__;
|
|
74
70
|
if (!m || !m.enabled || !(name in m.enabled)) return true;
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
}
|
|
88
88
|
// esc — the prototype builds HTML strings, and every title, criterion and
|
|
89
89
|
// goal name passes through here first, so a title never becomes markup.
|
|
90
|
-
function esc(s) { return
|
|
90
|
+
function esc(s) { return window.OTB.escapeHtml(s); }
|
|
91
91
|
function fmtDate(iso) { if (!iso) return '—'; const d = new Date(iso); return d.toLocaleDateString('en-GB', { day: '2-digit', month: 'short' }).toLowerCase(); }
|
|
92
92
|
function fmtDay(t) { return new Date(t).toLocaleDateString('en-GB', { day: '2-digit', month: 'short', year: 'numeric' }).toLowerCase(); }
|
|
93
93
|
function ageDays(iso) { return iso ? (NOW - new Date(iso).getTime()) / 86400000 : 0; }
|
|
@@ -228,9 +228,10 @@
|
|
|
228
228
|
</div>
|
|
229
229
|
</div>
|
|
230
230
|
|
|
231
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
231
232
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
232
233
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
233
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
234
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
234
235
|
<script src="/builders/palette.js" defer></script>
|
|
235
236
|
<script src="/builders/gov-living.js?v=2026-10-09-positions1"></script>
|
|
236
237
|
<script src="/builders/gov-feeds.js?v=2026-10-09-living3"></script>
|
|
@@ -188,11 +188,11 @@
|
|
|
188
188
|
|
|
189
189
|
<div id="toast" class="toast" role="status" aria-live="polite" data-visible="0"></div>
|
|
190
190
|
|
|
191
|
+
<script src="/builders/dom-utils.js?v=2026-10-25-escape"></script>
|
|
191
192
|
<script src="/builders/shell-trail.js?v=2026-10-08-city-tab"></script>
|
|
192
193
|
<script src="/builders/craft-mode.js?v=2026-10-09-living3"></script>
|
|
193
|
-
<script src="/builders/shell.js?v=2026-10-25-
|
|
194
|
+
<script src="/builders/shell.js?v=2026-10-25-escape"></script>
|
|
194
195
|
<script src="/builders/palette.js" defer></script>
|
|
195
|
-
<script src="/builders/dom-utils.js?v=2026-06-23-contrib"></script>
|
|
196
196
|
<!-- The kit, for its ONE renderer: the full-size ship-time visual figure
|
|
197
197
|
(task 1003829), which the older reviews still show. -->
|
|
198
198
|
<script src="/builders/hall-visual.js?v=2026-09-16-visual1"></script>
|